From a133cb89d5279df7febcd0c8ab3890e2ccfb897a Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Wed, 13 Jun 2007 07:21:59 +0000 Subject: For bug #134620, add a FEATURES=unmerge-orphans option that causes unmerge to remove files more aggressively. If a file is not claimed by another package in the same slot and it is not protected by CONFIG_PROTECT, unmerge it even if the modification time or checksum differs from the file that was originally installed. This is enabled in make.globals since the vast majority of users probably want this. svn path=/main/trunk/; revision=6829 --- cnf/make.globals | 2 +- man/make.conf.5 | 5 +++++ pym/portage/dbapi/vartree.py | 22 ++++++++++++++++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/cnf/make.globals b/cnf/make.globals index 61e426642..d180c5389 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 8fd59d363..35e4447ef 100644 --- a/man/make.conf.5 +++ b/man/make.conf.5 @@ -270,6 +270,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/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)) -- cgit v1.2.3-1-g7c22