summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/emerge/__init__.py102
1 files changed, 75 insertions, 27 deletions
diff --git a/pym/emerge/__init__.py b/pym/emerge/__init__.py
index bad745d45..404cfc96f 100644
--- a/pym/emerge/__init__.py
+++ b/pym/emerge/__init__.py
@@ -2331,42 +2331,81 @@ class depgraph:
for t in self.settings["PORTDIR_OVERLAY"].split()]
tree_nodes = []
- node_depth = {}
+ display_list = []
+ mygraph = self._parent_child_digraph
i = 0
depth = 0
for x in mylist:
if "blocks" == x[0]:
+ display_list.append((x, 0, True))
continue
graph_key = tuple(x)
if "--tree" in self.myopts:
depth = len(tree_nodes)
while depth and graph_key not in \
- self.digraph.child_nodes(tree_nodes[depth-1]):
+ mygraph.child_nodes(tree_nodes[depth-1]):
depth -= 1
- tree_nodes = tree_nodes[:depth]
- tree_nodes.append(graph_key)
- node_depth[graph_key] = depth
+ if depth:
+ tree_nodes = tree_nodes[:depth]
+ tree_nodes.append(graph_key)
+ display_list.append((x, depth, True))
+ else:
+ traversed_nodes = set() # prevent endless circles
+ traversed_nodes.add(graph_key)
+ def add_parents(current_node, ordered):
+ parent_nodes = mygraph.parent_nodes(current_node)
+ if parent_nodes:
+ child_nodes = set(mygraph.child_nodes(current_node))
+ selected_parent = None
+ # First, try to avoid a direct cycle.
+ for node in parent_nodes:
+ if node not in traversed_nodes and \
+ node not in child_nodes:
+ selected_parent = node
+ break
+ if not selected_parent:
+ # A direct cycle is unavoidable.
+ for node in parent_nodes:
+ if node not in traversed_nodes:
+ selected_parent = node
+ break
+ if selected_parent:
+ traversed_nodes.add(node)
+ add_parents(node, False)
+ display_list.append((list(current_node),
+ len(tree_nodes), ordered))
+ tree_nodes.append(current_node)
+ tree_nodes = []
+ add_parents(graph_key, True)
+ else:
+ display_list.append((x, depth, True))
+ mylist = display_list
last_merge_depth = 0
for i in xrange(len(mylist)-1,-1,-1):
- if "blocks" == mylist[i][0]:
+ graph_key, depth, ordered = mylist[i]
+ if not ordered and depth == 0 and i > 1 \
+ and graph_key == mylist[i-1][0]:
+ # An ordered node got a consecutive duplicate when the tree was
+ # being filled in.
+ del mylist[i]
continue
- graph_key = tuple(mylist[i])
- if mylist[i][-1] != "nomerge":
- last_merge_depth = node_depth[graph_key]
+ if "blocks" == graph_key[0]:
continue
- if node_depth[graph_key] >= last_merge_depth or \
+ if graph_key[-1] != "nomerge":
+ last_merge_depth = depth
+ continue
+ if depth >= last_merge_depth or \
i < len(mylist) - 1 and \
- node_depth[graph_key] >= node_depth[tuple(mylist[i+1])]:
+ depth >= mylist[i+1][1]:
del mylist[i]
- del node_depth[graph_key]
- del tree_nodes
display_overlays=False
# files to fetch list - avoids counting a same file twice
# in size display (verbose mode)
myfetchlist=[]
- for x in mylist:
+ for mylist_index in xrange(len(mylist)):
+ x, depth, ordered = mylist[mylist_index]
pkg_type = x[0]
myroot = x[1]
pkg_key = x[2]
@@ -2380,7 +2419,8 @@ class depgraph:
if x[0]=="blocks":
addl=""+red("B")+" "+fetch+" "
- counters.blocks += 1
+ if ordered:
+ counters.blocks += 1
resolved = portage.key_expand(
pkg_key, mydb=vardb, settings=pkgsettings)
if "--columns" in self.myopts and "--quiet" in self.myopts:
@@ -2421,11 +2461,13 @@ class depgraph:
"fetch" in portdb.aux_get(
x[2], ["RESTRICT"])[0].split():
fetch = red("F")
- counters.restrict_fetch += 1
+ if ordered:
+ counters.restrict_fetch += 1
if portdb.fetch_check(
pkg_key, self.useFlags[myroot][pkg_key]):
fetch = green("f")
- counters.restrict_fetch_satisfied += 1
+ if ordered:
+ counters.restrict_fetch_satisfied += 1
#we need to use "--emptrytree" testing here rather than "empty" param testing because "empty"
#param is used for -u, where you still *do* want to see when something is being upgraded.
@@ -2433,7 +2475,8 @@ class depgraph:
if vardb.cpv_exists(pkg_key):
addl=" "+yellow("R")+fetch+" "
if x[3] != "nomerge":
- counters.reinst += 1
+ if ordered:
+ counters.reinst += 1
elif vardb.match(portage.dep_getkey(pkg_key)):
mynewslot = mydbapi.aux_get(pkg_key, ["SLOT"])[0]
myoldlist = self.trees[x[1]]["vartree"].dbapi.match(
@@ -2446,15 +2489,18 @@ class depgraph:
if portage.pkgcmp(portage.pkgsplit(x[2]), portage.pkgsplit(myoldbest)) < 0:
# Downgrade in slot
addl+=turquoise("U")+blue("D")
- counters.downgrades += 1
+ if ordered:
+ counters.downgrades += 1
else:
# Update in slot
addl+=turquoise("U")+" "
- counters.upgrades += 1
+ if ordered:
+ counters.upgrades += 1
else:
# New slot, mark it new.
addl=" "+green("NS")+fetch+" "
- counters.newslot += 1
+ if ordered:
+ counters.newslot += 1
if "--changelog" in self.myopts:
slot_atom = "%s:%s" % (portage.dep_getkey(pkg_key),
@@ -2466,7 +2512,8 @@ class depgraph:
inst_matches[0], pkg_key))
else:
addl=" "+green("N")+" "+fetch+" "
- counters.new += 1
+ if ordered:
+ counters.new += 1
verboseadd=""
@@ -2570,7 +2617,8 @@ class depgraph:
if myfetchfile not in myfetchlist:
mysize+=myfilesdict[myfetchfile]
myfetchlist.append(myfetchfile)
- counters.totalsize += mysize
+ if ordered:
+ counters.totalsize += mysize
verboseadd+=format_size(mysize)+" "
# overlay verbose
@@ -2605,7 +2653,7 @@ class depgraph:
oldlp=mywidth-30
newlp=oldlp-30
- indent = " " * node_depth[tuple(x)]
+ indent = " " * depth
if myoldbest:
myoldbest=portage.pkgsplit(myoldbest)[1]+"-"+portage.pkgsplit(myoldbest)[2]
@@ -2632,7 +2680,7 @@ class depgraph:
myprint=myprint+myoldbest
myprint=myprint+darkgreen("to "+x[1])+" "+verboseadd
else:
- if x[3] == "nomerge":
+ if x[-1] == "nomerge" or not ordered:
myprint = darkblue("[nomerge ] ")
else:
myprint = "[" + pkg_type + " " + addl + "] "
@@ -2654,7 +2702,7 @@ class depgraph:
myprint=myprint+(" "*(oldlp-nc_len(myprint)))
myprint=myprint+myoldbest+" "+verboseadd
else:
- if x[3]=="nomerge":
+ if x[-1] == "nomerge" or not ordered:
myprint=darkblue("[nomerge ] "+indent+x[2]+" "+myoldbest+" ")+verboseadd
else:
myprint="["+x[0]+" "+addl+"] "+indent+darkgreen(x[2])+" "+myoldbest+" "+verboseadd
@@ -2671,7 +2719,7 @@ class depgraph:
myversion = "%s-%s" % (mysplit[1], mysplit[2])
if myversion != portage.VERSION and "--quiet" not in self.myopts:
- if mylist.index(x) < len(mylist) - 1 and \
+ if mylist_index < len(mylist) - 1 and \
"livecvsportage" not in self.settings.features:
p.append(colorize("WARN", "*** Portage will stop merging at this point and reload itself,"))
p.append(colorize("WARN", " then resume the merge."))