[pacman-dev] [PATCHv2] pmpkg: add missing directories to test packages

Andrew Gregory andrew.gregory.8 at gmail.com
Mon Mar 4 08:32:49 EST 2013


On 03/04/13 at 05:51pm, Allan McRae wrote:
> 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"
> 

full_filelist couldn't be used because it discarded file type, mode,
etc. information.  At this stage in the test that rule against leading
"/" in paths has not been enforced, so an absolute path would cause an
endless loop.  I could add an explicit error for that and reduce the
loop to 'while name' but 'while "/" in name" won't work without
rearranging the loop because the top directory won't have "/" in it.
Aside from that, the only real difference I see is that full_filelist
used direct string manipulation rather than os.path, is there
a preference for that?

apg


More information about the pacman-dev mailing list