From 5c573b7652ec88995ba2a6172a10f6d98e4b2dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 13 Jun 2024 13:21:53 +0200 Subject: [PATCH] [rubygems/rubygems] Fix default gem priority when sorting specs https://github.com/rubygems/rubygems/commit/8dbe1dbdc7 Co-authored-by: MSP-Greg --- lib/rubygems/basic_specification.rb | 7 +++++++ lib/rubygems/specification.rb | 2 ++ test/rubygems/test_require.rb | 16 ++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb index f25756f92c..0bb139f861 100644 --- a/lib/rubygems/basic_specification.rb +++ b/lib/rubygems/basic_specification.rb @@ -98,6 +98,13 @@ class Gem::BasicSpecification File.dirname(loaded_from) == Gem.default_specifications_dir end + ## + # Regular gems take precedence over default gems + + def default_gem_priority + default_gem? ? 1 : -1 + end + ## # Returns full path to the directory where gem's extensions are installed. diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index da55a2e6d3..99d2a96def 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -832,6 +832,8 @@ class Gem::Specification < Gem::BasicSpecification next versions if versions.nonzero? platforms = Gem::Platform.sort_priority(b.platform) <=> Gem::Platform.sort_priority(a.platform) next platforms if platforms.nonzero? + default_gem = a.default_gem_priority <=> b.default_gem_priority + next default_gem if default_gem.nonzero? b.base_dir == Gem.path.first ? 1 : -1 end end diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb index 30a4a477f9..42a31452ae 100644 --- a/test/rubygems/test_require.rb +++ b/test/rubygems/test_require.rb @@ -489,6 +489,22 @@ class TestGemRequire < Gem::TestCase assert_equal %w[default-3.0], loaded_spec_names end + def test_default_gem_and_normal_gem_same_version + default_gem_spec = new_default_spec("default", "3.0", + nil, "default/gem.rb") + install_default_gems(default_gem_spec) + normal_gem_spec = util_spec("default", "3.0", nil, + "lib/default/gem.rb") + install_specs(normal_gem_spec) + + # Load default ruby gems fresh as if we've just started a ruby script. + Gem::Specification.reset + + assert_require "default/gem" + assert_equal %w[default-3.0], loaded_spec_names + refute Gem.loaded_specs["default"].default_gem? + end + def test_normal_gem_does_not_shadow_default_gem default_gem_spec = new_default_spec("foo", "2.0", nil, "foo.rb") install_default_gems(default_gem_spec)