summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2024-06-13 13:21:53 +0200
committergit <svn-admin@ruby-lang.org>2024-06-13 14:25:14 +0000
commit5c573b7652ec88995ba2a6172a10f6d98e4b2dcd (patch)
treefd6ee859a1ea16ddc3f9261ac38375c34cfb5c88
parent8b843b0dc775a2a91d5aa1fbef75dac3a9cd589c (diff)
[rubygems/rubygems] Fix default gem priority when sorting specs
https://github.com/rubygems/rubygems/commit/8dbe1dbdc7 Co-authored-by: MSP-Greg <Greg.mpls@gmail.com>
-rw-r--r--lib/rubygems/basic_specification.rb7
-rw-r--r--lib/rubygems/specification.rb2
-rw-r--r--test/rubygems/test_require.rb16
3 files changed, 25 insertions, 0 deletions
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
@@ -99,6 +99,13 @@ class Gem::BasicSpecification
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.
def extension_dir
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)