aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2017-04-18 21:39:31 -0700
committerZac Medico <zmedico@gentoo.org>2017-04-20 12:39:00 -0700
commitc8c038fd4c201a582c420004b5ff759f28fe626b (patch)
tree48f1a2076d4ed4b4472655993177fb864ee2505b
parentdosym: Make implicit basename a fatal error. (diff)
downloadportage-c8c038fd.tar.gz
portage-c8c038fd.tar.bz2
portage-c8c038fd.zip
digraph: add update and clear methods
Also, optimize the add method to avoid creating a lot of duplicate priorities when called by the update method. Acked-by: Brian Dolbec <dolsen@gentoo.org>
-rw-r--r--pym/portage/tests/util/test_digraph.py4
-rw-r--r--pym/portage/util/digraph.py26
2 files changed, 27 insertions, 3 deletions
diff --git a/pym/portage/tests/util/test_digraph.py b/pym/portage/tests/util/test_digraph.py
index f519536d3..01e075c99 100644
--- a/pym/portage/tests/util/test_digraph.py
+++ b/pym/portage/tests/util/test_digraph.py
@@ -88,7 +88,9 @@ class DigraphTest(TestCase):
g.add("D", "A", 2)
f = g.clone()
- for x in g, f:
+ h = digraph()
+ h.update(f)
+ for x in g, f, h:
self.assertEqual(bool(x), True)
self.assertEqual(x.contains("A"), True)
self.assertEqual(x.firstzero(), None)
diff --git a/pym/portage/util/digraph.py b/pym/portage/util/digraph.py
index 99b24fa1d..ba0e81c07 100644
--- a/pym/portage/util/digraph.py
+++ b/pym/portage/util/digraph.py
@@ -44,8 +44,10 @@ class digraph(object):
priorities = []
self.nodes[node][1][parent] = priorities
self.nodes[parent][0][node] = priorities
- priorities.append(priority)
- priorities.sort()
+
+ if not priorities or priorities[-1] is not priority:
+ priorities.append(priority)
+ priorities.sort()
def discard(self, node):
"""
@@ -73,6 +75,26 @@ class digraph(object):
del self.nodes[node]
self.order.remove(node)
+ def update(self, other):
+ """
+ Add all nodes and edges from another digraph instance.
+ """
+ for node in other.order:
+ children, parents, node = other.nodes[node]
+ if parents:
+ for parent, priorities in parents.items():
+ for priority in priorities:
+ self.add(node, parent, priority=priority)
+ else:
+ self.add(node, None)
+
+ def clear(self):
+ """
+ Remove all nodes and edges.
+ """
+ self.nodes.clear()
+ del self.order[:]
+
def difference_update(self, t):
"""
Remove all given nodes from node_set. This is more efficient