diff options
author | Zac Medico <zmedico@gentoo.org> | 2017-04-18 21:39:31 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2017-04-20 12:39:00 -0700 |
commit | c8c038fd4c201a582c420004b5ff759f28fe626b (patch) | |
tree | 48f1a2076d4ed4b4472655993177fb864ee2505b | |
parent | dosym: Make implicit basename a fatal error. (diff) | |
download | portage-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.py | 4 | ||||
-rw-r--r-- | pym/portage/util/digraph.py | 26 |
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 |