[pacman-dev] [PATCHv2] pmpkg: add missing directories to test packages
Allan McRae
allan at archlinux.org
Mon Mar 4 02:51:21 EST 2013
On 04/03/13 09:54, Andrew Gregory wrote:
> 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 at gmail.com>
> ---
>
> Not quite as simple as I had hoped...
>
> test/pacman/pmdb.py | 2 +-
> test/pacman/pmpkg.py | 49 ++++++++++++++++++++++++++++---------------------
> test/pacman/pmtest.py | 3 +++
> 3 files changed, 32 insertions(+), 22 deletions(-)
>
> diff --git a/test/pacman/pmdb.py b/test/pacman/pmdb.py
> index b694dff..3e9d305 100644
> --- a/test/pacman/pmdb.py
> +++ b/test/pacman/pmdb.py
> @@ -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)
>
> diff --git a/test/pacman/pmpkg.py b/test/pacman/pmpkg.py
> index c0c9f13..1e019c8 100644
> --- a/test/pacman/pmpkg.py
> +++ b/test/pacman/pmpkg.py
> @@ -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,33 @@ 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.
> -
> - 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 file_names:
> + name = os.path.dirname(name.rstrip("/"))
> +
> + while name and name != "/":
> + if name in file_names:
> + # path exists as both a file and a directory
> + raise ValueError("Path '%s' duplicated in filelist." % name)
> + elif name + "/" not in file_names:
> + file_names.append(name + "/")
> + self.files.append(name + "/")
> + name = os.path.dirname(name)
> + self.files.sort()
> +
Is there are reason not to use the old full_filelist function here? I
said ti was the better way in my last email... I see the error for
conflicting files/directories has been added - so that is good. But in
pactests can not start with a "/", so you should use "while "/" in name"
> + 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 6dc0ee6..2eafe68 100644
> --- a/test/pacman/pmtest.py
> +++ b/test/pacman/pmtest.py
> @@ -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:
>
More information about the pacman-dev
mailing list