From a7a8b51c3c80b99458b2eb46f6ccfa57c7bb0707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 18 Nov 2020 16:50:54 +0100 Subject: [PATCH] Merge pull request #4062 from rubygems/zeitwerk Fix edge case resulting in a crash when using `zeitwerk` inside a nested `bundle exec` invocation (cherry picked from commit a9c77de8d1ea9a19080ae74a6b1c410589852393) --- bundler/lib/bundler.rb | 4 +++ bundler/lib/bundler/cli.rb | 2 +- bundler/spec/commands/exec_spec.rb | 47 ++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/bundler/lib/bundler.rb b/bundler/lib/bundler.rb index f6ad7ccaef84..0ddd2c7f8804 100644 --- a/bundler/lib/bundler.rb +++ b/bundler/lib/bundler.rb @@ -602,6 +602,10 @@ def reset! reset_rubygems! end + def reset_settings! + @settings = nil + end + def reset_paths! @bin_path = nil @bundler_major_version = nil diff --git a/bundler/lib/bundler/cli.rb b/bundler/lib/bundler/cli.rb index c0e3802bc9aa..e2dceb98d5fa 100644 --- a/bundler/lib/bundler/cli.rb +++ b/bundler/lib/bundler/cli.rb @@ -57,7 +57,7 @@ def initialize(*args) custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile] if custom_gemfile && !custom_gemfile.empty? Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile) - Bundler.reset_paths! + Bundler.reset_settings! end Bundler.settings.set_command_option_if_given :retry, options[:retry] diff --git a/bundler/spec/commands/exec_spec.rb b/bundler/spec/commands/exec_spec.rb index 31cd712b2e77..bbee28006bf8 100644 --- a/bundler/spec/commands/exec_spec.rb +++ b/bundler/spec/commands/exec_spec.rb @@ -865,6 +865,8 @@ def bin_path(a,b,c) context "nested bundle exec" do context "when bundle in a local path" do before do + skip "https://github.com/rubygems/rubygems/issues/3351" if Gem.win_platform? + gemfile <<-G source "#{file_uri_for(gem_repo1)}" gem "rack" @@ -874,8 +876,6 @@ def bin_path(a,b,c) end it "correctly shells out" do - skip "https://github.com/rubygems/rubygems/issues/3351" if Gem.win_platform? - file = bundled_app("file_that_bundle_execs.rb") create_file(file, <<-RUBY) #!#{Gem.ruby} @@ -887,6 +887,49 @@ def bin_path(a,b,c) end end + context "when Kernel.require uses extra monkeypatches" do + before do + skip "https://github.com/rubygems/rubygems/issues/3351" if Gem.win_platform? + + install_gemfile "" + end + + it "does not undo the monkeypatches" do + karafka = bundled_app("bin/karafka") + create_file(karafka, <<~RUBY) + #!#{Gem.ruby} + + module Kernel + module_function + + alias_method :require_before_extra_monkeypatches, :require + + def require(path) + puts "requiring \#{path} used the monkeypatch" + + require_before_extra_monkeypatches(path) + end + end + + Bundler.setup(:default) + + require "foo" + RUBY + karafka.chmod(0o777) + + foreman = bundled_app("bin/foreman") + create_file(foreman, <<~RUBY) + #!#{Gem.ruby} + + puts `bundle exec bin/karafka` + RUBY + foreman.chmod(0o777) + + bundle "exec #{foreman}" + expect(out).to eq("requiring foo used the monkeypatch") + end + end + context "with a system gem that shadows a default gem" do let(:openssl_version) { "99.9.9" } let(:expected) { ruby "gem 'openssl', '< 999999'; require 'openssl'; puts OpenSSL::VERSION", :artifice => nil, :raise_on_error => false }