Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r12710 - main/trunk/pym/_emerge
Date: Thu, 26 Feb 2009 00:59:09
Message-Id: E1LcUah-0005qn-9c@stork.gentoo.org
1 Author: zmedico
2 Date: 2009-02-26 00:59:06 +0000 (Thu, 26 Feb 2009)
3 New Revision: 12710
4
5 Modified:
6 main/trunk/pym/_emerge/__init__.py
7 Log:
8 Inside depgraph._merge_order_bias(), promote deep system runtime deps toward
9 the front of the merge list. This should help optimize merge order to account
10 for implicit system dependencies.
11
12
13 Modified: main/trunk/pym/_emerge/__init__.py
14 ===================================================================
15 --- main/trunk/pym/_emerge/__init__.py 2009-02-26 00:00:59 UTC (rev 12709)
16 +++ main/trunk/pym/_emerge/__init__.py 2009-02-26 00:59:06 UTC (rev 12710)
17 @@ -1123,6 +1123,38 @@
18 DepPrioritySatisfiedRange._ignore_runtime
19 )
20
21 +def _find_deep_system_runtime_deps(graph):
22 + deep_system_deps = set()
23 + node_stack = []
24 + for node in graph:
25 + if not isinstance(node, Package) or \
26 + node.operation == 'uninstall':
27 + continue
28 + if node.root_config.sets['system'].findAtomForPackage(node):
29 + node_stack.append(node)
30 +
31 + def ignore_priority(priority):
32 + """
33 + Ignore non-runtime priorities.
34 + """
35 + if isinstance(priority, DepPriority) and \
36 + (priority.runtime or priority.runtime_post):
37 + return False
38 + return True
39 +
40 + while node_stack:
41 + node = node_stack.pop()
42 + if node in deep_system_deps:
43 + continue
44 + deep_system_deps.add(node)
45 + for child in graph.child_nodes(node, ignore_priority=ignore_priority):
46 + if not isinstance(child, Package) or \
47 + child.operation == 'uninstall':
48 + continue
49 + node_stack.append(child)
50 +
51 + return deep_system_deps
52 +
53 class FakeVartree(portage.vartree):
54 """This is implements an in-memory copy of a vartree instance that provides
55 all the interfaces required for use by the depgraph. The vardb is locked
56 @@ -6782,13 +6814,37 @@
57 return acceptable
58
59 def _merge_order_bias(self, mygraph):
60 - """Order nodes from highest to lowest overall reference count for
61 - optimal leaf node selection."""
62 + """
63 + For optimal leaf node selection, promote deep system runtime deps and
64 + order nodes from highest to lowest overall reference count.
65 + """
66 +
67 node_info = {}
68 for node in mygraph.order:
69 node_info[node] = len(mygraph.parent_nodes(node))
70 + deep_system_deps = (_find_deep_system_runtime_deps(mygraph))
71 +
72 def cmp_merge_preference(node1, node2):
73 +
74 + if node1.operation == 'uninstall':
75 + if node2.operation == 'uninstall':
76 + return 0
77 + return 1
78 +
79 + if node2.operation == 'uninstall':
80 + if node1.operation == 'uninstall':
81 + return 0
82 + return -1
83 +
84 + node1_sys = node1 in deep_system_deps
85 + node2_sys = node2 in deep_system_deps
86 + if node1_sys != node2_sys:
87 + if node1_sys:
88 + return -1
89 + return 1
90 +
91 return node_info[node2] - node_info[node1]
92 +
93 mygraph.order.sort(key=cmp_sort_key(cmp_merge_preference))
94
95 def altlist(self, reversed=False):
96 @@ -10148,38 +10204,10 @@
97 merged, these packages go to merge_wait_queue, to be merged when no
98 other packages are building.
99 """
100 - graph = self._digraph
101 deep_system_deps = self._deep_system_deps
102 deep_system_deps.clear()
103 - node_stack = []
104 - for node in graph.order:
105 - if not isinstance(node, Package) or \
106 - node.operation == "uninstall":
107 - continue
108 - system_set = node.root_config.sets["system"]
109 - if system_set.findAtomForPackage(node):
110 - node_stack.append(node)
111 -
112 - def ignore_priority(priority):
113 - """
114 - Ignore non-runtime priorities.
115 - """
116 - if isinstance(priority, DepPriority) and \
117 - (priority.runtime or priority.runtime_post):
118 - return False
119 - return True
120 -
121 - while node_stack:
122 - node = node_stack.pop()
123 - if node in deep_system_deps:
124 - continue
125 - deep_system_deps.add(node)
126 - for child in graph.child_nodes(node, ignore_priority=ignore_priority):
127 - if not isinstance(child, Package) or \
128 - child.operation == "uninstall":
129 - continue
130 - node_stack.append(child)
131 -
132 + deep_system_deps.update(
133 + _find_deep_system_runtime_deps(self._digraph))
134 deep_system_deps.difference_update([pkg for pkg in \
135 deep_system_deps if pkg.operation != "merge"])