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
 

Reply via email to