In depgraph.altlist(), measure the bias of circular
authorZac Medico <zmedico@gentoo.org>
Thu, 22 Nov 2007 06:12:43 +0000 (06:12 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 22 Nov 2007 06:12:43 +0000 (06:12 -0000)
RDEPEND <-> PDEPEND relationships and use it to
optimize merge order.

svn path=/main/trunk/; revision=8593

pym/_emerge/__init__.py

index 50cca0513cb477aa48d919a306ef46ce80679043..8223b2a76caf384a0e5f5db6918980db2f1c66fe 100644 (file)
@@ -2830,6 +2830,21 @@ class depgraph(object):
                        if not removed_something:
                                break
                self._merge_order_bias(mygraph)
+               def cmp_circular_bias(n1, n2):
+                       """
+                       RDEPEND is stronger than PDEPEND and this function
+                       measures such a strength bias within a circular
+                       dependency relationship.
+                       """
+                       n1_n2_medium = n2 in mygraph.child_nodes(n1,
+                               ignore_priority=DepPriority.MEDIUM_SOFT)
+                       n2_n1_medium = n1 in mygraph.child_nodes(n2,
+                               ignore_priority=DepPriority.MEDIUM_SOFT)
+                       if n1_n2_medium == n2_n1_medium:
+                               return 0
+                       elif n1_n2_medium:
+                               return 1
+                       return -1
                myblockers = self.blocker_digraph.copy()
                retlist=[]
                circular_blocks = False
@@ -2997,6 +3012,11 @@ class depgraph(object):
                                                        continue
                                                asap_nodes.append(child)
 
+                       if selected_nodes and len(selected_nodes) > 1:
+                               if not isinstance(selected_nodes, list):
+                                       selected_nodes = list(selected_nodes)
+                               selected_nodes.sort(cmp_circular_bias)
+
                        if not selected_nodes:
                                if not myblockers.is_empty():
                                        """A blocker couldn't be circumnavigated while keeping all