Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH 1/3] digraph: add update and clear methods
Date: Wed, 19 Apr 2017 05:00:43
Message-Id: 20170419050007.7904-1-zmedico@gentoo.org
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

Replies