For bug #182346, use dblink.isowner() during unmerge so that device/inode numbers...
authorZac Medico <zmedico@gentoo.org>
Sun, 17 Jun 2007 22:13:36 +0000 (22:13 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 17 Jun 2007 22:13:36 +0000 (22:13 -0000)
svn path=/main/branches/2.1.2/; revision=6864

pym/portage.py

index 09554e935505ce4549c970f521ff73b96368634a..dc54e8abbe6e3964f2100719b08822c77a1aae62 100644 (file)
@@ -7111,9 +7111,9 @@ class dblink:
                                others_in_slot.append(dblink(self.cat, catsplit(cur_cpv)[1],
                                        self.vartree.root, self.settings,
                                        vartree=self.vartree))
-               claimed_paths = set()
-               for dblnk in others_in_slot:
-                       claimed_paths.update(dblnk.getcontents())
+               dest_root = normalize_path(self.vartree.root).rstrip(os.path.sep) + \
+                       os.path.sep
+               dest_root_len = len(dest_root)
 
                unmerge_orphans = "unmerge-orphans" in self.settings.features
 
@@ -7129,12 +7129,6 @@ class dblink:
                                obj = normalize_path(objkey)
                                file_data = pkgfiles[objkey]
                                file_type = file_data[0]
-                               if obj in claimed_paths:
-                                       # A new instance of this package claims the file, so don't
-                                       # unmerge it.
-                                       writemsg_stdout("--- !owned %s %s\n" % \
-                                               (pkgfiles[objkey][0], obj))
-                                       continue
                                statobj = None
                                try:
                                        statobj = os.stat(obj)
@@ -7149,6 +7143,19 @@ class dblink:
                                if lstatobj is None:
                                                writemsg_stdout("--- !found %s %s\n" % (file_type, obj))
                                                continue
+                               if obj.startswith(dest_root):
+                                       relative_path = obj[dest_root_len:]
+                                       is_owned = False
+                                       for dblnk in others_in_slot:
+                                               if dblnk.isowner(relative_path, dest_root):
+                                                       is_owned = True
+                                                       break
+                                       if is_owned:
+                                               # A new instance of this package claims the file, so
+                                               # don't unmerge it.
+                                               writemsg_stdout("--- !owned %s %s\n" % \
+                                                       (file_type, obj))
+                                               continue
                                # next line includes a tweak to protect modules from being unmerged,
                                # but we don't protect modules from being overwritten if they are
                                # upgraded. We effectively only want one half of the config protection