summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/emerge/__init__.py26
1 files changed, 24 insertions, 2 deletions
diff --git a/pym/emerge/__init__.py b/pym/emerge/__init__.py
index c0fd5671e..5c3ad335a 100644
--- a/pym/emerge/__init__.py
+++ b/pym/emerge/__init__.py
@@ -4022,9 +4022,31 @@ def unmerge(settings, myopts, vartree, unmerge_action, unmerge_files,
if y not in pkgmap[mykey]["selected"]:
pkgmap[mykey]["selected"].append(y)
numselected=numselected+len(mymatch)
-
+ elif unmerge_action == "prune":
+ if len(mymatch) == 1:
+ continue
+ best_version = mymatch[0]
+ best_slot = vartree.getslot(best_version)
+ best_counter = vartree.dbapi.cpv_counter(best_version)
+ for mypkg in mymatch[1:]:
+ if mypkg == portage.best([mypkg, best_version]):
+ myslot = vartree.getslot(mypkg)
+ mycounter = vartree.dbapi.cpv_counter(mypkg)
+ if myslot == best_slot:
+ if mycounter < best_counter:
+ # On slot collision, keep the one with the
+ # highest counter since it is the most
+ # recently installed.
+ continue
+ best_version = mypkg
+ best_slot = myslot
+ best_counter = mycounter
+ pkgmap[mykey]["protected"].append(best_version)
+ pkgmap[mykey]["selected"] = [mypkg for mypkg in mymatch \
+ if mypkg != best_version]
+ numselected = numselected + len(pkgmap[mykey]["selected"])
else:
- #unmerge_action in ["prune", clean"]
+ # unmerge_action == "clean"
slotmap={}
for mypkg in mymatch:
if unmerge_action=="clean":