[rubygems/rubygems] Install the best matching gem for the current platform in gem install

Instead of picking essentially a random matching platform

Signed-off-by: Samuel Giddins <segiddins@segiddins.me>

https://github.com/rubygems/rubygems/commit/3727096297
This commit is contained in:
Samuel Giddins 2025-06-05 11:26:17 -07:00 committed by Hiroshi SHIBATA
parent b5beb19825
commit 7e3d271f76
2 changed files with 33 additions and 1 deletions

View File

@ -241,7 +241,7 @@ class Gem::Resolver
sources.each do |source|
groups[source].
sort_by {|spec| [spec.version, spec.platform =~ Gem::Platform.local ? 1 : 0] }. # rubocop:disable Performance/RegexpMatch
sort_by {|spec| [spec.version, -Gem::Platform.platform_specificity_match(spec.platform, Gem::Platform.local)] }.
map {|spec| ActivationRequest.new spec, dependency }.
each {|activation_request| activation_requests << activation_request }
end

View File

@ -1005,6 +1005,38 @@ ERROR: Possible alternatives: non_existent_with_hint
assert_equal %W[a-3-#{local}], @cmd.installed_specs.map(&:full_name)
end
def test_install_gem_platform_specificity_match
util_set_arch "arm64-darwin-20"
spec_fetcher do |fetcher|
%w[ruby universal-darwin universal-darwin-20 x64-darwin-20 arm64-darwin-20].each do |platform|
fetcher.download "a", 3 do |s|
s.platform = platform
end
end
end
@cmd.install_gem "a", ">= 0"
assert_equal %w[a-3-arm64-darwin-20], @cmd.installed_specs.map(&:full_name)
end
def test_install_gem_platform_specificity_match_reverse_order
util_set_arch "arm64-darwin-20"
spec_fetcher do |fetcher|
%w[ruby universal-darwin universal-darwin-20 x64-darwin-20 arm64-darwin-20].reverse_each do |platform|
fetcher.download "a", 3 do |s|
s.platform = platform
end
end
end
@cmd.install_gem "a", ">= 0"
assert_equal %w[a-3-arm64-darwin-20], @cmd.installed_specs.map(&:full_name)
end
def test_install_gem_ignore_dependencies_specific_file
spec = util_spec "a", 2