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

Allan McRae allan at archlinux.org
Tue Mar 5 05:01:39 EST 2013


On 04/03/13 23:32, Andrew Gregory wrote:
> 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?
> 

We should have an error if the path starts with "/" so it would be great
if you could add that.  The testsuite does wired things if you do use
patch starting with / anyway.

The rest of your explanation makes sense, so no need to change that.



More information about the pacman-dev mailing list