summaryrefslogtreecommitdiffstats
path: root/test/pacman/pmpkg.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/pacman/pmpkg.py')
-rw-r--r--[-rwxr-xr-x]test/pacman/pmpkg.py110
1 files changed, 88 insertions, 22 deletions
diff --git a/test/pacman/pmpkg.py b/test/pacman/pmpkg.py
index be177f35..7aa77f6a 100755..100644
--- a/test/pacman/pmpkg.py
+++ b/test/pacman/pmpkg.py
@@ -20,6 +20,7 @@ import os
import tempfile
import stat
import shutil
+from StringIO import StringIO
import tarfile
import util
@@ -27,7 +28,7 @@ import util
class pmpkg(object):
"""Package object.
- Object holding data from an ArchLinux package.
+ Object holding data from an Arch Linux package.
"""
def __init__(self, name, version = "1.0-1"):
@@ -45,8 +46,10 @@ class pmpkg(object):
self.packager = ""
self.size = 0
self.csize = 0
+ self.isize = 0
self.reason = 0
self.md5sum = "" # sync only
+ self.pgpsig = "" # sync only
self.replaces = []
self.depends = []
self.optdepends = []
@@ -62,8 +65,9 @@ class pmpkg(object):
"pre_remove": "",
"post_remove": "",
"pre_upgrade": "",
- "post_upgrade": ""
+ "post_upgrade": "",
}
+ self.path = None
def __str__(self):
s = ["%s" % self.fullname()]
@@ -87,22 +91,24 @@ class pmpkg(object):
"""
return "%s%s" % (self.fullname(), util.PM_EXT_PKG)
+ @staticmethod
+ def parse_filename(name):
+ filename = name
+ if filename[-1] == "*":
+ filename = filename.rstrip("*")
+ if filename.find(" -> ") != -1:
+ filename, extra = filename.split(" -> ")
+ elif filename.find("|") != -1:
+ filename, extra = filename.split("|")
+ return filename
+
def makepkg(self, path):
- """Creates an ArchLinux package archive.
+ """Creates an Arch Linux package archive.
A package archive is generated in the location 'path', based on the data
from the object.
"""
- self.path = os.path.join(path, self.filename())
-
- curdir = os.getcwd()
- tmpdir = tempfile.mkdtemp()
- os.chdir(tmpdir)
-
- # Generate package file system
- for f in self.files:
- util.mkfile(f, f)
- self.size += os.lstat(util.getfilename(f))[stat.ST_SIZE]
+ archive_files = []
# .PKGINFO
data = ["pkgname = %s" % self.name]
@@ -130,22 +136,82 @@ class pmpkg(object):
data.append("provides = %s" % i)
for i in self.backup:
data.append("backup = %s" % i)
- util.mkfile(".PKGINFO", "\n".join(data))
+ archive_files.append((".PKGINFO", "\n".join(data)))
# .INSTALL
- if len(self.install.values()) > 0:
- util.mkinstallfile(".INSTALL", self.install)
+ if any(self.install.values()):
+ archive_files.append((".INSTALL", self.installfile()))
- # safely create the dir
+ self.path = os.path.join(path, self.filename())
util.mkdir(os.path.dirname(self.path))
- # Generate package archive
+ # Generate package metadata
tar = tarfile.open(self.path, "w:gz")
- for i in os.listdir("."):
- tar.add(i)
+ for name, data in archive_files:
+ info = tarfile.TarInfo(name)
+ info.size = len(data)
+ tar.addfile(info, StringIO(data))
+
+ # Generate package file system
+ for name in self.files:
+ fileinfo = util.getfileinfo(name)
+ info = tarfile.TarInfo(fileinfo["filename"])
+ if fileinfo["hasperms"]:
+ info.mode = fileinfo["perms"]
+ if fileinfo["isdir"]:
+ info.type = tarfile.DIRTYPE
+ tar.addfile(info)
+ elif fileinfo["islink"]:
+ info.type = tarfile.SYMTYPE
+ info.linkname = fileinfo["link"]
+ tar.addfile(info)
+ else:
+ # TODO wow what a hack, adding a newline to match mkfile?
+ filedata = name + "\n"
+ info.size = len(filedata)
+ tar.addfile(info, StringIO(filedata))
+
tar.close()
- os.chdir(curdir)
- shutil.rmtree(tmpdir)
+ def install_package(self, root):
+ """Install the package in the given root."""
+ for f in self.files:
+ util.mkfile(root, f, f)
+ path = os.path.join(root, f)
+ if os.path.isfile(path):
+ os.utime(path, (355, 355))
+
+ def full_filelist(self):
+ """Generate a list of package files.
+
+ Each path is decomposed to generate the list of all directories leading
+ to the file.
+
+ Example with 'usr/local/bin/dummy':
+ The resulting list will be:
+ usr/
+ usr/local/
+ usr/local/bin/
+ usr/local/bin/dummy
+ """
+ file_set = set()
+ for name in self.files:
+ name = self.parse_filename(name)
+ file_set.add(name)
+ while "/" in name:
+ name, tmp = name.rsplit("/", 1)
+ file_set.add(name + "/")
+ return sorted(file_set)
+
+ def local_backup_entries(self):
+ return ["%s\t%s" % (self.parse_filename(i), util.mkmd5sum(i)) for i in self.backup]
+
+ def installfile(self):
+ data = []
+ for key, value in self.install.iteritems():
+ if value:
+ data.append("%s() {\n%s\n}\n" % (key, value))
+
+ return "\n".join(data)
# vim: set ts=4 sw=4 et: