1 |
Author: zmedico |
2 |
Date: 2008-04-27 06:31:11 +0000 (Sun, 27 Apr 2008) |
3 |
New Revision: 9992 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
main/trunk/pym/portage/__init__.py |
8 |
Log: |
9 |
Create a digraph.difference_update() method and use it to amortize the |
10 |
cost of removing nodes from the digraph.order list. |
11 |
|
12 |
|
13 |
Modified: main/trunk/pym/_emerge/__init__.py |
14 |
=================================================================== |
15 |
--- main/trunk/pym/_emerge/__init__.py 2008-04-27 00:44:34 UTC (rev 9991) |
16 |
+++ main/trunk/pym/_emerge/__init__.py 2008-04-27 06:31:11 UTC (rev 9992) |
17 |
@@ -3312,16 +3312,18 @@ |
18 |
# otherwise they slow down merge order calculation. Don't remove |
19 |
# non-root nodes since they help optimize merge order in some cases |
20 |
# such as revdep-rebuild. |
21 |
+ removed_nodes = set() |
22 |
while True: |
23 |
- removed_something = False |
24 |
for node in mygraph.root_nodes(): |
25 |
if not isinstance(node, Package) or \ |
26 |
node.installed or node.onlydeps: |
27 |
- self.spinner.update() |
28 |
- mygraph.remove(node) |
29 |
- removed_something = True |
30 |
- if not removed_something: |
31 |
+ removed_nodes.add(node) |
32 |
+ if removed_nodes: |
33 |
+ self.spinner.update() |
34 |
+ mygraph.difference_update(removed_nodes) |
35 |
+ if not removed_nodes: |
36 |
break |
37 |
+ removed_nodes.clear() |
38 |
self._merge_order_bias(mygraph) |
39 |
def cmp_circular_bias(n1, n2): |
40 |
""" |
41 |
@@ -3671,6 +3673,8 @@ |
42 |
prefer_asap = True |
43 |
accept_root_node = False |
44 |
|
45 |
+ mygraph.difference_update(selected_nodes) |
46 |
+ |
47 |
for node in selected_nodes: |
48 |
|
49 |
# Handle interactions between blockers |
50 |
@@ -3706,7 +3710,7 @@ |
51 |
|
52 |
if node[-1] != "nomerge": |
53 |
retlist.append(node) |
54 |
- mygraph.remove(node) |
55 |
+ |
56 |
if isinstance(node, Uninstall): |
57 |
# Include satisfied blockers in the merge list so |
58 |
# that the user can see why the package had to be |
59 |
|
60 |
Modified: main/trunk/pym/portage/__init__.py |
61 |
=================================================================== |
62 |
--- main/trunk/pym/portage/__init__.py 2008-04-27 00:44:34 UTC (rev 9991) |
63 |
+++ main/trunk/pym/portage/__init__.py 2008-04-27 06:31:11 UTC (rev 9992) |
64 |
@@ -389,6 +389,26 @@ |
65 |
del self.nodes[node] |
66 |
self.order.remove(node) |
67 |
|
68 |
+ def difference_update(self, t): |
69 |
+ """ |
70 |
+ Remove all given nodes from node_set. This is more efficient |
71 |
+ than multiple calls to the remove() method. |
72 |
+ """ |
73 |
+ if isinstance(t, (list, tuple)) or \ |
74 |
+ not hasattr(t, "__contains__"): |
75 |
+ t = frozenset(t) |
76 |
+ order = [] |
77 |
+ for node in self.order: |
78 |
+ if node not in t: |
79 |
+ order.append(node) |
80 |
+ continue |
81 |
+ for parent in self.nodes[node][1]: |
82 |
+ del self.nodes[parent][0][node] |
83 |
+ for child in self.nodes[node][0]: |
84 |
+ del self.nodes[child][1][node] |
85 |
+ del self.nodes[node] |
86 |
+ self.order = order |
87 |
+ |
88 |
def remove_edge(self, child, parent): |
89 |
""" |
90 |
Remove edge in the direction from child to parent. Note that it is |
91 |
|
92 |
-- |
93 |
gentoo-commits@l.g.o mailing list |