summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2013-03-09 11:49:27 -0500
committerAllan McRae <allan@archlinux.org>2013-03-10 09:01:56 +1000
commit43a2f6319455edadf9947d2e0fa9e68ea4e348ae (patch)
tree84d0e738f2a316ea4be14b0044b5fc5456222da4
parent2259dff7f34b082d8e43af15228e74cba75580f6 (diff)
downloadpacman-43a2f6319455edadf9947d2e0fa9e68ea4e348ae.tar.xz
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>
-rw-r--r--test/pacman/pmdb.py2
-rw-r--r--test/pacman/pmpkg.py54
-rw-r--r--test/pacman/pmtest.py3
3 files changed, 37 insertions, 22 deletions
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.
-
- 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 filelist(self):
+ """Generate a list of package files."""
+ return sorted([self.parse_filename(f) for f in self.files])
+
+ def finalize(self):
+ """Perform any necessary operations to ready the package for use."""
+ if self.finalized:
+ return
+
+ # 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: