For bug #80846, prevent false collisions caused by symlinks. Thanks to Thomas Bettle...
authorZac Medico <zmedico@gentoo.org>
Mon, 25 Sep 2006 22:53:24 +0000 (22:53 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 25 Sep 2006 22:53:24 +0000 (22:53 -0000)
svn path=/main/branches/2.1.1/; revision=4537

pym/portage.py

index 6739e91fbcedfda875fca2766ae230b802e54cbc..9e46cb4d3b8ac433c36de6a4bd5270d11b10d048 100644 (file)
@@ -5559,6 +5559,7 @@ class dblink:
                self.updateprotect = protect_obj.updateprotect
                self.isprotected = protect_obj.isprotected
                self.contentscache=[]
+               self._contents_inodes = None
 
        def lockdb(self):
                if self.lock_num == 0:
@@ -5840,11 +5841,25 @@ class dblink:
                (for this or a previous version)"""
                destfile = normalize_path(
                        os.path.join(destroot, filename.lstrip(os.path.sep)))
-               if not os.path.exists(destfile):
+               try:
+                       mylstat = os.lstat(destfile)
+               except OSError:
                        return True
+
                pkgfiles = self.getcontents()
                if pkgfiles and filename in pkgfiles:
                        return True
+               if pkgfiles:
+                       if self._contents_inodes is None:
+                               self._contents_inodes = set()
+                               for x in pkgfiles:
+                                       try:
+                                               lstat = os.lstat(x)
+                                               self._contents_inodes.add((lstat.st_dev, lstat.st_ino))
+                                       except OSError:
+                                               pass
+                       if (mylstat.st_dev, mylstat.st_ino) in self._contents_inodes:
+                                return True
 
                return False