class Molinillo::Resolver::Resolution

def binding_requirements_for_conflict(conflict)

Returns:
  • (Array) - minimal array of requirements that would cause the passed

Parameters:
  • conflict (Conflict) --
def binding_requirements_for_conflict(conflict)
  return [conflict.requirement] if conflict.possibility.nil?
  possible_binding_requirements = conflict.requirements.values.flatten(1).uniq
  # When there's a `CircularDependency` error the conflicting requirement
  # (the one causing the circular) won't be `conflict.requirement`
  # (which won't be for the right state, because we won't have created it,
  # because it's circular).
  # We need to make sure we have that requirement in the conflict's list,
  # otherwise we won't be able to unwind properly, so we just return all
  # the requirements for the conflict.
  return possible_binding_requirements if conflict.underlying_error
  possibilities = search_for(conflict.requirement)
  # If all the requirements together don't filter out all possibilities,
  # then the only two requirements we need to consider are the initial one
  # (where the dependency's version was first chosen) and the last
  if binding_requirement_in_set?(nil, possible_binding_requirements, possibilities)
    return [conflict.requirement, requirement_for_existing_name(name_for(conflict.requirement))].compact
  end
  # Loop through the possible binding requirements, removing each one
  # that doesn't bind. Use a `reverse_each` as we want the earliest set of
  # binding requirements, and don't use `reject!` as we wish to refine the
  # array *on each iteration*.
  binding_requirements = possible_binding_requirements.dup
  possible_binding_requirements.reverse_each do |req|
    next if req == conflict.requirement
    unless binding_requirement_in_set?(req, binding_requirements, possibilities)
      binding_requirements -= [req]
    end
  end
  binding_requirements
end