dblink.getcontents(): generate parent directories
authorZac Medico <zmedico@gentoo.org>
Wed, 2 Mar 2011 18:51:41 +0000 (10:51 -0800)
committerZac Medico <zmedico@gentoo.org>
Mon, 14 Mar 2011 16:03:31 +0000 (09:03 -0700)
We can't necessarily assume that they are explicitly listed in
CONTENTS, and they are crucial for callers such as dblink.isowner().

pym/portage/dbapi/vartree.py

index 3bc30affd297452c7b544eabc53317e70f8f33a3..52f0fbaa2d7085ad164a59564ace5dea21e68868 100644 (file)
@@ -1403,6 +1403,9 @@ class dblink(object):
                myroot = self.settings['ROOT']
                if myroot == os.path.sep:
                        myroot = None
+               # used to generate parent dir entries
+               dir_entry = (_unicode_decode("dir"),)
+               eroot_split_len = len(self.settings["EROOT"].split(os.sep)) - 1
                pos = 0
                errors = []
                for pos, line in enumerate(mylines):
@@ -1447,6 +1450,19 @@ class dblink(object):
                        if myroot is not None:
                                path = os.path.join(myroot, path.lstrip(os.path.sep))
 
+                       # Implicitly add parent directories, since we can't necessarily
+                       # assume that they are explicitly listed in CONTENTS, and it's
+                       # useful for callers if they can rely on parent directory entries
+                       # being generated here (crucial for things like dblink.isowner()).
+                       path_split = path.split(os.sep)
+                       path_split.pop()
+                       while len(path_split) > eroot_split_len:
+                               parent = os.sep.join(path_split)
+                               if parent in pkgfiles:
+                                       break
+                               pkgfiles[parent] = dir_entry
+                               path_split.pop()
+
                        pkgfiles[path] = data
 
                if errors: