Skip to content

Commit

Permalink
WIP Auto resolve cyclic USE conflicts by trying the first suggestion
Browse files Browse the repository at this point in the history
Signed-off-by: James Le Cuirot <[email protected]>
  • Loading branch information
chewi committed Sep 18, 2024
1 parent b0ceebc commit 2e25572
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
29 changes: 22 additions & 7 deletions lib/_emerge/depgraph.py
Original file line number Diff line number Diff line change
Expand Up @@ -9886,6 +9886,9 @@ def find_smallest_cycle(mergeable_nodes, local_priority_range):
drop_satisfied = True
continue

if not selected_nodes:
circular_dep_handler = circular_dependency_handler(self, mygraph)

if not selected_nodes and myblocker_uninstalls:
# If possible, drop an uninstall task here in order to avoid
# the circular deps code path. The corresponding blocker will
Expand All @@ -9897,8 +9900,9 @@ def find_smallest_cycle(mergeable_nodes, local_priority_range):
except KeyError:
pass
else:
uninst_task = node
ignored_uninstall_tasks.add(node)
if not circular_dep_handler.solutions:
uninst_task = node
ignored_uninstall_tasks.add(node)
break

if uninst_task is not None:
Expand All @@ -9909,8 +9913,6 @@ def find_smallest_cycle(mergeable_nodes, local_priority_range):
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
Expand All @@ -9935,11 +9937,24 @@ def find_smallest_cycle(mergeable_nodes, local_priority_range):
)

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()
if circular_dep_handler.solutions:
pkg = list(circular_dep_handler.solutions.keys())[0]
parent, solution = list(circular_dep_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]
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.
Expand Down
2 changes: 1 addition & 1 deletion lib/_emerge/resolver/circular_dependency.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ def _find_suggestions(self):
" (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

Expand Down

0 comments on commit 2e25572

Please sign in to comment.