Preview Ruby 4.1 is a preview. It can change before the final release. Switch to Ruby 4.0 →
instance method
Gem::Resolver#all_versions_for
all_versions_for(package)
lib/rubygems/resolver.rb
View on GitHub ↗
# File tmp/rubies/ruby-4.1.0-preview1/lib/rubygems/resolver.rb, line 198
def all_versions_for(package)
versions = @sorted_versions[package].reverse # highest first
name = package.to_s
if (skip_dep_gems = skip_gems[name]) && !skip_dep_gems.empty?
# Conservative mode: float the already-installed (skip) versions to the
# front so the solver prefers them. This sets *preference* only (it feeds
# the strategy's version-index map); it does not restrict availability, so
# every version stays selectable via versions_for. When an installed
# version is made impossible by a downstream conflict, the solver
# backtracks to a newer version instead of failing. Molinillo instead
# hard-restricted the candidate set to skip versions and raised.
#
# This reaches the same outcome as Bundler (upgrade-over-raise) for the
# common single-blocked-gem case, though the mechanism differs: Bundler
# hard-pins locked gems and selectively unlocks + re-solves on conflict,
# whereas we float as a preference and let PubGrub backtrack in one solve.
# The float can therefore over-upgrade when several installed gems are
# jointly involved in a conflict; that outcome-level divergence is
# accepted (see test_conservative_upgrades_when_installed_blocked).
skip_versions = skip_dep_gems.map(&:version)
preferred, rest = versions.partition {|v| skip_versions.include?(v) }
preferred + rest
else
# Prefer already-installed versions to avoid unnecessary upgrades
installed_versions = @all_specs[name].
select {|s| s.is_a?(Gem::Resolver::InstalledSpecification) }.
map(&:version)
if installed_versions.any?
preferred, rest = versions.partition {|v| installed_versions.include?(v) }
preferred + rest
else
versions
end
end
end
PubGrub source interface methods