diff --git a/test/pacman/pmdb.py b/test/pacman/pmdb.py index b694dff6..3e9d305e 100644 --- a/test/pacman/pmdb.py +++ b/test/pacman/pmdb.py @@ -219,7 +219,7 @@ class pmdb(object): # files and install if self.is_local: data = [] - make_section(data, "FILES", pkg.full_filelist()) + make_section(data, "FILES", pkg.filelist()) make_section(data, "BACKUP", pkg.local_backup_entries()) entry["files"] = "\n".join(data) diff --git a/test/pacman/pmpkg.py b/test/pacman/pmpkg.py index c0c9f131..988c73f3 100644 --- a/test/pacman/pmpkg.py +++ b/test/pacman/pmpkg.py @@ -69,6 +69,7 @@ class pmpkg(object): "post_upgrade": "", } self.path = None + self.finalized = False def __str__(self): s = ["%s" % self.fullname()] @@ -182,27 +183,38 @@ class pmpkg(object): if os.path.isfile(path): os.utime(path, (355, 355)) - def full_filelist(self): - """Generate a list of package files. + def filelist(self): + """Generate a list of package files.""" + return sorted([self.parse_filename(f) for f in self.files]) - Each path is decomposed to generate the list of all directories leading - to the file. + def finalize(self): + """Perform any necessary operations to ready the package for use.""" + if self.finalized: + return - 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) + # add missing parent dirs to file list + # use bare file names so trailing ' -> ', '*', etc don't throw off the + # checks for existing files + file_names = self.filelist() + for name in list(file_names): + if os.path.isabs(name): + raise ValueError("Absolute path in filelist '%s'." % name) + + name = os.path.dirname(name.rstrip("/")) + while name: + if name in file_names: + # path exists as both a file and a directory + raise ValueError("Duplicate path in filelist '%s'." % name) + elif name + "/" in file_names: + # path was either manually included or already processed + break + else: + file_names.append(name + "/") + self.files.append(name + "/") + name = os.path.dirname(name) + self.files.sort() + + self.finalized = True def local_backup_entries(self): return ["%s\t%s" % (self.parse_filename(i), util.mkmd5sum(i)) for i in self.backup] diff --git a/test/pacman/pmtest.py b/test/pacman/pmtest.py index 6dc0ee64..2eafe682 100644 --- a/test/pacman/pmtest.py +++ b/test/pacman/pmtest.py @@ -147,8 +147,11 @@ class pmtest(object): vprint(" Creating package archives") for pkg in self.localpkgs: vprint("\t%s" % os.path.join(util.TMPDIR, pkg.filename())) + pkg.finalize() pkg.makepkg(tmpdir) for key, value in self.db.iteritems(): + for pkg in value.pkgs: + pkg.finalize() if key == "local" and not self.createlocalpkgs: continue for pkg in value.pkgs: