return os.EX_OK
def unmerge(settings, myopts, vartree, unmerge_action, unmerge_files,
- ldpath_mtimes, autoclean=0, clean_world=1):
+ ldpath_mtimes, autoclean=0, clean_world=1, ordered=0):
candidate_catpkgs=[]
global_unmerge=0
xterm_titles = "notitles" not in settings.features
finally:
if vdb_lock:
portage_locks.unlockdir(vdb_lock)
+
+ # Unmerge order only matters in some cases
+ if not ordered:
+ unordered = {}
+ for d in pkgmap:
+ selected = d["selected"]
+ if not selected:
+ continue
+ cp = portage.cpv_getkey(iter(selected).next())
+ cp_dict = unordered.get(cp)
+ if cp_dict is None:
+ cp_dict = {}
+ unordered[cp] = cp_dict
+ for k in d:
+ cp_dict[k] = set()
+ for k, v in d.iteritems():
+ cp_dict[k].update(v)
+ pkgmap = [unordered[cp] for cp in sorted(unordered)]
+
for x in xrange(len(pkgmap)):
selected = pkgmap[x]["selected"]
if not selected:
if cpv in clean_set:
graph.add(cpv, node, priority=priority)
+ ordered = True
if len(graph.order) == len(graph.root_nodes()):
# If there are no dependencies between packages
- # then just unmerge them alphabetically.
- cleanlist = graph.order[:]
- cleanlist.sort()
+ # let unmerge() group them by cat/pn.
+ ordered = False
+ cleanlist = graph.all_nodes()
else:
# Order nodes from lowest to highest overall reference count for
# optimal root node selection.
cleanlist.append(node)
unmerge(settings, myopts, trees[settings["ROOT"]]["vartree"],
- "unmerge", cleanlist, ldpath_mtimes)
+ "unmerge", cleanlist, ldpath_mtimes, ordered=ordered)
if action == "prune":
return
(myaction == "prune" and "--nodeps" in myopts):
validate_ebuild_environment(trees)
vartree = trees[settings["ROOT"]]["vartree"]
+ # When given a list of atoms, unmerge
+ # them in the order given.
+ ordered = myaction == "unmerge"
if 1 == unmerge(settings, myopts, vartree, myaction, myfiles,
- mtimedb["ldpath"]):
+ mtimedb["ldpath"], ordered=ordered):
if not (buildpkgonly or fetchonly or pretend):
post_emerge(settings, mtimedb, 0)