commit: 994e109177b1b4209d8a64429ca7b01504be168a
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: Thu Sep 19 12:42:41 2024 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=994e1091
WIP Auto resolve cyclic USE conflicts by trying the first suggestion
Signed-off-by: James Le Cuirot <chewi <AT> gentoo.org>
lib/_emerge/depgraph.py | 27 ++++++++++++++++++++++-----
lib/_emerge/resolver/circular_dependency.py | 2 +-
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index 05bfbbc3e1..fe686a104c 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,30 @@ 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
-
- raise self._unknown_internal_error()
+ handler = circular_dependency_handler(self, mygraph)
+ if handler.solutions:
+ pkg = list(handler.solutions.keys())[0]
+ parent, solution = list(handler.solutions[pkg])[0]
+ solution = list(solution)[0]
+ enabled = list(parent.use.enabled)
+ if solution[1]:
+ enabled.append(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