pmpkg: add missing directories to test packages

Several tests require complete file lists in order to provide accurate
results.  These can be non-obvious.  Adding missing parent directories
helps insure the integrity of tests against human error.  Filling in
parent directories also allows us to check that file lists are actually
valid.

There didn't seem to be a good place to do this that was always
guaranteed to be run, so this adds a finalize() function to packages
that will always be run before the package is actually used to allow for
this type of tidying.

Fixes FS#30723

Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Andrew Gregory 2013-03-09 11:49:27 -05:00 committed by Allan McRae
parent 2259dff7f3
commit 43a2f63194
3 changed files with 35 additions and 20 deletions

View File

@ -219,7 +219,7 @@ def db_write(self, pkg):
# 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)

View File

@ -69,6 +69,7 @@ def __init__(self, name, version = "1.0-1"):
"post_upgrade": "",
}
self.path = None
self.finalized = False
def __str__(self):
s = ["%s" % self.fullname()]
@ -182,27 +183,38 @@ def install_package(self, root):
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]

View File

@ -147,8 +147,11 @@ def generate(self, pacman):
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: