diff options
Diffstat (limited to 'test/pacman/pmpkg.py')
-rw-r--r--[-rwxr-xr-x] | test/pacman/pmpkg.py | 110 |
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: |