class Bundler::Resolver

def solve_versions(root:, logger:)

def solve_versions(root:, logger:)
  solver = PubGrub::VersionSolver.new(source: self, root: root, logger: logger)
  result = solver.solve
  result.map {|package, version| version.to_specs(package) }.flatten.uniq
rescue PubGrub::SolveFailure => e
  incompatibility = e.incompatibility
  names_to_unlock, names_to_allow_prereleases_for, extended_explanation = find_names_to_relax(incompatibility)
  names_to_relax = names_to_unlock + names_to_allow_prereleases_for
  if names_to_relax.any?
    if names_to_unlock.any?
      Bundler.ui.debug "Found conflicts with locked dependencies. Will retry with #{names_to_unlock.join(", ")} unlocked...", true
      @base.unlock_names(names_to_unlock)
    end
    if names_to_allow_prereleases_for.any?
      Bundler.ui.debug "Found conflicts with dependencies with prereleases. Will retrying considering prereleases for #{names_to_allow_prereleases_for.join(", ")}...", true
      @base.include_prereleases(names_to_allow_prereleases_for)
    end
    root, logger = setup_solver
    Bundler.ui.debug "Retrying resolution...", true
    retry
  end
  explanation = e.message
  if extended_explanation
    explanation << "\n\n"
    explanation << extended_explanation
  end
  raise SolveFailure.new(explanation)
end