Skip to content

Commit

Permalink
Only reset settings when a gemfile is already set
Browse files Browse the repository at this point in the history
Only thing we need to reset is settings, and only because settings are
loaded relative to the `Gemfile`, so they need to be reset if the
configured or passed `Gemfile` is not standard and will resolve to a
different root.

Resetting more stuff causes issues under some circumstances,
specifically when dependencies further tweak `Kernel.require`.
  • Loading branch information
deivid-rodriguez committed Nov 16, 2020
1 parent 6b0a1aa commit 43960ea
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 1 deletion.
4 changes: 4 additions & 0 deletions bundler/lib/bundler.rb
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion bundler/lib/bundler/cli.rb
Expand Up @@ -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]
Expand Down
43 changes: 43 additions & 0 deletions bundler/spec/commands/exec_spec.rb
Expand Up @@ -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 }
Expand Down

0 comments on commit 43960ea

Please sign in to comment.