diff options
author | Zac Medico <zmedico@gentoo.org> | 2006-11-01 07:06:46 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2006-11-01 07:06:46 +0000 |
commit | 67a986eff177ef6ef2cb196ba7f09c3d9b34eb38 (patch) | |
tree | 908a6cb991b7515f0b28015bc6d841f4c9c0887e | |
parent | 59b77c7048c0095c08a2de66e97fb956b89853a7 (diff) | |
download | portage-67a986eff177ef6ef2cb196ba7f09c3d9b34eb38.tar.gz portage-67a986eff177ef6ef2cb196ba7f09c3d9b34eb38.tar.bz2 portage-67a986eff177ef6ef2cb196ba7f09c3d9b34eb38.zip |
For bug #153282, automatically find the owner package(s) in the event of a fatal file collision (since the collision is fatal, the performance hit doesn't matter).
svn path=/main/trunk/; revision=4899
-rw-r--r-- | pym/portage.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/pym/portage.py b/pym/portage.py index 400d87b91..ef84e3fc3 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -6377,6 +6377,8 @@ class dblink: dblink(self.cat, v, destroot, self.settings, vartree=self.vartree)) + collisions = [] + print green("*")+" checking "+str(len(myfilelist))+" files for package collisions" for f in myfilelist: nocheck = False @@ -6399,6 +6401,7 @@ class dblink: isowned = True break if not isowned: + collisions.append(f) print "existing file "+f+" is not owned by this package" stopmerge=True if collision_ignore: @@ -6424,6 +6427,35 @@ class dblink: self.unmerge(ldpath_mtimes=prev_mtimes) self.delete() self.unlockdb() + print + print "Searching all installed packages for file collisions..." + print "Press Ctrl-C to Stop" + print + """ Note: The isowner calls result in a stat call for *every* + single installed file, since the inode numbers are used to work + around the problem of ambiguous paths caused by symlinked files + and/or directories. Though it is slow, it is as accurate as + possible.""" + found_owner = False + for cpv in self.vartree.dbapi.cpv_all(): + cat, pkg = catsplit(cpv) + mylink = dblink(cat, pkg, destroot, self.settings, + vartree=self.vartree) + mycollisions = [] + for f in collisions: + if mylink.isowner(f, destroot): + mycollisions.append(f) + if mycollisions: + found_owner = True + print " * %s:" % cpv + print + for f in mycollisions: + print " '%s'" % \ + os.path.join(destroot, f.lstrip(os.path.sep)) + print + if not found_owner: + print "None of the installed packages claim the above file(s)." + print sys.exit(1) try: os.chdir(mycwd) |