Optimize slot conflict backtracking for #337178.
authorZac Medico <zmedico@gentoo.org>
Wed, 6 Oct 2010 20:13:16 +0000 (13:13 -0700)
committerZac Medico <zmedico@gentoo.org>
Wed, 6 Oct 2010 20:13:16 +0000 (13:13 -0700)
This borrows logic from commit
fc33f34e3d060b57e03204fb427b01971f8dafff which fixes bug #337178
in the 2.1.9 branch. With this change,
BacktrackingTestCase.testBacktrackingGoodVersionFirst() is solved
with one less backtracking step.

pym/_emerge/depgraph.py

index 5ab42f68e1f4a55248bc96a548b857e0a2f02716..846d3ece56f7325335949a8b92f1661be952b5fc 100644 (file)
@@ -924,6 +924,19 @@ class depgraph(object):
                                                        # behavior if this gets triggered somehow.
                                                        backtrack_data = fallback_data
 
+                                               if len(backtrack_data) > 1:
+                                                       # NOTE: Generally, we prefer to mask the higher
+                                                       # version since this solves common cases in which a
+                                                       # lower version is needed so that all dependencies
+                                                       # will be satisfied (bug #337178). However, if
+                                                       # existing_node happens to be installed then we
+                                                       # mask that since this is a common case that is
+                                                       # triggered when --update is not enabled.
+                                                       if existing_node.installed:
+                                                               pass
+                                                       elif pkg > existing_node:
+                                                               backtrack_data.reverse()
+
                                                to_be_masked = backtrack_data[-1][0]
 
                                                self._dynamic_config._backtrack_infos["slot conflict"] = backtrack_data