[前][次][番号順一覧][スレッド一覧]

ruby-changes:73774

From: David <ko1@a...>
Date: Thu, 29 Sep 2022 03:42:09 +0900 (JST)
Subject: [ruby-changes:73774] 668e78f01b (master): [rubygems/rubygems] Only activate bundler when needed

https://git.ruby-lang.org/ruby.git/commit/?id=668e78f01b

From 668e78f01b99085dad4840bbde15a538abb4df90 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@r...>
Date: Sat, 4 Dec 2021 13:15:32 +0100
Subject: [rubygems/rubygems] Only activate bundler when needed

Loading Bundler beforehand was actually replacing ENV with a backup of
the pre-Bundler environment through `Bundler::EnvironmentPreserver`. I
think that was making a bug in `ENV.replace` not bite our tests, because
Bundler includes proper patches to workaround that issue. So this commit
also includes these patches in RubyGems tests.

https://github.com/rubygems/rubygems/commit/8e079149b9
---
 test/rubygems/helper.rb   |  30 ++--
 test/rubygems/test_gem.rb | 449 +++++++++++++++++++++++++---------------------
 2 files changed, 266 insertions(+), 213 deletions(-)

diff --git a/test/rubygems/helper.rb b/test/rubygems/helper.rb
index 1ab23c2983..ae89d669fe 100644
--- a/test/rubygems/helper.rb
+++ b/test/rubygems/helper.rb
@@ -2,21 +2,11 @@ https://github.com/ruby/ruby/blob/trunk/test/rubygems/helper.rb#L2
 
 require "rubygems"
 
-# If bundler gemspec exists, add to stubs
-bundler_gemspec = File.expand_path("../../bundler/bundler.gemspec", __dir__)
-if File.exist?(bundler_gemspec)
-  Gem::Specification.dirs.unshift File.dirname(bundler_gemspec)
-  Gem::Specification.class_variable_set :@@stubs, nil
-  Gem::Specification.stubs
-  Gem::Specification.dirs.shift
-end
-
 begin
   gem "test-unit", "~> 3.0"
 rescue Gem::LoadError
 end
 
-require "bundler"
 require "test/unit"
 
 ENV["JARS_SKIP"] = "true" if Gem.java_platform? # avoid unnecessary and noisy `jar-dependencies` post install hook
@@ -404,7 +394,6 @@ class Gem::TestCase < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/helper.rb#L394
     Gem.loaded_specs.clear
     Gem.instance_variable_set(:@activated_gem_paths, 0)
     Gem.clear_default_specs
-    Bundler.reset!
 
     Gem.configuration.verbose = true
     Gem.configuration.update_sources = true
@@ -460,7 +449,7 @@ class Gem::TestCase < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/helper.rb#L449
 
     FileUtils.rm_rf @tempdir
 
-    ENV.replace(@orig_env)
+    restore_env
 
     Gem::ConfigFile.send :remove_const, :SYSTEM_WIDE_CONFIG_FILE
     Gem::ConfigFile.send :const_set, :SYSTEM_WIDE_CONFIG_FILE,
@@ -1581,6 +1570,23 @@ Also, a list: https://github.com/ruby/ruby/blob/trunk/test/rubygems/helper.rb#L1570
     PUBLIC_KEY  = nil
     PUBLIC_CERT = nil
   end if Gem::HAVE_OPENSSL
+
+  private
+
+  def restore_env
+    unless Gem.win_platform?
+      ENV.replace(@orig_env)
+      return
+    end
+
+    # Fallback logic for Windows below to workaround
+    # https://bugs.ruby-lang.org/issues/16798. Can be dropped once all
+    # supported rubies include the fix for that.
+
+    ENV.clear
+
+    @orig_env.each {|k, v| ENV[k] = v }
+  end
 end
 
 # https://github.com/seattlerb/minitest/blob/13c48a03d84a2a87855a4de0c959f96800100357/lib/minitest/mock.rb#L192
diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
index 8ed374eb0b..02d128f352 100644
--- a/test/rubygems/test_gem.rb
+++ b/test/rubygems/test_gem.rb
@@ -615,20 +615,22 @@ class TestGem < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem.rb#L615
   end
 
   def test_self_use_gemdeps
-    with_rubygems_gemdeps("-") do
-      FileUtils.mkdir_p "detect/a/b"
-      FileUtils.mkdir_p "detect/a/Isolate"
+    with_local_bundler do
+      with_rubygems_gemdeps("-") do
+        FileUtils.mkdir_p "detect/a/b"
+        FileUtils.mkdir_p "detect/a/Isolate"
 
-      FileUtils.touch "detect/Isolate"
+        FileUtils.touch "detect/Isolate"
 
-      begin
-        Dir.chdir "detect/a/b"
+        begin
+          Dir.chdir "detect/a/b"
 
-        Gem.use_gemdeps
+          Gem.use_gemdeps
 
-        assert_equal add_bundler_full_name([]), loaded_spec_names
-      ensure
-        Dir.chdir @tempdir
+          assert_equal add_bundler_full_name([]), loaded_spec_names
+        ensure
+          Dir.chdir @tempdir
+        end
       end
     end
   end
@@ -773,38 +775,40 @@ class TestGem < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem.rb#L775
   end
 
   def test_self_find_files_with_gemfile
-    cwd = File.expand_path("test/rubygems", PROJECT_DIR)
-    actual_load_path = $LOAD_PATH.unshift(cwd).dup
+    with_local_bundler do
+      cwd = File.expand_path("test/rubygems", PROJECT_DIR)
+      actual_load_path = $LOAD_PATH.unshift(cwd).dup
 
-    discover_path = File.join "lib", "sff", "discover.rb"
+      discover_path = File.join "lib", "sff", "discover.rb"
 
-    foo1, _ = %w[1 2].map do |version|
-      spec = quick_gem "sff", version do |s|
-        s.files << discover_path
+      foo1, _ = %w[1 2].map do |version|
+        spec = quick_gem "sff", version do |s|
+          s.files << discover_path
+        end
+
+        write_file(File.join "gems", spec.full_name, discover_path) do |fp|
+          fp.puts "# #{spec.full_name}"
+        end
+
+        spec
       end
+      Gem.refresh
 
-      write_file(File.join "gems", spec.full_name, discover_path) do |fp|
-        fp.puts "# #{spec.full_name}"
+      write_file(File.join Dir.pwd, "Gemfile") do |fp|
+        fp.puts "source 'https://rubygems.org'"
+        fp.puts "gem '#{foo1.name}', '#{foo1.version}'"
       end
+      Gem.use_gemdeps(File.join Dir.pwd, "Gemfile")
 
-      spec
-    end
-    Gem.refresh
+      expected = [
+        File.expand_path("test/rubygems/sff/discover.rb", PROJECT_DIR),
+        File.join(foo1.full_gem_path, discover_path),
+      ].sort
 
-    write_file(File.join Dir.pwd, "Gemfile") do |fp|
-      fp.puts "source 'https://rubygems.org'"
-      fp.puts "gem '#{foo1.name}', '#{foo1.version}'"
+      assert_equal expected, Gem.find_files("sff/discover").sort
+      assert_equal expected, Gem.find_files("sff/**.rb").sort, "[ruby-core:31730]"
+      assert_equal cwd, actual_load_path.shift
     end
-    Gem.use_gemdeps(File.join Dir.pwd, "Gemfile")
-
-    expected = [
-      File.expand_path("test/rubygems/sff/discover.rb", PROJECT_DIR),
-      File.join(foo1.full_gem_path, discover_path),
-    ].sort
-
-    assert_equal expected, Gem.find_files("sff/discover").sort
-    assert_equal expected, Gem.find_files("sff/**.rb").sort, "[ruby-core:31730]"
-    assert_equal cwd, actual_load_path.shift
   end
 
   def test_self_find_latest_files
@@ -1631,48 +1635,52 @@ class TestGem < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem.rb#L1635
   end
 
   def test_auto_activation_of_specific_gemdeps_file
-    a = util_spec "a", "1", nil, "lib/a.rb"
-    b = util_spec "b", "1", nil, "lib/b.rb"
-    c = util_spec "c", "1", nil, "lib/c.rb"
+    with_local_bundler do
+      a = util_spec "a", "1", nil, "lib/a.rb"
+      b = util_spec "b", "1", nil, "lib/b.rb"
+      c = util_spec "c", "1", nil, "lib/c.rb"
 
-    install_specs a, b, c
+      install_specs a, b, c
 
-    path = File.join @tempdir, "gem.deps.rb"
+      path = File.join @tempdir, "gem.deps.rb"
 
-    File.open path, "w" do |f|
-      f.puts "gem 'a'"
-      f.puts "gem 'b'"
-      f.puts "gem 'c'"
-    end
+      File.open path, "w" do |f|
+        f.puts "gem 'a'"
+        f.puts "gem 'b'"
+        f.puts "gem 'c'"
+      end
 
-    with_rubygems_gemdeps(path) do
-      Gem.use_gemdeps
+      with_rubygems_gemdeps(path) do
+        Gem.use_gemdeps
 
-      assert_equal add_bundler_full_name(%W[a-1 b-1 c-1]), loaded_spec_names
+        assert_equal add_bundler_full_name(%W[a-1 b-1 c-1]), loaded_spec_names
+      end
     end
   end
 
   def test_auto_activation_of_used_gemdeps_file
-    a = util_spec "a", "1", nil, "lib/a.rb"
-    b = util_spec "b", "1", nil, "lib/b.rb"
-    c = util_spec "c", "1", nil, "lib/c.rb"
+    with_local_bundler do
+      a = util_spec "a", "1", nil, "lib/a.rb"
+      b = util_spec "b", "1", nil, "lib/b.rb"
+      c = util_spec "c", "1", nil, "lib/c.rb"
 
-    install_specs a, b, c
+      install_specs a, b, c
 
-    path = File.join @tempdir, "gem.deps.rb"
+      path = File.join @tempdir, "gem.deps.rb"
 
-    File.open path, "w" do |f|
-      f.puts "gem 'a'"
-      f.puts "gem 'b'"
-      f.puts "gem 'c'"
-    end
+      File.open path, "w" do |f|
+        f.puts "gem 'a'"
+        f.puts "gem 'b'"
+        f.puts "gem 'c'"
+      end
 
-    with_rubygems_gemdeps("-") do
-      expected_specs = [a, b, util_spec("bundler", Bundler::VERSION), c].compact.map(&:full_name)
+      with_rubygems_gemdeps("-") do
+        expected_specs = [a, b, util_spec("bundler", Bundler::VERSION), c].compact.map(&:full_name)
 
-      Gem.use_gemdeps
+        Gem.use_gemdeps
 
-      assert_equal expected_specs, loaded_spec_names
+        assert_equal expected_specs, loaded_spec_names
+      end
     end
   end
 
@@ -1683,102 +1691,106 @@ class TestGem < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem.rb#L1691
   end
 
   def test_looks_for_gemdeps_files_automatically_from_binstubs
-    a = util_spec "a", "1" do |s|
-      s.executables = %w[foo]
-      s.bindir = "exe"
-    end
+    with_local_bundler do
+      a = util_spec "a", "1" do |s|
+        s.executables = %w[foo]
+        s.bindir = "exe"
+      end
 
-    write_file File.join(@tempdir, "exe", "foo") do |fp|
-      fp.puts "puts Gem.loaded_specs.values.map(&:full_name).sort"
-    end
+      write_file File.join(@tempdir, "exe", "foo") do |fp|
+        fp.puts "puts Gem.loaded_specs.values.map(&:full_name).sort"
+      end
 
-    b = util_spec "b", "1", nil, "lib/b.rb"
-    c = util_spec "c", "1", nil, "lib/c.rb"
+      b = util_spec "b", "1", nil, "lib/b.rb"
+      c = util_spec "c", "1", nil, "lib/c.rb"
 
-    install_specs a, b, c
+      install_specs a, b, c
 
-    path = File.join(@tempdir, "gd-tmp")
-    install_gem a, :install_dir => path
-    install_gem b, :install_dir => path
-    install_gem c, :install_dir => path
+      path = File.join(@tempdir, " (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]