diff options
author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2021-12-14 21:14:58 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2021-12-15 18:05:18 +0900 |
commit | 7e084ed707310139b351f6d30af435676422af62 (patch) | |
tree | db7450ae96ccd8d90287e33412769230da247242 | |
parent | 583e06e28f5ed4078393000f929f4380777ba972 (diff) |
Merge RubyGems and Bundler master
Merge from https://github.com/rubygems/rubygems/commit/793ad95ecb40e84a1dcb4cb60f2686843ed90de5
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5265
-rw-r--r-- | lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb | 4 | ||||
-rw-r--r-- | lib/rubygems.rb | 43 | ||||
-rw-r--r-- | lib/rubygems/commands/setup_command.rb | 4 | ||||
-rw-r--r-- | lib/rubygems/requirement.rb | 2 | ||||
-rw-r--r-- | lib/rubygems/specification.rb | 20 | ||||
-rw-r--r-- | lib/rubygems/version.rb | 7 | ||||
-rw-r--r-- | spec/bundler/commands/clean_spec.rb | 2 | ||||
-rw-r--r-- | spec/bundler/commands/exec_spec.rb | 12 | ||||
-rw-r--r-- | spec/bundler/install/gems/standalone_spec.rb | 2 | ||||
-rw-r--r-- | test/rubygems/test_gem_specification.rb | 6 | ||||
-rw-r--r-- | test/rubygems/test_project_sanity.rb | 12 | ||||
-rw-r--r-- | test/rubygems/test_rubygems.rb | 23 | ||||
-rw-r--r-- | tool/bundler/rubocop_gems.rb.lock | 1 | ||||
-rw-r--r-- | tool/bundler/standard_gems.rb.lock | 1 |
14 files changed, 73 insertions, 66 deletions
diff --git a/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb b/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb index 9d94c2c0f0..880170c06b 100644 --- a/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +++ b/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb @@ -32,13 +32,13 @@ class Bundler::ConnectionPool # rubocop:disable Style/MethodMissingSuper # rubocop:disable Style/MissingRespondToMissing - if ::Gem.ruby_version >= ::Gem::Version.new("3.0.0") + if ::RUBY_VERSION >= "3.0.0" def method_missing(name, *args, **kwargs, &block) with do |connection| connection.send(name, *args, **kwargs, &block) end end - elsif ::Gem.ruby_version >= ::Gem::Version.new("2.7.0") + elsif ::RUBY_VERSION >= "2.7.0" ruby2_keywords def method_missing(name, *args, &block) with do |connection| connection.send(name, *args, &block) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index f803e47628..b7dda38d52 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -1293,7 +1293,12 @@ An Array (#{env.inspect}) was passed in from #{caller[3]} end def default_gem_load_paths - @default_gem_load_paths ||= $LOAD_PATH[load_path_insert_index..-1] + @default_gem_load_paths ||= $LOAD_PATH[load_path_insert_index..-1].map do |lp| + expanded = File.expand_path(lp) + next expanded unless File.exist?(expanded) + + File.realpath(expanded) + end end end @@ -1310,39 +1315,21 @@ An Array (#{env.inspect}) was passed in from #{caller[3]} autoload :Licenses, File.expand_path('rubygems/util/licenses', __dir__) autoload :NameTuple, File.expand_path('rubygems/name_tuple', __dir__) autoload :PathSupport, File.expand_path('rubygems/path_support', __dir__) - autoload :Platform, File.expand_path('rubygems/platform', __dir__) autoload :RequestSet, File.expand_path('rubygems/request_set', __dir__) - autoload :Requirement, File.expand_path('rubygems/requirement', __dir__) autoload :Resolver, File.expand_path('rubygems/resolver', __dir__) autoload :Source, File.expand_path('rubygems/source', __dir__) autoload :SourceList, File.expand_path('rubygems/source_list', __dir__) autoload :SpecFetcher, File.expand_path('rubygems/spec_fetcher', __dir__) - autoload :Specification, File.expand_path('rubygems/specification', __dir__) autoload :Util, File.expand_path('rubygems/util', __dir__) autoload :Version, File.expand_path('rubygems/version', __dir__) end require_relative 'rubygems/exceptions' +require_relative 'rubygems/specification' # REFACTOR: This should be pulled out into some kind of hacks file. begin ## - # Defaults the Ruby implementation wants to provide for RubyGems - - require "rubygems/defaults/#{RUBY_ENGINE}" -rescue LoadError -end - -## -# Loads the default specs. -Gem::Specification.load_defaults - -require_relative 'rubygems/core_ext/kernel_gem' -require_relative 'rubygems/core_ext/kernel_require' -require_relative 'rubygems/core_ext/kernel_warn' - -begin - ## # Defaults the operating system (or packager) wants to provide for RubyGems. require 'rubygems/defaults/operating_system' @@ -1356,3 +1343,19 @@ rescue StandardError => e "the problem and ask for help." raise e.class, msg end + +begin + ## + # Defaults the Ruby implementation wants to provide for RubyGems + + require "rubygems/defaults/#{RUBY_ENGINE}" +rescue LoadError +end + +## +# Loads the default specs. +Gem::Specification.load_defaults + +require_relative 'rubygems/core_ext/kernel_gem' +require_relative 'rubygems/core_ext/kernel_require' +require_relative 'rubygems/core_ext/kernel_warn' diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb index ed1fcaa4b8..0601dccb07 100644 --- a/lib/rubygems/commands/setup_command.rb +++ b/lib/rubygems/commands/setup_command.rb @@ -12,8 +12,6 @@ class Gem::Commands::SetupCommand < Gem::Command ENV_PATHS = %w[/usr/bin/env /bin/env].freeze def initialize - require 'tmpdir' - super 'setup', 'Install RubyGems', :format_executable => false, :document => %w[ri], :force => true, @@ -253,6 +251,8 @@ By default, this RubyGems will install gem as: Dir.chdir path do bin_file = "gem" + require 'tmpdir' + dest_file = target_bin_path(bin_dir, bin_file) bin_tmp_file = File.join Dir.tmpdir, "#{bin_file}.#{$$}" diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb index d2e28fab5b..9edd6aa7d3 100644 --- a/lib/rubygems/requirement.rb +++ b/lib/rubygems/requirement.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -require_relative "deprecate" +require_relative "version" ## # A Requirement is a set of one or more version restrictions. It supports a diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 40a5bddff6..dc5e5ba013 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -9,6 +9,8 @@ require_relative 'deprecate' require_relative 'basic_specification' require_relative 'stub_specification' +require_relative 'platform' +require_relative 'requirement' require_relative 'specification_policy' require_relative 'util/list' @@ -179,18 +181,14 @@ class Gem::Specification < Gem::BasicSpecification end def self.clear_specs # :nodoc: - @@all_specs_mutex.synchronize do - @@all = nil - @@stubs = nil - @@stubs_by_name = {} - @@spec_with_requirable_file = {} - @@active_stub_with_requirable_file = {} - end + @@all = nil + @@stubs = nil + @@stubs_by_name = {} + @@spec_with_requirable_file = {} + @@active_stub_with_requirable_file = {} end private_class_method :clear_specs - @@all_specs_mutex = Thread::Mutex.new - clear_specs # Sentinel object to represent "not found" stubs @@ -758,7 +756,7 @@ class Gem::Specification < Gem::BasicSpecification attr_accessor :specification_version def self._all # :nodoc: - @@all_specs_mutex.synchronize { @@all ||= Gem.loaded_specs.values | stubs.map(&:to_spec) } + @@all ||= Gem.loaded_specs.values | stubs.map(&:to_spec) end def self.clear_load_cache # :nodoc: @@ -1086,7 +1084,7 @@ class Gem::Specification < Gem::BasicSpecification # +prerelease+ is true. def self.latest_specs(prerelease = false) - _latest_specs Gem::Specification._all, prerelease + _latest_specs Gem::Specification.stubs, prerelease end ## diff --git a/lib/rubygems/version.rb b/lib/rubygems/version.rb index 37fd71edc0..42e0f23505 100644 --- a/lib/rubygems/version.rb +++ b/lib/rubygems/version.rb @@ -149,13 +149,6 @@ # For the last example, single-digit versions are automatically extended with # a zero to give a sensible result. -# Our code style opens classes directly without opening the intermediate -# modules. This works because tha main entrypoint `rubygems.rb`, which defines -# the root `Gem` module, is usually required first. But in this case we want to -# allow using `Gem::Version` without loading the rest of rubygems, so we -# explicit define the `Gem` placeholder module first. -module Gem; end - require_relative "deprecate" class Gem::Version diff --git a/spec/bundler/commands/clean_spec.rb b/spec/bundler/commands/clean_spec.rb index ffaf22dbb3..65231b35fa 100644 --- a/spec/bundler/commands/clean_spec.rb +++ b/spec/bundler/commands/clean_spec.rb @@ -638,7 +638,7 @@ RSpec.describe "bundle clean" do s.executables = "irb" end - realworld_system_gems "fiddle --version 1.0.6", "tsort --version 0.1.0", "pathname --version 0.1.0", "set --version 1.0.1" + realworld_system_gems "fiddle --version 1.0.8", "tsort --version 0.1.0", "pathname --version 0.1.0", "set --version 1.0.1" install_gemfile <<-G source "#{file_uri_for(gem_repo2)}" diff --git a/spec/bundler/commands/exec_spec.rb b/spec/bundler/commands/exec_spec.rb index 2c4c33f374..e67e5b96ef 100644 --- a/spec/bundler/commands/exec_spec.rb +++ b/spec/bundler/commands/exec_spec.rb @@ -614,20 +614,20 @@ RSpec.describe "bundle exec" do it "loads the correct optparse when `auto_install` is set, and optparse is a dependency" do if Gem.ruby_version >= Gem::Version.new("3.0.0") && Gem.rubygems_version < Gem::Version.new("3.3.0.a") - skip "optparse is a default gem, and rubygems loads install during install" + skip "optparse is a default gem, and rubygems loads it during install" end build_repo4 do build_gem "fastlane", "2.192.0" do |s| s.executables = "fastlane" - s.add_dependency "optparse", "~> 0.1.1" + s.add_dependency "optparse", "~> 999.999.999" end - build_gem "optparse", "0.1.0" - build_gem "optparse", "0.1.1" + build_gem "optparse", "999.999.998" + build_gem "optparse", "999.999.999" end - system_gems "optparse-0.1.0", :gem_repo => gem_repo4 + system_gems "optparse-999.999.998", :gem_repo => gem_repo4 bundle "config set auto_install 1" bundle "config set --local path vendor/bundle" @@ -638,7 +638,7 @@ RSpec.describe "bundle exec" do G bundle "exec fastlane" - expect(out).to include("Installing optparse 0.1.1") + expect(out).to include("Installing optparse 999.999.999") expect(out).to include("2.192.0") end diff --git a/spec/bundler/install/gems/standalone_spec.rb b/spec/bundler/install/gems/standalone_spec.rb index db16a1b0e1..faefda25f4 100644 --- a/spec/bundler/install/gems/standalone_spec.rb +++ b/spec/bundler/install/gems/standalone_spec.rb @@ -113,7 +113,7 @@ RSpec.shared_examples "bundle install --standalone" do skip "does not work on rubygems versions where `--install_dir` doesn't respect --default" unless Gem::Installer.for_spec(loaded_gemspec, :install_dir => "/foo").default_spec_file == "/foo/specifications/default/bundler-#{Bundler::VERSION}.gemspec" # Since rubygems 3.2.0.rc.2 skip "does not work on old rubies because the realworld gems that need to be installed don't support them" if RUBY_VERSION < "2.7.0" - realworld_system_gems "fiddle --version 1.0.6", "tsort --version 0.1.0" + realworld_system_gems "fiddle --version 1.0.8", "tsort --version 0.1.0" necessary_system_gems = ["optparse --version 0.1.1", "psych --version 3.3.2", "yaml --version 0.1.1", "logger --version 1.4.3", "etc --version 1.2.0", "stringio --version 3.0.0"] necessary_system_gems += ["shellwords --version 0.1.0", "base64 --version 0.1.0", "resolv --version 0.2.1"] if Gem.rubygems_version < Gem::Version.new("3.3.3.a") diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index bfd0db347e..375bacf9bd 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -944,7 +944,7 @@ dependencies: [] end def test_self_outdated_and_latest_remotes - specs = spec_fetcher do |fetcher| + spec_fetcher do |fetcher| fetcher.download 'a', 4 fetcher.download 'b', 3 @@ -953,8 +953,8 @@ dependencies: [] end expected = [ - [specs['a-3.a'], v(4)], - [specs['b-2'], v(3)], + [Gem::Specification.stubs.find {|s| s.full_name == 'a-3.a' }, v(4)], + [Gem::Specification.stubs.find {|s| s.full_name == 'b-2' }, v(3)], ] assert_equal expected, Gem::Specification.outdated_and_latest_version.to_a diff --git a/test/rubygems/test_project_sanity.rb b/test/rubygems/test_project_sanity.rb index 4324c997bd..38c2541df6 100644 --- a/test/rubygems/test_project_sanity.rb +++ b/test/rubygems/test_project_sanity.rb @@ -17,16 +17,4 @@ class TestProjectSanity < Gem::TestCase assert status.success?, err end - - def test_require_and_use_rubygems_version - err, status = Open3.capture2e( - *ruby_with_rubygems_in_load_path, - "--disable-gems", - "-rrubygems/version", - "-e", - "Gem::Version.new('2.7.0.preview1') >= Gem::Version.new(RUBY_VERSION)" - ) - - assert status.success?, err - end end diff --git a/test/rubygems/test_rubygems.rb b/test/rubygems/test_rubygems.rb index 493b9fdf4a..fa77a29932 100644 --- a/test/rubygems/test_rubygems.rb +++ b/test/rubygems/test_rubygems.rb @@ -22,6 +22,29 @@ class GemTest < Gem::TestCase "the problem and ask for help." end + def test_operating_system_customizing_default_dir + pend "does not apply to truffleruby" if RUBY_ENGINE == 'truffleruby' + pend "loads a custom defaults/jruby file that gets in the middle" if RUBY_ENGINE == 'jruby' + + # On a non existing default dir, there should be no gems + + path = util_install_operating_system_rb <<-RUBY + module Gem + def self.default_dir + File.expand_path("foo") + end + end + RUBY + + output = Gem::Util.popen( + *ruby_with_rubygems_and_fake_operating_system_in_load_path(path), + '-e', + "require \"rubygems\"; puts Gem::Specification.stubs.map(&:full_name)", + {:err => [:child, :out]} + ).strip + assert_empty output + end + private def util_install_operating_system_rb(content) diff --git a/tool/bundler/rubocop_gems.rb.lock b/tool/bundler/rubocop_gems.rb.lock index 8d1e9c759c..ca0fb5c613 100644 --- a/tool/bundler/rubocop_gems.rb.lock +++ b/tool/bundler/rubocop_gems.rb.lock @@ -45,6 +45,7 @@ GEM PLATFORMS arm64-darwin-20 + arm64-darwin-21 universal-java-11 x86_64-darwin-19 x86_64-darwin-20 diff --git a/tool/bundler/standard_gems.rb.lock b/tool/bundler/standard_gems.rb.lock index 68186165c3..af22080659 100644 --- a/tool/bundler/standard_gems.rb.lock +++ b/tool/bundler/standard_gems.rb.lock @@ -51,6 +51,7 @@ GEM PLATFORMS arm64-darwin-20 + arm64-darwin-21 universal-java-11 x86_64-darwin-19 x86_64-darwin-20 |