summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cnf/make.globals2
-rw-r--r--man/make.conf.55
-rw-r--r--pym/portage.py24
3 files changed, 27 insertions, 4 deletions
diff --git a/cnf/make.globals b/cnf/make.globals
index b589d9d13..f808d4258 100644
--- a/cnf/make.globals
+++ b/cnf/make.globals
@@ -33,7 +33,7 @@ FETCHCOMMAND="/usr/bin/wget -t 5 -T 60 --passive-ftp -O \${DISTDIR}/\${FILE} \${
RESUMECOMMAND="/usr/bin/wget -c -t 5 -T 60 --passive-ftp -O \${DISTDIR}/\${FILE} \${URI}"
# Default user options
-FEATURES="sandbox distlocks metadata-transfer"
+FEATURES="sandbox distlocks metadata-transfer unmerge-orphans"
# Default chunksize for binhost comms
PORTAGE_BINHOST_CHUNKSIZE="3000"
diff --git a/man/make.conf.5 b/man/make.conf.5
index 5c211f92e..9fd51c78a 100644
--- a/man/make.conf.5
+++ b/man/make.conf.5
@@ -271,6 +271,11 @@ the package compiled properly. See \fItest\fR in \fBebuild\fR(1)
and \fIsrc_test()\fR in \fBebuild\fR(5). This feature implies the "test"
\fBUSE\fR flag.
.TP
+.B unmerge-orphans
+If a file is not claimed by another package in the same slot and it is not
+protected by \fICONFIG_PROTECT\fR, unmerge it even if the modification time or
+checksum differs from the file that was originally installed.
+.TP
.B userfetch
When portage is run as root, drop privileges to portage:portage during the
fetching of package sources.
diff --git a/pym/portage.py b/pym/portage.py
index 260ec5f7e..4a35a7aa3 100644
--- a/pym/portage.py
+++ b/pym/portage.py
@@ -7166,16 +7166,20 @@ class dblink:
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()
mykeys.reverse()
#process symlinks second-to-last, directories last.
- mydirs=[]
- modprotect="/lib/modules/"
+ mydirs = []
+ 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.
@@ -7193,7 +7197,7 @@ class dblink:
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
@@ -7209,6 +7213,20 @@ class dblink:
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))