diff options
Diffstat (limited to 'pym')
-rw-r--r-- | pym/portage/dbapi/vartree.py | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 5e91adebc..e234f00f1 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -1150,6 +1150,8 @@ class dblink(object): for dblnk in others_in_slot: claimed_paths.update(dblnk.getcontents()) + unmerge_orphans = "unmerge-orphans" in self.settings.features + if pkgfiles: mykeys = pkgfiles.keys() mykeys.sort() @@ -1157,9 +1159,11 @@ class dblink(object): #process symlinks second-to-last, directories last. mydirs = [] - modprotect = "/lib/modules/" + modprotect = os.path.join(self.vartree.root, "lib/modules/") for objkey in mykeys: 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. @@ -1177,7 +1181,7 @@ class dblink(object): except (OSError, AttributeError): pass islink = lstatobj is not None and stat.S_ISLNK(lstatobj.st_mode) - if statobj is None: + if not unmerge_orphans and statobj is None: if not islink: #we skip this if we're dealing with a symlink #because os.stat() will operate on the @@ -1193,6 +1197,20 @@ class dblink(object): writemsg_stdout("--- cfgpro %s %s\n" % (pkgfiles[objkey][0], obj)) continue + if unmerge_orphans and \ + lstatobj and not stat.S_ISDIR(lstatobj.st_mode) and \ + not self.isprotected(obj): + try: + # Remove permissions to ensure that any hardlinks to + # suid/sgid files are rendered harmless. + if statobj: + os.chmod(obj, 0) + os.unlink(obj) + except EnvironmentError, e: + pass + writemsg_stdout("<<< %s %s\n" % (file_type, obj)) + continue + lmtime = str(lstatobj[stat.ST_MTIME]) if (pkgfiles[objkey][0] not in ("dir", "fif", "dev")) and (lmtime != pkgfiles[objkey][1]): writemsg_stdout("--- !mtime %s %s\n" % (pkgfiles[objkey][0], obj)) |