diff options
author | Zac Medico <zmedico@gentoo.org> | 2007-10-12 18:55:00 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2007-10-12 18:55:00 +0000 |
commit | 4c48b91febcb77ec0a94638b1396a55f27d557e6 (patch) | |
tree | e587e7df5004d13cc2685d0d042a41313f269597 | |
parent | 1148f95d7d034a86839e5fc5c0059afe6f1c1b01 (diff) | |
download | portage-4c48b91febcb77ec0a94638b1396a55f27d557e6.tar.gz portage-4c48b91febcb77ec0a94638b1396a55f27d557e6.tar.bz2 portage-4c48b91febcb77ec0a94638b1396a55f27d557e6.zip |
Bug #195527 - Unconditionally detect file collisions and log
them as eerror messages via elog. This will allow us to
collect more file collision data but it won't be quite as
annoying as enabling collision-protect by default would be.
svn path=/main/trunk/; revision=8086
-rw-r--r-- | pym/portage/dbapi/vartree.py | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index d1e1868e7..be8ab8b67 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -1546,7 +1546,6 @@ class dblink(object): isowned = True break if not isowned: - collisions.append(f) stopmerge = True if collision_ignore: if f in collision_ignore: @@ -1556,7 +1555,9 @@ class dblink(object): if f.startswith(myignore + os.path.sep): stopmerge = False break - if stopmerge: + if stopmerge: + collisions.append(f) + if stopmerge and "collision-protect" in self.settings.features: print red("*")+" This package is blocked because it wants to overwrite" print red("*")+" files belonging to other packages (see list below)." print red("*")+" If you have no clue what this is all about report it " @@ -1604,6 +1605,7 @@ class dblink(object): os.chdir(mycwd) except OSError: pass + return collisions def _security_check(self, installed_instances): if not installed_instances: @@ -1747,14 +1749,16 @@ class dblink(object): self._preserve_libs(srcroot, destroot, myfilelist+mylinklist, counter) # check for package collisions - if "collision-protect" in self.settings.features: - if myfilelist == None: - myfilelist = listdir(srcroot, recursive=1, filesonly=1, followSymlinks=False) - if mylinklist == None: - mylinklist = filter(os.path.islink, [os.path.join(srcroot, x) for x in listdir(srcroot, recursive=1, filesonly=0, followSymlinks=False)]) - mylinklist = [x[len(srcroot):] for x in mylinklist] - self._collision_protect(srcroot, destroot, others_in_slot, - myfilelist+mylinklist, mylinklist) + if myfilelist is None: + myfilelist = listdir(srcroot, recursive=1, + filesonly=1, followSymlinks=False) + if mylinklist is None: + mylinklist = filter(os.path.islink, [os.path.join(srcroot, x) \ + for x in listdir(srcroot, recursive=1, + filesonly=0, followSymlinks=False)]) + mylinklist = [x[len(srcroot):] for x in mylinklist] + collisions = self._collision_protect(srcroot, destroot, others_in_slot, + myfilelist+mylinklist, mylinklist) if True: """ The merge process may move files out of the image directory, @@ -1781,6 +1785,35 @@ class dblink(object): use_cache=0, tree=self.treetype, mydbapi=mydbapi, vartree=self.vartree) + if collisions: + msg = "This package wants to overwrite" + \ + " files belonging to other packages (see list below)." + \ + " Add \"collision-protect\" to FEATURES in make.conf" + \ + " if you would like the merge to abort in cases like this." + \ + " If you have no clue what this is all about then go to" + \ + " http://bugs.gentoo.org and report it as a bug for this package." + + self.settings["EBUILD_PHASE"] = "preinst" + cmd = "source '%s/isolated-functions.sh' ; " % PORTAGE_BIN_PATH + from textwrap import wrap + msg = wrap(msg, 70) + for line in msg: + cmd += "eerror \"%s\" ; " % line + cmd += "eerror ; " + cmd += "eerror \"Detected file collision(s):\" ; " + cmd += "eerror ; " + + from portage.output import colorize + for f in collisions: + cmd += "eerror \" '%s'\" ; " % colorize("INFORM", + os.path.join(destroot, f.lstrip(os.path.sep))) + + from portage import process + process.spawn(["bash", "-c", cmd], + env=self.settings.environ()) + from portage.elog import elog_process + elog_process(self.settings.mycpv, self.settings) + # XXX: Decide how to handle failures here. if a != os.EX_OK: writemsg("!!! FAILED preinst: "+str(a)+"\n", noiselevel=-1) |