commit:     c8c038fd4c201a582c420004b5ff759f28fe626b
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Wed Apr 19 04:39:31 2017 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Thu Apr 20 19:39:00 2017 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=c8c038fd

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 <AT> gentoo.org>

 pym/portage/tests/util/test_digraph.py |  4 +++-
 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

Reply via email to