commit: a4bc418f9c6a00c7b67209f37cad990e144d7478
Author: James Le Cuirot <chewi <AT> gentoo <DOT> org>
AuthorDate: Wed Sep 18 11:21:55 2024 +0000
Commit: James Le Cuirot <chewi <AT> gentoo <DOT> org>
CommitDate: Mon Sep 23 16:19:13 2024 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=a4bc418f
WIP Auto resolve cyclic USE conflicts by trying the first suggestion
It only works when there is one conflicting cycle. It gets too
complicated when there is more than one.
Signed-off-by: James Le Cuirot <chewi <AT> gentoo.org>
lib/_emerge/depgraph.py | 28 ++++++++++++++++++++++++----
lib/_emerge/resolver/circular_dependency.py | 2 +-
2 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index 05bfbbc3e1..7ca5b3caf3 100644
--- a/lib/_emerge/depgraph.py
+++ b/lib/_emerge/depgraph.py
@@ -9901,8 +9901,6 @@ class depgraph:
continue
if not selected_nodes:
- self._dynamic_config._circular_deps_for_display = mygraph
-
unsolved_cycle = False
if self._dynamic_config._allow_backtracking:
backtrack_infos = self._dynamic_config._backtrack_infos
@@ -9927,11 +9925,33 @@ class depgraph:
)
if unsolved_cycle or not
self._dynamic_config._allow_backtracking:
+ self._dynamic_config._circular_deps_for_display = mygraph
self._dynamic_config._skip_restart = True
+ raise self._unknown_internal_error()
else:
- self._dynamic_config._need_restart = True
+ handler = circular_dependency_handler(self, mygraph)
- raise self._unknown_internal_error()
+ if handler.solutions and len(handler.cycles) == 2:
+ pkg = list(handler.solutions.keys())[0]
+ parent, solution = list(handler.solutions[pkg])[0]
+ solution = list(solution)[0]
+ enabled = set(parent.use.enabled)
+
+ if solution[1]:
+ enabled.add(solution[0])
+ else:
+ enabled.remove(solution[0])
+
+ selected_nodes = [parent.with_use(enabled), pkg,
parent]
+ ignored_uninstall_tasks = set(
+ uninst_task
+ for uninst_task in ignored_uninstall_tasks
+ if uninst_task.cp != pkg.cp or uninst_task.slot !=
pkg.slot
+ )
+ else:
+ self._dynamic_config._circular_deps_for_display =
mygraph
+ self._dynamic_config._need_restart = True
+ raise self._unknown_internal_error()
# At this point, we've succeeded in selecting one or more nodes, so
# reset state variables for leaf node selection.
diff --git a/lib/_emerge/resolver/circular_dependency.py
b/lib/_emerge/resolver/circular_dependency.py
index 6c21423083..09b1afebfb 100644
--- a/lib/_emerge/resolver/circular_dependency.py
+++ b/lib/_emerge/resolver/circular_dependency.py
@@ -293,7 +293,7 @@ class circular_dependency_handler:
" (This change might require USE changes on parent
packages.)"
)
suggestions.append(msg)
- final_solutions.setdefault(pkg, set()).add(solution)
+ final_solutions.setdefault(pkg, set()).add((parent, solution))
return final_solutions, suggestions