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"]) |