For bug #184679, handle ENOTDIR by finding the non-directory parent and testing that...
authorZac Medico <zmedico@gentoo.org>
Wed, 11 Jul 2007 00:39:18 +0000 (00:39 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 11 Jul 2007 00:39:18 +0000 (00:39 -0000)
svn path=/main/branches/2.1.2/; revision=7221

pym/portage.py

index 158484195a250a3381e3cd7646fe3dc35b13d310..2f916c81ea8048c4d1a8e99b79e649949fe73cb8 100644 (file)
@@ -7613,7 +7613,8 @@ class dblink:
                        starttime=time.time()
                        i=0
                        collisions = []
-
+                       destroot = normalize_path(destroot).rstrip(os.path.sep) + \
+                               os.path.sep
                        print green("*")+" checking "+str(len(myfilelist))+" files for package collisions"
                        for f in myfilelist:
                                nocheck = False
@@ -7633,10 +7634,34 @@ class dblink:
                                try:
                                        dest_lstat = os.lstat(dest_path)
                                except EnvironmentError, e:
-                                       if e.errno != errno.ENOENT:
+                                       if e.errno == errno.ENOENT:
+                                               del e
+                                               continue
+                                       elif e.errno == errno.ENOTDIR:
+                                               del e
+                                               # A non-directory is in a location where this package
+                                               # expects to have a directory.
+                                               dest_lstat = None
+                                               parent_path = dest_path
+                                               while len(parent_path) > len(destroot):
+                                                       parent_path = os.path.dirname(parent_path)
+                                                       try:
+                                                               dest_lstat = os.lstat(parent_path)
+                                                               break
+                                                       except EnvironmentError, e:
+                                                               if e.errno != errno.ENOTDIR:
+                                                                       raise
+                                                               del e
+                                               if not dest_lstat:
+                                                       raise AssertionError(
+                                                               "unable to find non-directory " + \
+                                                               "parent for '%s'" % parent_path)
+                                               dest_path = parent_path
+                                               f = os.path.sep + dest_path[len(destroot):]
+                                               if f in collisions:
+                                                       continue
+                                       else:
                                                raise
-                                       del e
-                                       continue
                                if f[0] != "/":
                                        f="/"+f
                                isowned = False