From 043055121524028502fe2f814cc0a5e5dfdd1818 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 3 Mar 2023 16:30:39 +0900 Subject: [PATCH 1/2] Introduce Gem::Specification.find_by_full_name for finding conbination of name and version for gemspec --- lib/rubygems/specification.rb | 6 ++++++ test/rubygems/test_gem_specification.rb | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 01798fb8a28f..d4640c12f020 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1021,6 +1021,12 @@ def self.find_by_name(name, *requirements) Gem::Dependency.new(name, *requirements).to_spec end + ## + # Find the best specification matching a +full_name+. + def self.find_by_full_name(full_name) + stubs.find {|s| s.full_name == full_name }&.to_spec + end + ## # Return the best specification that contains the file matching +path+. diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index 1952192abab8..56ca7acaf272 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -3726,6 +3726,23 @@ def test_find_by_name_prerelease assert Gem::Specification.find_by_name "b", ">1" end + def test_find_by_full_name + pl = Gem::Platform.new "x86_64-linux" + + a = util_spec "a", "1" + install_specs a + + a_pl = util_spec("a", "1") {|s| s.platform = pl } + install_specs a_pl + + assert_equal a, Gem::Specification.find_by_full_name("a-1") + assert_equal a_pl, Gem::Specification.find_by_full_name("a-1-x86_64-linux") + + assert_nil Gem::Specification.find_by_full_name("a-2") + assert_nil Gem::Specification.find_by_full_name("b-1") + assert_nil Gem::Specification.find_by_full_name("a-1-arm64-linux") + end + def test_find_by_path a = util_spec "foo", "1", nil, "lib/foo.rb" From 2157aa8ec8201f761d0355b617635119741eb74d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 3 Mar 2023 18:19:23 +0900 Subject: [PATCH 2/2] Build default gems same as fresh installtion. Current implementation tried to build installation artifact. But default gems didn't provide normal gem files. So, It's always build failure. https://github.com/ruby/bigdecimal/actions/runs/4269574995/jobs/7432842788 ERROR: Error installing pkg/bigdecimal-3.1.4.gem: ERROR: Failed to build gem native extension. No such file or directory @ dir_s_mkdir - /Users/runner/.rubies/ruby-head/lib/ruby/gems/3.3.0+0/gems/bigdecimal-3.1.4/ext/bigdecimal/.gem.20230225-2301-2mul99 Gem files will remain installed in /Users/runner/.rubies/ruby-head/lib/ruby/gems/3.3.0+0/gems/bigdecimal-3.1.4 for inspection. Results logged to /Users/runner/.rubies/ruby-head/lib/ruby/gems/3.3.0+0/extensions/x86_64-darwin-19/3.3.0+0/bigdecimal-3.1.4/gem_make.out --- lib/rubygems/specification.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index d4640c12f020..6b61e8d2bc6f 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1612,6 +1612,8 @@ def build_args def build_extensions # :nodoc: return if extensions.empty? return if default_gem? + # we need to fresh build when same name and version of default gems + return if self.class.find_by_full_name(full_name)&.default_gem? return if File.exist? gem_build_complete_path return if !File.writable?(base_dir) return if !File.exist?(File.join(base_dir, "extensions"))