From e1893483f748e25f0b1d8b9c7163f53b37d0fd53 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sat, 3 Mar 2007 01:19:29 +0000 Subject: For bug #169046, fill in the --tree display with "nomerge" nodes so that the user can always see at lease 1 parent on any non-root node. Packages may appear in the display list multiple times, and will be marked "nomerge" when their position in the list does not correspond to actual merge order. svn path=/main/trunk/; revision=6135 --- pym/emerge/__init__.py | 102 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 27 deletions(-) (limited to 'pym/emerge/__init__.py') 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.")) -- cgit v1.2.3-1-g7c22