class Molinillo::Resolver::Resolution

def build_details_for_unwind

Returns:
  • (UnwindDetails) - Details of the nearest index to which we could unwind
def build_details_for_unwind
  # Get the possible unwinds for the current conflict
  current_conflict = conflicts[name]
  binding_requirements = binding_requirements_for_conflict(current_conflict)
  unwind_details = unwind_options_for_requirements(binding_requirements)
  last_detail_for_current_unwind = unwind_details.sort.last
  current_detail = last_detail_for_current_unwind
  # Look for past conflicts that could be unwound to affect the
  # requirement tree for the current conflict
  all_reqs = last_detail_for_current_unwind.all_requirements
  all_reqs_size = all_reqs.size
  relevant_unused_unwinds = unused_unwind_options.select do |alternative|
    diff_reqs = all_reqs - alternative.requirements_unwound_to_instead
    next if diff_reqs.size == all_reqs_size
    # Find the highest index unwind whilst looping through
    current_detail = alternative if alternative > current_detail
    alternative
  end
  # Add the current unwind options to the `unused_unwind_options` array.
  # The "used" option will be filtered out during `unwind_for_conflict`.
  state.unused_unwind_options += unwind_details.reject { |detail| detail.state_index == -1 }
  # Update the requirements_unwound_to_instead on any relevant unused unwinds
  relevant_unused_unwinds.each do |d|
    (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
  end
  unwind_details.each do |d|
    (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
  end
  current_detail
end