For bug #151653, make --prune keep the highest version whenever possible (even when...
authorZac Medico <zmedico@gentoo.org>
Fri, 20 Jul 2007 01:52:39 +0000 (01:52 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 20 Jul 2007 01:52:39 +0000 (01:52 -0000)
svn path=/main/trunk/; revision=7312

pym/emerge/__init__.py

index c0fd5671e73b533cd02278225890d1c1ced5e94e..5c3ad335a03366c5fd81fac91d2420820a2b44f2 100644 (file)
@@ -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":