1 |
Also, optimize the add method to avoid creating a lot of |
2 |
duplicate priorities when called by the update method. |
3 |
--- |
4 |
pym/portage/tests/util/test_digraph.py | 4 +++- |
5 |
pym/portage/util/digraph.py | 26 ++++++++++++++++++++++++-- |
6 |
2 files changed, 27 insertions(+), 3 deletions(-) |
7 |
|
8 |
diff --git a/pym/portage/tests/util/test_digraph.py b/pym/portage/tests/util/test_digraph.py |
9 |
index f519536..01e075c 100644 |
10 |
--- a/pym/portage/tests/util/test_digraph.py |
11 |
+++ b/pym/portage/tests/util/test_digraph.py |
12 |
@@ -88,7 +88,9 @@ class DigraphTest(TestCase): |
13 |
g.add("D", "A", 2) |
14 |
|
15 |
f = g.clone() |
16 |
- for x in g, f: |
17 |
+ h = digraph() |
18 |
+ h.update(f) |
19 |
+ for x in g, f, h: |
20 |
self.assertEqual(bool(x), True) |
21 |
self.assertEqual(x.contains("A"), True) |
22 |
self.assertEqual(x.firstzero(), None) |
23 |
diff --git a/pym/portage/util/digraph.py b/pym/portage/util/digraph.py |
24 |
index 99b24fa..ba0e81c 100644 |
25 |
--- a/pym/portage/util/digraph.py |
26 |
+++ b/pym/portage/util/digraph.py |
27 |
@@ -44,8 +44,10 @@ class digraph(object): |
28 |
priorities = [] |
29 |
self.nodes[node][1][parent] = priorities |
30 |
self.nodes[parent][0][node] = priorities |
31 |
- priorities.append(priority) |
32 |
- priorities.sort() |
33 |
+ |
34 |
+ if not priorities or priorities[-1] is not priority: |
35 |
+ priorities.append(priority) |
36 |
+ priorities.sort() |
37 |
|
38 |
def discard(self, node): |
39 |
""" |
40 |
@@ -73,6 +75,26 @@ class digraph(object): |
41 |
del self.nodes[node] |
42 |
self.order.remove(node) |
43 |
|
44 |
+ def update(self, other): |
45 |
+ """ |
46 |
+ Add all nodes and edges from another digraph instance. |
47 |
+ """ |
48 |
+ for node in other.order: |
49 |
+ children, parents, node = other.nodes[node] |
50 |
+ if parents: |
51 |
+ for parent, priorities in parents.items(): |
52 |
+ for priority in priorities: |
53 |
+ self.add(node, parent, priority=priority) |
54 |
+ else: |
55 |
+ self.add(node, None) |
56 |
+ |
57 |
+ def clear(self): |
58 |
+ """ |
59 |
+ Remove all nodes and edges. |
60 |
+ """ |
61 |
+ self.nodes.clear() |
62 |
+ del self.order[:] |
63 |
+ |
64 |
def difference_update(self, t): |
65 |
""" |
66 |
Remove all given nodes from node_set. This is more efficient |
67 |
-- |
68 |
2.10.2 |