From c7ebeb7eda9f7f6bbb48effe1efc026eeb64d09c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 15 May 2020 21:31:12 +0900 Subject: [PATCH] Sync Bundler PR #3624 --- lib/bundler/dsl.rb | 3 - lib/bundler/feature_flag.rb | 1 - lib/bundler/friendly_errors.rb | 6 +- lib/bundler/settings.rb | 1 - man/bundle-config.1 | 3 - man/bundle-config.1.txt | 4 - man/bundle-config.ronn | 3 - spec/bundler/bundler/cli_spec.rb | 16 +- spec/bundler/bundler/dsl_spec.rb | 25 +-- spec/bundler/bundler/friendly_errors_spec.rb | 8 +- spec/bundler/bundler/shared_helpers_spec.rb | 4 +- .../bundler/stub_specification_spec.rb | 6 +- spec/bundler/commands/binstubs_spec.rb | 2 +- spec/bundler/commands/clean_spec.rb | 6 +- spec/bundler/commands/exec_spec.rb | 35 +++-- spec/bundler/commands/info_spec.rb | 2 +- spec/bundler/commands/newgem_spec.rb | 2 +- spec/bundler/commands/pristine_spec.rb | 37 +++-- spec/bundler/commands/update_spec.rb | 2 +- spec/bundler/commands/viz_spec.rb | 11 +- spec/bundler/install/bundler_spec.rb | 8 +- spec/bundler/install/deploy_spec.rb | 2 +- spec/bundler/install/gemfile/gemspec_spec.rb | 4 +- spec/bundler/install/gemfile/git_spec.rb | 2 +- spec/bundler/install/gemfile/groups_spec.rb | 19 +-- .../install/gems/compact_index_spec.rb | 4 +- .../install/gems/dependency_api_spec.rb | 4 +- .../install/gems/native_extensions_spec.rb | 2 +- spec/bundler/install/gems/standalone_spec.rb | 14 +- spec/bundler/install/gems/sudo_spec.rb | 2 + spec/bundler/install/global_cache_spec.rb | 14 +- spec/bundler/install/path_spec.rb | 2 +- spec/bundler/lock/lockfile_spec.rb | 8 +- spec/bundler/other/major_deprecation_spec.rb | 47 +++--- spec/bundler/other/platform_spec.rb | 10 +- spec/bundler/plugins/install_spec.rb | 2 +- spec/bundler/quality_spec.rb | 4 +- spec/bundler/realworld/parallel_spec.rb | 2 +- spec/bundler/runtime/executable_spec.rb | 4 - spec/bundler/runtime/setup_spec.rb | 60 +++++-- .../runtime/with_unbundled_env_spec.rb | 14 +- spec/bundler/spec_helper.rb | 45 +++--- .../bundler/support/artifice/compact_index.rb | 6 +- spec/bundler/support/artifice/endpoint.rb | 37 ++--- spec/bundler/support/artifice/endpoint_500.rb | 1 - spec/bundler/support/artifice/windows.rb | 1 - spec/bundler/support/builders.rb | 4 +- spec/bundler/support/hax.rb | 26 +++- spec/bundler/support/helpers.rb | 146 +++++++++--------- spec/bundler/support/matchers.rb | 7 +- spec/bundler/support/path.rb | 99 ++++++++++-- spec/bundler/support/rubygems_ext.rb | 14 +- .../support/rubygems_version_manager.rb | 4 +- spec/bundler/support/switch_rubygems.rb | 10 -- 54 files changed, 443 insertions(+), 362 deletions(-) diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index bb92a28381..dfc5254b2a 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -222,7 +222,6 @@ module Bundler def github(repo, options = {}) raise ArgumentError, "GitHub sources require a block" unless block_given? - raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources? github_uri = @git_sources["github"].call(repo) git_options = normalize_hash(options).merge("uri" => github_uri) git_source = @sources.add_git_source(git_options) @@ -283,8 +282,6 @@ module Bundler private def add_git_sources - return if Bundler.feature_flag.skip_default_git_sources? - git_source(:github) do |repo_name| warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".') "https://github.com/#{repo_name}.git" diff --git a/lib/bundler/feature_flag.rb b/lib/bundler/feature_flag.rb index e0f99b987a..fd76d9e5ba 100644 --- a/lib/bundler/feature_flag.rb +++ b/lib/bundler/feature_flag.rb @@ -41,7 +41,6 @@ module Bundler settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") } settings_flag(:print_only_version_number) { bundler_3_mode? } settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? } - settings_flag(:skip_default_git_sources) { bundler_3_mode? } settings_flag(:specific_platform) { bundler_3_mode? } settings_flag(:suppress_install_using_messages) { bundler_3_mode? } settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? } diff --git a/lib/bundler/friendly_errors.rb b/lib/bundler/friendly_errors.rb index 2b4706aab0..59795803cd 100644 --- a/lib/bundler/friendly_errors.rb +++ b/lib/bundler/friendly_errors.rb @@ -76,7 +76,7 @@ module Bundler I tried... - - **Have you read our issues document, https://github.com/rubygems/bundler/blob/master/doc/contributing/ISSUES.md?** + - **Have you read our issues document, https://github.com/rubygems/rubygems/blob/master/doc/contributing/ISSUES.md?** ... @@ -100,7 +100,7 @@ module Bundler #{issues_url(e)} If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at: - https://github.com/rubygems/bundler/issues/new + https://github.com/rubygems/rubygems/issues/new EOS end @@ -108,7 +108,7 @@ module Bundler message = exception.message.lines.first.tr(":", " ").chomp message = message.split("-").first if exception.is_a?(Errno) require "cgi" - "https://github.com/rubygems/bundler/search?q=" \ + "https://github.com/rubygems/rubygems/search?q=" \ "#{CGI.escape(message)}&type=Issues" end end diff --git a/lib/bundler/settings.rb b/lib/bundler/settings.rb index f1da5dd21f..d6962e5b6e 100644 --- a/lib/bundler/settings.rb +++ b/lib/bundler/settings.rb @@ -42,7 +42,6 @@ module Bundler setup_makes_kernel_gem_public silence_deprecations silence_root_warning - skip_default_git_sources specific_platform suppress_install_using_messages unlock_source_unlocks_spec diff --git a/man/bundle-config.1 b/man/bundle-config.1 index 001ec57a41..3ea408ecdb 100644 --- a/man/bundle-config.1 +++ b/man/bundle-config.1 @@ -262,9 +262,6 @@ The following is a list of all configuration keys and their purpose\. You can le \fBsilence_root_warning\fR (\fBBUNDLE_SILENCE_ROOT_WARNING\fR): Silence the warning Bundler prints when installing gems as root\. . .IP "\(bu" 4 -\fBskip_default_git_sources\fR (\fBBUNDLE_SKIP_DEFAULT_GIT_SOURCES\fR): Whether Bundler should skip adding default git source shortcuts to the Gemfile DSL\. -. -.IP "\(bu" 4 \fBspecific_platform\fR (\fBBUNDLE_SPECIFIC_PLATFORM\fR): Allow bundler to resolve for the specific running platform and store it in the lockfile, instead of only using a generic platform\. A specific platform is the exact platform triple reported by \fBGem::Platform\.local\fR, such as \fBx86_64\-darwin\-16\fR or \fBuniversal\-java\-1\.8\fR\. On the other hand, generic platforms are those such as \fBruby\fR, \fBmswin\fR, or \fBjava\fR\. In this example, \fBx86_64\-darwin\-16\fR would map to \fBruby\fR and \fBuniversal\-java\-1\.8\fR to \fBjava\fR\. . .IP "\(bu" 4 diff --git a/man/bundle-config.1.txt b/man/bundle-config.1.txt index 219c27bfa8..657cba79f9 100644 --- a/man/bundle-config.1.txt +++ b/man/bundle-config.1.txt @@ -312,10 +312,6 @@ LIST OF AVAILABLE KEYS o silence_root_warning (BUNDLE_SILENCE_ROOT_WARNING): Silence the warning Bundler prints when installing gems as root. - o skip_default_git_sources (BUNDLE_SKIP_DEFAULT_GIT_SOURCES): Whether - Bundler should skip adding default git source shortcuts to the - Gemfile DSL. - o specific_platform (BUNDLE_SPECIFIC_PLATFORM): Allow bundler to resolve for the specific running platform and store it in the lockfile, instead of only using a generic platform. A specific diff --git a/man/bundle-config.ronn b/man/bundle-config.ronn index 7b7d417bca..a2cb42bc35 100644 --- a/man/bundle-config.ronn +++ b/man/bundle-config.ronn @@ -249,9 +249,6 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html). be changed in the next major version. * `silence_root_warning` (`BUNDLE_SILENCE_ROOT_WARNING`): Silence the warning Bundler prints when installing gems as root. -* `skip_default_git_sources` (`BUNDLE_SKIP_DEFAULT_GIT_SOURCES`): - Whether Bundler should skip adding default git source shortcuts to the - Gemfile DSL. * `specific_platform` (`BUNDLE_SPECIFIC_PLATFORM`): Allow bundler to resolve for the specific running platform and store it in the lockfile, instead of only using a generic platform. diff --git a/spec/bundler/bundler/cli_spec.rb b/spec/bundler/bundler/cli_spec.rb index a56e148e89..20b7609466 100644 --- a/spec/bundler/bundler/cli_spec.rb +++ b/spec/bundler/bundler/cli_spec.rb @@ -141,17 +141,17 @@ RSpec.describe "bundle executable" do describe "printing the outdated warning" do shared_examples_for "no warning" do it "prints no warning" do - bundle "fail" + bundle "fail", :env => { "BUNDLER_VERSION" => bundler_version } expect(last_command.stdboth).to eq("Could not find command \"fail\".") end end - let(:bundler_version) { "1.1" } + let(:bundler_version) { "2.0" } let(:latest_version) { nil } before do bundle! "config set --global disable_version_check false" - system_gems "bundler-#{bundler_version}" + pristine_system_gems "bundler-#{bundler_version}" if latest_version info_path = home(".bundle/cache/compact_index/rubygems.org.443.29b0360b937aa4d161703e6160654e47/info/bundler") info_path.parent.mkpath @@ -176,7 +176,7 @@ RSpec.describe "bundle executable" do context "when the latest version is greater than the current version" do let(:latest_version) { "222.0" } it "prints the version warning" do - bundle "fail", :system_bundler => true, :env => { "BUNDLER_SPEC_IGNORE_DEFAULT_BUNDLER_GEM" => "true" } + bundle "fail", :env => { "BUNDLER_VERSION" => bundler_version } expect(err).to start_with(<<-EOS.strip) The latest bundler is #{latest_version}, but you are currently running #{bundler_version}. To install the latest version, run `gem install bundler` @@ -184,16 +184,16 @@ To install the latest version, run `gem install bundler` end context "and disable_version_check is set" do - before { bundle! "config set disable_version_check true" } + before { bundle! "config set disable_version_check true", :env => { "BUNDLER_VERSION" => bundler_version } } include_examples "no warning" end context "running a parseable command" do it "prints no warning" do - bundle! "config get --parseable foo" + bundle! "config get --parseable foo", :env => { "BUNDLER_VERSION" => bundler_version } expect(last_command.stdboth).to eq "" - bundle "platform --ruby" + bundle "platform --ruby", :env => { "BUNDLER_VERSION" => bundler_version } expect(last_command.stdboth).to eq "Could not locate Gemfile" end end @@ -201,7 +201,7 @@ To install the latest version, run `gem install bundler` context "and is a pre-release" do let(:latest_version) { "222.0.0.pre.4" } it "prints the version warning" do - bundle "fail", :system_bundler => true, :env => { "BUNDLER_SPEC_IGNORE_DEFAULT_BUNDLER_GEM" => "true" } + bundle "fail", :env => { "BUNDLER_VERSION" => bundler_version } expect(err).to start_with(<<-EOS.strip) The latest bundler is #{latest_version}, but you are currently running #{bundler_version}. To install the latest version, run `gem install bundler --pre` diff --git a/spec/bundler/bundler/dsl_spec.rb b/spec/bundler/bundler/dsl_spec.rb index 9299c014af..ff87b57886 100644 --- a/spec/bundler/bundler/dsl_spec.rb +++ b/spec/bundler/bundler/dsl_spec.rb @@ -63,16 +63,16 @@ RSpec.describe Bundler::Dsl do end end - context "default git sources", :bundler => "3" do - it "has none" do - expect(subject.instance_variable_get(:@git_sources)).to eq({}) + context "default git sources" do + it "has bitbucket, gist, and github" do + expect(subject.instance_variable_get(:@git_sources).keys.sort).to eq(%w[bitbucket gist github]) end end end describe "#method_missing" do it "raises an error for unknown DSL methods" do - expect(Bundler).to receive(:read_file).with(root.join("Gemfile").to_s). + expect(Bundler).to receive(:read_file).with(source_root.join("Gemfile").to_s). and_return("unknown") error_msg = "There was an error parsing `Gemfile`: Undefined local variable or method `unknown' for Gemfile. Bundler cannot continue." @@ -83,13 +83,13 @@ RSpec.describe Bundler::Dsl do describe "#eval_gemfile" do it "handles syntax errors with a useful message" do - expect(Bundler).to receive(:read_file).with(root.join("Gemfile").to_s).and_return("}") + expect(Bundler).to receive(:read_file).with(source_root.join("Gemfile").to_s).and_return("}") expect { subject.eval_gemfile("Gemfile") }. to raise_error(Bundler::GemfileError, /There was an error parsing `Gemfile`: (syntax error, unexpected tSTRING_DEND|(compile error - )?syntax error, unexpected '\}'). Bundler cannot continue./) end it "distinguishes syntax errors from evaluation errors" do - expect(Bundler).to receive(:read_file).with(root.join("Gemfile").to_s).and_return( + expect(Bundler).to receive(:read_file).with(source_root.join("Gemfile").to_s).and_return( "ruby '2.1.5', :engine => 'ruby', :engine_version => '1.2.4'" ) expect { subject.eval_gemfile("Gemfile") }. @@ -208,7 +208,7 @@ RSpec.describe Bundler::Dsl do end end - describe "#github", :bundler => "2" do + describe "#github" do it "from github" do spree_gems = %w[spree_core spree_api spree_backend] subject.github "spree" do @@ -220,17 +220,6 @@ RSpec.describe Bundler::Dsl do end end end - - describe "#github", :bundler => "3" do - it "from github" do - expect do - spree_gems = %w[spree_core spree_api spree_backend] - subject.github "spree" do - spree_gems.each {|spree_gem| subject.send :gem, spree_gem } - end - end.to raise_error(Bundler::DeprecatedError, /github method has been removed/) - end - end end describe "syntax errors" do diff --git a/spec/bundler/bundler/friendly_errors_spec.rb b/spec/bundler/bundler/friendly_errors_spec.rb index 747d774b25..495cbdbe49 100644 --- a/spec/bundler/bundler/friendly_errors_spec.rb +++ b/spec/bundler/bundler/friendly_errors_spec.rb @@ -215,7 +215,7 @@ RSpec.describe Bundler, "friendly errors" do it "generates a search URL for the exception message" do exception = Exception.new("Exception message") - expect(Bundler::FriendlyErrors.issues_url(exception)).to eq("https://github.com/rubygems/bundler/search?q=Exception+message&type=Issues") + expect(Bundler::FriendlyErrors.issues_url(exception)).to eq("https://github.com/rubygems/rubygems/search?q=Exception+message&type=Issues") end it "generates a search URL for only the first line of a multi-line exception message" do @@ -224,7 +224,7 @@ First line of the exception message Second line of the exception message END - expect(Bundler::FriendlyErrors.issues_url(exception)).to eq("https://github.com/rubygems/bundler/search?q=First+line+of+the+exception+message&type=Issues") + expect(Bundler::FriendlyErrors.issues_url(exception)).to eq("https://github.com/rubygems/rubygems/search?q=First+line+of+the+exception+message&type=Issues") end it "generates the url without colons" do @@ -233,7 +233,7 @@ Exception ::: with ::: colons ::: END issues_url = Bundler::FriendlyErrors.issues_url(exception) expect(issues_url).not_to include("%3A") - expect(issues_url).to eq("https://github.com/rubygems/bundler/search?q=#{CGI.escape("Exception with colons ")}&type=Issues") + expect(issues_url).to eq("https://github.com/rubygems/rubygems/search?q=#{CGI.escape("Exception with colons ")}&type=Issues") end it "removes information after - for Errono::EACCES" do @@ -243,7 +243,7 @@ END allow(exception).to receive(:is_a?).with(Errno).and_return(true) issues_url = Bundler::FriendlyErrors.issues_url(exception) expect(issues_url).not_to include("/Users/foo/bar") - expect(issues_url).to eq("https://github.com/rubygems/bundler/search?q=#{CGI.escape("Errno EACCES Permission denied @ dir_s_mkdir ")}&type=Issues") + expect(issues_url).to eq("https://github.com/rubygems/rubygems/search?q=#{CGI.escape("Errno EACCES Permission denied @ dir_s_mkdir ")}&type=Issues") end end end diff --git a/spec/bundler/bundler/shared_helpers_spec.rb b/spec/bundler/bundler/shared_helpers_spec.rb index 73adcf44d6..97647dc6eb 100644 --- a/spec/bundler/bundler/shared_helpers_spec.rb +++ b/spec/bundler/bundler/shared_helpers_spec.rb @@ -163,7 +163,7 @@ RSpec.describe Bundler::SharedHelpers do let(:pwd_stub) { nil } it "returns the current absolute path" do - expect(subject.pwd).to eq(root) + expect(subject.pwd).to eq(source_root) end end @@ -242,7 +242,7 @@ RSpec.describe Bundler::SharedHelpers do shared_examples_for "ENV['RUBYOPT'] gets set correctly" do it "ensures -rbundler/setup is at the beginning of ENV['RUBYOPT']" do subject.set_bundle_environment - expect(ENV["RUBYOPT"].split(" ")).to start_with("-r#{lib_dir}/bundler/setup") + expect(ENV["RUBYOPT"].split(" ")).to start_with("-r#{source_lib_dir}/bundler/setup") end end diff --git a/spec/bundler/bundler/stub_specification_spec.rb b/spec/bundler/bundler/stub_specification_spec.rb index 7495b5d661..0a54f9d7b5 100644 --- a/spec/bundler/bundler/stub_specification_spec.rb +++ b/spec/bundler/bundler/stub_specification_spec.rb @@ -1,15 +1,13 @@ # frozen_string_literal: true RSpec.describe Bundler::StubSpecification do - let(:gemspec) do - Gem::Specification.new do |s| + let(:with_bundler_stub_spec) do + gemspec = Gem::Specification.new do |s| s.name = "gemname" s.version = "1.0.0" s.loaded_from = __FILE__ end - end - let(:with_bundler_stub_spec) do described_class.from_stub(gemspec) end diff --git a/spec/bundler/commands/binstubs_spec.rb b/spec/bundler/commands/binstubs_spec.rb index 409c32c4f0..8a9f02aee7 100644 --- a/spec/bundler/commands/binstubs_spec.rb +++ b/spec/bundler/commands/binstubs_spec.rb @@ -98,7 +98,7 @@ RSpec.describe "bundle binstubs " do context "the bundle binstub" do before do - system_gems "bundler-#{system_bundler_version}" + pristine_system_gems "bundler-#{system_bundler_version}" build_repo2 do build_gem "prints_loaded_gems", "1.0" do |s| s.executables = "print_loaded_gems" diff --git a/spec/bundler/commands/clean_spec.rb b/spec/bundler/commands/clean_spec.rb index 0c69585c0b..b808e0085c 100644 --- a/spec/bundler/commands/clean_spec.rb +++ b/spec/bundler/commands/clean_spec.rb @@ -765,7 +765,7 @@ RSpec.describe "bundle clean" do should_not_have_gems "foo-1.0" end - it "doesn't remove extensions artifacts from bundled git gems after clean", :ruby_repo do + it "doesn't remove extensions artifacts from bundled git gems after clean" do build_git "very_simple_git_binary", &:add_c_extension revision = revision_for(lib_path("very_simple_git_binary-1.0")) @@ -788,7 +788,7 @@ RSpec.describe "bundle clean" do expect(vendored_gems("bundler/gems/very_simple_git_binary-1.0-#{revision[0..11]}")).to exist end - it "removes extension directories", :ruby_repo do + it "removes extension directories" do gemfile <<-G source "#{file_uri_for(gem_repo1)}" @@ -824,7 +824,7 @@ RSpec.describe "bundle clean" do expect(simple_binary_extensions_dir).to exist end - it "removes git extension directories", :ruby_repo do + it "removes git extension directories" do build_git "very_simple_git_binary", &:add_c_extension revision = revision_for(lib_path("very_simple_git_binary-1.0")) diff --git a/spec/bundler/commands/exec_spec.rb b/spec/bundler/commands/exec_spec.rb index f381a51263..08ebfe5ead 100644 --- a/spec/bundler/commands/exec_spec.rb +++ b/spec/bundler/commands/exec_spec.rb @@ -6,7 +6,7 @@ RSpec.describe "bundle exec" do system_gems(system_gems_to_install, :path => default_bundle_path) end - it "works with --gemfile flag", :ruby_repo do + it "works with --gemfile flag" do create_file "CustomGemfile", <<-G gem "rack", "1.0.0" G @@ -15,7 +15,7 @@ RSpec.describe "bundle exec" do expect(out).to eq("1.0.0") end - it "activates the correct gem", :ruby_repo do + it "activates the correct gem" do gemfile <<-G gem "rack", "0.9.1" G @@ -24,7 +24,7 @@ RSpec.describe "bundle exec" do expect(out).to eq("0.9.1") end - it "works when the bins are in ~/.bundle", :ruby_repo do + it "works when the bins are in ~/.bundle" do install_gemfile <<-G gem "rack" G @@ -33,7 +33,7 @@ RSpec.describe "bundle exec" do expect(out).to eq("1.0.0") end - it "works when running from a random directory", :ruby_repo do + it "works when running from a random directory" do install_gemfile <<-G gem "rack" G @@ -269,7 +269,7 @@ RSpec.describe "bundle exec" do ) end - it "handles gems installed with --without", :ruby_repo do + it "handles gems installed with --without" do install_gemfile <<-G, forgotten_command_line_options(:without => "middleware") source "#{file_uri_for(gem_repo1)}" gem "rack" # rack 0.9.1 and 1.0 exist @@ -353,7 +353,7 @@ RSpec.describe "bundle exec" do expect(err).to include("bundler: exec needs a command to run") end - it "raises a helpful error when exec'ing to something outside of the bundle", :ruby_repo do + it "raises a helpful error when exec'ing to something outside of the bundle" do bundle! "config set clean false" # want to keep the rackup binstub install_gemfile! <<-G source "#{file_uri_for(gem_repo1)}" @@ -457,7 +457,7 @@ RSpec.describe "bundle exec" do end describe "with gem executables" do - describe "run from a random directory", :ruby_repo do + describe "run from a random directory" do before(:each) do install_gemfile <<-G gem "rack" @@ -598,8 +598,9 @@ RSpec.describe "bundle exec" do end Bundler.rubygems.extend(Monkey) G - bundle "install --deployment" - bundle "exec ruby -e '`#{bindir.join("bundler")} -v`; puts $?.success?'" + bundle! "config set path.system true" + bundle! "install" + bundle "exec ruby -e '`bundle -v`; puts $?.success?'", :env => { "BUNDLER_VERSION" => Bundler::VERSION } expect(out).to match("true") end end @@ -881,7 +882,7 @@ __FILE__: #{path.to_s.inspect} puts `bundle exec echo foo` RUBY file.chmod(0o777) - bundle! "exec #{file}" + bundle! "exec #{file}", :env => { "PATH" => path } expect(out).to eq("foo") end end @@ -904,7 +905,7 @@ __FILE__: #{path.to_s.inspect} end end - system_gems(:bundler, "openssl-#{openssl_version}", :gem_repo => gem_repo4) + system_gems("openssl-#{openssl_version}", :gem_repo => gem_repo4) file = bundled_app("require_openssl.rb") create_file(file, <<-RUBY) @@ -915,15 +916,17 @@ __FILE__: #{path.to_s.inspect} RUBY file.chmod(0o777) + env = { "PATH" => path } aggregate_failures do - expect(bundle!("exec #{file}", :artifice => nil)).to eq(expected) - expect(bundle!("exec bundle exec #{file}", :artifice => nil)).to eq(expected) - expect(bundle!("exec ruby #{file}", :artifice => nil)).to eq(expected) - expect(run!(file.read, :artifice => nil)).to eq(expected) + expect(bundle!("exec #{file}", :artifice => nil, :env => env)).to eq(expected) + expect(bundle!("exec bundle exec #{file}", :artifice => nil, :env => env)).to eq(expected) + expect(bundle!("exec ruby #{file}", :artifice => nil, :env => env)).to eq(expected) + expect(run!(file.read, :artifice => nil, :env => env)).to eq(expected) end + skip "ruby_core has openssl and rubygems in the same folder, and this test needs rubygems require but default openssl not in a directly added entry in $LOAD_PATH" if ruby_core? # sanity check that we get the newer, custom version without bundler - sys_exec("#{Gem.ruby} #{file}") + sys_exec("#{Gem.ruby} #{file}", :env => env) expect(err).to include("custom openssl should not be loaded") end end diff --git a/spec/bundler/commands/info_spec.rb b/spec/bundler/commands/info_spec.rb index df2d5f2824..53158c9168 100644 --- a/spec/bundler/commands/info_spec.rb +++ b/spec/bundler/commands/info_spec.rb @@ -41,7 +41,7 @@ RSpec.describe "bundle info" do expect(err).to eq("Could not find gem 'missing'.") end - context "given a default gem shippped in ruby", :ruby_repo do + context "given a default gem shippped in ruby" do it "prints information about the default gem" do bundle! "info rdoc" expect(out).to include("* rdoc") diff --git a/spec/bundler/commands/newgem_spec.rb b/spec/bundler/commands/newgem_spec.rb index 1dc51de9e7..62ffaedcc0 100644 --- a/spec/bundler/commands/newgem_spec.rb +++ b/spec/bundler/commands/newgem_spec.rb @@ -246,7 +246,7 @@ RSpec.describe "bundle gem" do end end - it "generates a valid gemspec", :readline, :ruby_repo do + it "generates a valid gemspec", :readline do bundle! "gem newgem --bin" prepare_gemspec(bundled_app("newgem", "newgem.gemspec")) diff --git a/spec/bundler/commands/pristine_spec.rb b/spec/bundler/commands/pristine_spec.rb index 15336137b6..9729d55cdc 100644 --- a/spec/bundler/commands/pristine_spec.rb +++ b/spec/bundler/commands/pristine_spec.rb @@ -2,7 +2,7 @@ require "bundler/vendored_fileutils" -RSpec.describe "bundle pristine", :ruby_repo do +RSpec.describe "bundle pristine" do before :each do build_lib "baz", :path => bundled_app do |s| s.version = "1.0.0" @@ -34,7 +34,7 @@ RSpec.describe "bundle pristine", :ruby_repo do context "when sourced from RubyGems" do it "reverts using cached .gem file" do - spec = Bundler.definition.specs["weakling"].first + spec = find_spec("weakling") changes_txt = Pathname.new(spec.full_gem_path).join("lib/changes.txt") FileUtils.touch(changes_txt) @@ -45,10 +45,9 @@ RSpec.describe "bundle pristine", :ruby_repo do end it "does not delete the bundler gem" do - system_gems :bundler bundle! "install" - bundle! "pristine", :system_bundler => true - bundle! "-v", :system_bundler => true + bundle! "pristine" + bundle! "-v" expected = if Bundler::VERSION < "3.0" "Bundler version" @@ -62,7 +61,7 @@ RSpec.describe "bundle pristine", :ruby_repo do context "when sourced from git repo" do it "reverts by resetting to current revision`" do - spec = Bundler.definition.specs["foo"].first + spec = find_spec("foo") changed_file = Pathname.new(spec.full_gem_path).join("lib/foo.rb") diff = "#Pristine spec changes" @@ -74,7 +73,7 @@ RSpec.describe "bundle pristine", :ruby_repo do end it "removes added files" do - spec = Bundler.definition.specs["foo"].first + spec = find_spec("foo") changes_txt = Pathname.new(spec.full_gem_path).join("lib/changes.txt") FileUtils.touch(changes_txt) @@ -85,7 +84,7 @@ RSpec.describe "bundle pristine", :ruby_repo do end it "displays warning and ignores changes when a local config exists" do - spec = Bundler.definition.specs["foo"].first + spec = find_spec("foo") bundle "config set local.#{spec.name} #{lib_path(spec.name)}" changes_txt = Pathname.new(spec.full_gem_path).join("lib/changes.txt") @@ -100,7 +99,7 @@ RSpec.describe "bundle pristine", :ruby_repo do context "when sourced from gemspec" do it "displays warning and ignores changes when sourced from gemspec" do - spec = Bundler.definition.specs["baz"].first + spec = find_spec("baz") changed_file = Pathname.new(spec.full_gem_path).join("lib/baz.rb") diff = "#Pristine spec changes" @@ -113,7 +112,7 @@ RSpec.describe "bundle pristine", :ruby_repo do end it "reinstall gemspec dependency" do - spec = Bundler.definition.specs["baz-dev"].first + spec = find_spec("baz-dev") changed_file = Pathname.new(spec.full_gem_path).join("lib/baz/dev.rb") diff = "#Pristine spec changes" @@ -127,7 +126,7 @@ RSpec.describe "bundle pristine", :ruby_repo do context "when sourced from path" do it "displays warning and ignores changes when sourced from local path" do - spec = Bundler.definition.specs["bar"].first + spec = find_spec("bar") changes_txt = Pathname.new(spec.full_gem_path).join("lib/changes.txt") FileUtils.touch(changes_txt) expect(changes_txt).to be_file @@ -139,17 +138,17 @@ RSpec.describe "bundle pristine", :ruby_repo do context "when passing a list of gems to pristine" do it "resets them" do - foo = Bundler.definition.specs["foo"].first + foo = find_spec("foo") foo_changes_txt = Pathname.new(foo.full_gem_path).join("lib/changes.txt") FileUtils.touch(foo_changes_txt) expect(foo_changes_txt).to be_file - bar = Bundler.definition.specs["bar"].first + bar = find_spec("bar") bar_changes_txt = Pathname.new(bar.full_gem_path).join("lib/changes.txt") FileUtils.touch(bar_changes_txt) expect(bar_changes_txt).to be_file - weakling = Bundler.definition.specs["weakling"].first + weakling = find_spec("weakling") weakling_changes_txt = Pathname.new(weakling.full_gem_path).join("lib/changes.txt") FileUtils.touch(weakling_changes_txt) expect(weakling_changes_txt).to be_file @@ -171,7 +170,7 @@ RSpec.describe "bundle pristine", :ruby_repo do end context "when a build config exists for one of the gems" do - let(:very_simple_binary) { Bundler.definition.specs["very_simple_binary"].first } + let(:very_simple_binary) { find_spec("very_simple_binary") } let(:c_ext_dir) { Pathname.new(very_simple_binary.full_gem_path).join("ext") } let(:build_opt) { "--with-ext-lib=#{c_ext_dir}" } before { bundle "config set build.very_simple_binary -- #{build_opt}" } @@ -188,7 +187,7 @@ RSpec.describe "bundle pristine", :ruby_repo do end context "when a build config exists for a git sourced gem" do - let(:git_with_ext) { Bundler.definition.specs["git_with_ext"].first } + let(:git_with_ext) { find_spec("git_with_ext") } let(:c_ext_dir) { Pathname.new(git_with_ext.full_gem_path).join("ext") } let(:build_opt) { "--with-ext-lib=#{c_ext_dir}" } before { bundle "config set build.git_with_ext -- #{build_opt}" } @@ -203,4 +202,10 @@ RSpec.describe "bundle pristine", :ruby_repo do expect(makefile_contents).to match(/LIBPATH =.*-L#{c_ext_dir}/) end end + + def find_spec(name) + without_env_side_effects do + Bundler.definition.specs[name].first + end + end end diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb index f8b8800de4..b6d3e08996 100644 --- a/spec/bundler/commands/update_spec.rb +++ b/spec/bundler/commands/update_spec.rb @@ -964,7 +964,7 @@ RSpec.describe "bundle update conservative" do isolated_owner BUNDLED WITH - 1.13.0 + #{Bundler::VERSION} L end diff --git a/spec/bundler/commands/viz_spec.rb b/spec/bundler/commands/viz_spec.rb index 029c3aca24..8d4f49df9f 100644 --- a/spec/bundler/commands/viz_spec.rb +++ b/spec/bundler/commands/viz_spec.rb @@ -1,13 +1,10 @@ # frozen_string_literal: true RSpec.describe "bundle viz", :bundler => "< 3", :if => Bundler.which("dot") do - let(:ruby_graphviz) do - graphviz_glob = base_system_gems.join("cache/ruby-graphviz*") - Pathname.glob(graphviz_glob).first - end - before do - system_gems ruby_graphviz + graphviz_version = RUBY_VERSION >= "2.4" ? "1.2.5" : "1.2.4" + + realworld_system_gems "ruby-graphviz --version #{graphviz_version}" end it "graphs gems from the Gemfile" do @@ -82,7 +79,7 @@ RSpec.describe "bundle viz", :bundler => "< 3", :if => Bundler.which("dot") do end end - system_gems ruby_graphviz, "graphviz-999", :gem_repo => gem_repo4 + system_gems "graphviz-999", :gem_repo => gem_repo4 end it "loads the correct ruby-graphviz gem" do diff --git a/spec/bundler/install/bundler_spec.rb b/spec/bundler/install/bundler_spec.rb index 25cc12160c..7c9b1a016d 100644 --- a/spec/bundler/install/bundler_spec.rb +++ b/spec/bundler/install/bundler_spec.rb @@ -136,12 +136,12 @@ RSpec.describe "bundle install" do system_gems "bundler-99999999.99.1" - install_gemfile! <<-G, :system_bundler => true + install_gemfile! <<-G source "#{file_uri_for(gem_repo2)}" gem "rails", "3.0" G - bundle! "check", :system_bundler => true + bundle! "check" expect(out).to include("The Gemfile's dependencies are satisfied") end @@ -150,12 +150,12 @@ RSpec.describe "bundle install" do system_gems "bundler-99999999.99.1" - install_gemfile! <<-G, :system_bundler => true + install_gemfile! <<-G source "#{file_uri_for(gem_repo2)}" gem "rails", "3.0" G - bundle! "check", :system_bundler => true + bundle! "check" expect(out).to include("The Gemfile's dependencies are satisfied") end diff --git a/spec/bundler/install/deploy_spec.rb b/spec/bundler/install/deploy_spec.rb index 121b99fd8c..071c6fcfcc 100644 --- a/spec/bundler/install/deploy_spec.rb +++ b/spec/bundler/install/deploy_spec.rb @@ -68,7 +68,7 @@ RSpec.describe "install with --deployment or --frozen" do bundle! :install bundle "install --deployment" - bundle! "exec bundle check" + bundle! "exec bundle check", :env => { "PATH" => path } end it "works when using path gems from the same path and the version is specified" do diff --git a/spec/bundler/install/gemfile/gemspec_spec.rb b/spec/bundler/install/gemfile/gemspec_spec.rb index b42587c65f..1c1924cc2a 100644 --- a/spec/bundler/install/gemfile/gemspec_spec.rb +++ b/spec/bundler/install/gemfile/gemspec_spec.rb @@ -172,7 +172,7 @@ RSpec.describe "bundle install from an existing gemspec" do s.add_dependency "platform_specific" end - system_gems "platform_specific-1.0-java", :path => default_bundle_path, :keep_path => true + system_gems "platform_specific-1.0-java", :path => default_bundle_path install_gemfile! <<-G gemspec :path => '#{tmp.join("foo")}' @@ -420,6 +420,8 @@ RSpec.describe "bundle install from an existing gemspec" do end end + bundle "config specific_platform false" + %w[ruby jruby].each do |platform| simulate_platform(platform) do install_gemfile <<-G diff --git a/spec/bundler/install/gemfile/git_spec.rb b/spec/bundler/install/gemfile/git_spec.rb index fd5cde4fb1..6cfab1b89c 100644 --- a/spec/bundler/install/gemfile/git_spec.rb +++ b/spec/bundler/install/gemfile/git_spec.rb @@ -1139,7 +1139,7 @@ RSpec.describe "bundle install with git sources" do expect(out).to include(Pathname.glob(default_bundle_path("bundler/gems/extensions/**/foo-1.0-*")).first.to_s) end - it "does not use old extension after ref changes", :ruby_repo do + it "does not use old extension after ref changes" do git_reader = build_git "foo", :no_default => true do |s| s.extensions = ["ext/extconf.rb"] s.write "ext/extconf.rb", <<-RUBY diff --git a/spec/bundler/install/gemfile/groups_spec.rb b/spec/bundler/install/gemfile/groups_spec.rb index 63be1a4e43..4ae4eb1862 100644 --- a/spec/bundler/install/gemfile/groups_spec.rb +++ b/spec/bundler/install/gemfile/groups_spec.rb @@ -352,16 +352,17 @@ RSpec.describe "bundle install with groups" do describe "when locked and installed with --without" do before(:each) do build_repo2 - system_gems "rack-0.9.1" do - install_gemfile <<-G, forgotten_command_line_options(:without => "rack") - source "#{file_uri_for(gem_repo2)}" - gem "rack" - group :rack do - gem "rack_middleware" - end - G - end + system_gems "rack-0.9.1" + + install_gemfile <<-G, forgotten_command_line_options(:without => "rack") + source "#{file_uri_for(gem_repo2)}" + gem "rack" + + group :rack do + gem "rack_middleware" + end + G end it "uses the correct versions even if --without was used on the original" do diff --git a/spec/bundler/install/gems/compact_index_spec.rb b/spec/bundler/install/gems/compact_index_spec.rb index 2452d82667..4760d135e6 100644 --- a/spec/bundler/install/gems/compact_index_spec.rb +++ b/spec/bundler/install/gems/compact_index_spec.rb @@ -410,7 +410,7 @@ The checksum of /versions does not match the checksum provided by the server! So api_request_limit = low_api_request_limit_for(gem_repo2) - install_gemfile! <<-G, :artifice => "compact_index_extra_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s } + install_gemfile! <<-G, :artifice => "compact_index_extra_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s }.merge(env_for_missing_prerelease_default_gem_activation) source "#{source_uri}" source "#{source_uri}/extra" do gem "back_deps" @@ -432,7 +432,7 @@ The checksum of /versions does not match the checksum provided by the server! So api_request_limit = low_api_request_limit_for(gem_repo4) - install_gemfile! <<-G, :artifice => "compact_index_extra_api_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s } + install_gemfile! <<-G, :artifice => "compact_index_extra_api_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s }.merge(env_for_missing_prerelease_default_gem_activation) source "#{source_uri}" source "#{source_uri}/extra" do gem "back_deps" diff --git a/spec/bundler/install/gems/dependency_api_spec.rb b/spec/bundler/install/gems/dependency_api_spec.rb index 863966a0e1..d1af4d7ed7 100644 --- a/spec/bundler/install/gems/dependency_api_spec.rb +++ b/spec/bundler/install/gems/dependency_api_spec.rb @@ -384,7 +384,7 @@ RSpec.describe "gemcutter's dependency API" do api_request_limit = low_api_request_limit_for(gem_repo2) - install_gemfile! <<-G, :artifice => "endpoint_extra_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s } + install_gemfile! <<-G, :artifice => "endpoint_extra_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s }.merge(env_for_missing_prerelease_default_gem_activation) source "#{source_uri}" source "#{source_uri}/extra" gem "back_deps" @@ -405,7 +405,7 @@ RSpec.describe "gemcutter's dependency API" do api_request_limit = low_api_request_limit_for(gem_repo2) - install_gemfile! <<-G, :artifice => "endpoint_extra_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s } + install_gemfile! <<-G, :artifice => "endpoint_extra_missing", :env => { "BUNDLER_SPEC_API_REQUEST_LIMIT" => api_request_limit.to_s }.merge(env_for_missing_prerelease_default_gem_activation) source "#{source_uri}" source "#{source_uri}/extra" do gem "back_deps" diff --git a/spec/bundler/install/gems/native_extensions_spec.rb b/spec/bundler/install/gems/native_extensions_spec.rb index a057d0d152..dba0607bb4 100644 --- a/spec/bundler/install/gems/native_extensions_spec.rb +++ b/spec/bundler/install/gems/native_extensions_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.describe "installing a gem with native extensions", :ruby_repo do +RSpec.describe "installing a gem with native extensions" do it "installs" do build_repo2 do build_gem "c_extension" do |s| diff --git a/spec/bundler/install/gems/standalone_spec.rb b/spec/bundler/install/gems/standalone_spec.rb index 521499a5df..2490227e13 100644 --- a/spec/bundler/install/gems/standalone_spec.rb +++ b/spec/bundler/install/gems/standalone_spec.rb @@ -21,7 +21,7 @@ RSpec.shared_examples "bundle install --standalone" do testrb << "\nrequire \"#{k}\"" testrb << "\nputs #{k.upcase}" end - ruby testrb, :no_lib => true + ruby testrb expect(out).to eq(expected_gems.values.join("\n")) end @@ -43,7 +43,7 @@ RSpec.shared_examples "bundle install --standalone" do testrb << "\nrequire \"#{k}\"" testrb << "\nputs #{k.upcase}" end - ruby testrb, :no_lib => true, :dir => "#{bundled_app}2" + ruby testrb, :dir => "#{bundled_app}2" expect(out).to eq(expected_gems.values.join("\n")) end @@ -68,7 +68,7 @@ RSpec.shared_examples "bundle install --standalone" do include_examples "common functionality" end - describe "with gems with native extension", :ruby_repo do + describe "with gems with native extension" do before do install_gemfile <<-G, forgotten_command_line_options(:path => bundled_app("bundle")).merge(:standalone => true, :dir => cwd) source "#{file_uri_for(gem_repo1)}" @@ -165,7 +165,7 @@ RSpec.shared_examples "bundle install --standalone" do it "allows creating a standalone file with limited groups" do bundle! :install, forgotten_command_line_options(:path => bundled_app("bundle")).merge(:standalone => "default", :dir => cwd) - load_error_ruby <<-RUBY, "spec", :no_lib => true + load_error_ruby <<-RUBY, "spec" $:.unshift File.expand_path("bundle") require "bundler/setup" @@ -181,7 +181,7 @@ RSpec.shared_examples "bundle install --standalone" do it "allows --without to limit the groups used in a standalone" do bundle! :install, forgotten_command_line_options(:path => bundled_app("bundle"), :without => "test").merge(:standalone => true, :dir => cwd) - load_error_ruby <<-RUBY, "spec", :no_lib => true + load_error_ruby <<-RUBY, "spec" $:.unshift File.expand_path("bundle") require "bundler/setup" @@ -197,7 +197,7 @@ RSpec.shared_examples "bundle install --standalone" do it "allows --path to change the location of the standalone bundle" do bundle! "install", forgotten_command_line_options(:path => "path/to/bundle").merge(:standalone => true, :dir => cwd) - ruby <<-RUBY, :no_lib => true + ruby <<-RUBY $:.unshift File.expand_path("path/to/bundle") require "bundler/setup" @@ -212,7 +212,7 @@ RSpec.shared_examples "bundle install --standalone" do bundle! :install, forgotten_command_line_options(:without => "test").merge(:dir => cwd) bundle! :install, forgotten_command_line_options(:path => bundled_app("bundle")).merge(:standalone => true, :dir => cwd) - load_error_ruby <<-RUBY, "spec", :no_lib => true + load_error_ruby <<-RUBY, "spec" $:.unshift File.expand_path("bundle") require "bundler/setup" diff --git a/spec/bundler/install/gems/sudo_spec.rb b/spec/bundler/install/gems/sudo_spec.rb index 3e4c1ad1c1..bab8412170 100644 --- a/spec/bundler/install/gems/sudo_spec.rb +++ b/spec/bundler/install/gems/sudo_spec.rb @@ -145,6 +145,8 @@ RSpec.describe "when using sudo", :sudo => true do sudo "mkdir -p #{gem_home}" sudo "chmod ugo-w #{gem_home}" + system_gems :bundler, :path => gem_home + gemfile <<-G source "#{file_uri_for(gem_repo1)}" gem "rack", '1.0' diff --git a/spec/bundler/install/global_cache_spec.rb b/spec/bundler/install/global_cache_spec.rb index de7b511a1d..d93e158ed5 100644 --- a/spec/bundler/install/global_cache_spec.rb +++ b/spec/bundler/install/global_cache_spec.rb @@ -44,7 +44,7 @@ RSpec.describe "global gem caching" do gem "rack" G - FileUtils.rm_r(default_bundle_path) + simulate_new_machine expect(the_bundle).not_to include_gems "rack 1.0.0" expect(source_global_cache("rack-1.0.0.gem")).to exist # rack 1.0.0 is not installed and it is in the global cache @@ -54,7 +54,7 @@ RSpec.describe "global gem caching" do gem "rack", "0.9.1" G - FileUtils.rm_r(default_bundle_path) + simulate_new_machine expect(the_bundle).not_to include_gems "rack 0.9.1" expect(source2_global_cache("rack-0.9.1.gem")).to exist # rack 0.9.1 is not installed and it is in the global cache @@ -68,7 +68,7 @@ RSpec.describe "global gem caching" do # rack 1.0.0 is installed and rack 0.9.1 is not expect(the_bundle).to include_gems "rack 1.0.0" expect(the_bundle).not_to include_gems "rack 0.9.1" - FileUtils.rm_r(default_bundle_path) + simulate_new_machine gemfile <<-G source "#{source2}" @@ -88,7 +88,7 @@ RSpec.describe "global gem caching" do G bundle! :install, :artifice => "compact_index" - FileUtils.rm_r(default_bundle_path) + simulate_new_machine expect(the_bundle).not_to include_gems "rack 1.0.0" expect(source_global_cache("rack-1.0.0.gem")).to exist # rack 1.0.0 is not installed and it is in the global cache @@ -99,7 +99,7 @@ RSpec.describe "global gem caching" do G bundle! :install, :artifice => "compact_index" - FileUtils.rm_r(default_bundle_path) + simulate_new_machine expect(the_bundle).not_to include_gems "rack 0.9.1" expect(source2_global_cache("rack-0.9.1.gem")).to exist # rack 0.9.1 is not installed and it is in the global cache @@ -145,7 +145,7 @@ RSpec.describe "global gem caching" do expect(the_bundle).to include_gems "activesupport 2.3.5" expect(source_global_cache("rack-1.0.0.gem")).to exist expect(source_global_cache("activesupport-2.3.5.gem")).to exist - FileUtils.rm_r(default_bundle_path) + simulate_new_machine # Both gems are now only in the global cache expect(the_bundle).not_to include_gems "rack 1.0.0" expect(the_bundle).not_to include_gems "activesupport 2.3.5" @@ -185,7 +185,7 @@ RSpec.describe "global gem caching" do end end - describe "extension caching", :ruby_repo do + describe "extension caching" do it "works" do skip "gets incorrect ref in path" if Gem.win_platform? diff --git a/spec/bundler/install/path_spec.rb b/spec/bundler/install/path_spec.rb index bed28ed3e2..3176258565 100644 --- a/spec/bundler/install/path_spec.rb +++ b/spec/bundler/install/path_spec.rb @@ -162,7 +162,7 @@ RSpec.describe "bundle install" do expect(the_bundle).to include_gems "rack 1.0.0" end - it "re-installs gems whose extensions have been deleted", :ruby_repo do + it "re-installs gems whose extensions have been deleted" do build_lib "very_simple_binary", "1.0.0", :to_system => true do |s| s.write "lib/very_simple_binary.rb", "raise 'FAIL'" end diff --git a/spec/bundler/lock/lockfile_spec.rb b/spec/bundler/lock/lockfile_spec.rb index c4d06bd96e..1ec52d4238 100644 --- a/spec/bundler/lock/lockfile_spec.rb +++ b/spec/bundler/lock/lockfile_spec.rb @@ -28,6 +28,8 @@ RSpec.describe "the lockfile format" do end it "updates the lockfile's bundler version if current ver. is newer" do + system_gems "bundler-1.8.2" + lockfile <<-L GIT remote: git://github.com/nex3/haml.git @@ -50,7 +52,7 @@ RSpec.describe "the lockfile format" do 1.8.2 L - install_gemfile <<-G + install_gemfile <<-G, :env => { "BUNDLER_VERSION" => Bundler::VERSION } source "#{file_uri_for(gem_repo1)}" gem "rack" @@ -206,6 +208,8 @@ RSpec.describe "the lockfile format" do current_version = Bundler::VERSION older_major = previous_major(current_version) + system_gems "bundler-#{older_major}" + lockfile <<-L GEM remote: #{file_uri_for(gem_repo1)}/ @@ -222,7 +226,7 @@ RSpec.describe "the lockfile format" do #{older_major} L - install_gemfile <<-G + install_gemfile <<-G, :env => { "BUNDLER_VERSION" => Bundler::VERSION } source "#{file_uri_for(gem_repo1)}/" gem "rack" diff --git a/spec/bundler/other/major_deprecation_spec.rb b/spec/bundler/other/major_deprecation_spec.rb index 17bf923d84..e9398e3b24 100644 --- a/spec/bundler/other/major_deprecation_spec.rb +++ b/spec/bundler/other/major_deprecation_spec.rb @@ -394,7 +394,7 @@ RSpec.describe "major deprecations" do context "when `bundler/deployment` is required in a ruby script" do before do - ruby(<<-RUBY) + ruby(<<-RUBY, :env => env_for_missing_prerelease_default_gem_activation) require 'bundler/deployment' RUBY end @@ -416,25 +416,34 @@ RSpec.describe "major deprecations" do end context "with github gems" do - it "warns about removal", :bundler => "2" do + it "does not warn about removal", :bundler => "2" do + expect(Bundler.ui).not_to receive(:warn) + subject.gem("sparks", :github => "indirect/sparks") + github_uri = "https://github.com/indirect/sparks.git" + expect(subject.dependencies.first.source.uri).to eq(github_uri) + end + + it "warns about removal", :bundler => "3" do msg = <<-EOS The :github git source is deprecated, and will be removed in the future. Change any "reponame" :github sources to "username/reponame". Add this code to the top of your Gemfile to ensure it continues to work: git_source(:github) {|repo_name| "https://github.com/\#{repo_name}.git" } EOS - expect(Bundler::SharedHelpers).to receive(:major_deprecation).with(3, msg) + expect(Bundler.ui).to receive(:warn).with("[DEPRECATED] #{msg}") subject.gem("sparks", :github => "indirect/sparks") github_uri = "https://github.com/indirect/sparks.git" expect(subject.dependencies.first.source.uri).to eq(github_uri) end - - pending "should fail with a helpful error", :bundler => "3" end context "with bitbucket gems" do - it "warns about removal", :bundler => "2" do - allow(Bundler.ui).to receive(:deprecate) + it "does not warn about removal", :bundler => "2" do + expect(Bundler.ui).not_to receive(:warn) + subject.gem("not-really-a-gem", :bitbucket => "mcorp/flatlab-rails") + end + + it "warns about removal", :bundler => "3" do msg = <<-EOS The :bitbucket git source is deprecated, and will be removed in the future. Add this code to the top of your Gemfile to ensure it continues to work: @@ -445,27 +454,27 @@ The :bitbucket git source is deprecated, and will be removed in the future. Add end EOS - expect(Bundler::SharedHelpers).to receive(:major_deprecation).with(3, msg) + expect(Bundler.ui).to receive(:warn).with("[DEPRECATED] #{msg}") subject.gem("not-really-a-gem", :bitbucket => "mcorp/flatlab-rails") end - - pending "should fail with a helpful error", :bundler => "3" end context "with gist gems" do - it "warns about removal", :bundler => "2" do - allow(Bundler.ui).to receive(:deprecate) + it "does not warn about removal", :bundler => "2" do + expect(Bundler.ui).not_to receive(:warn) + subject.gem("not-really-a-gem", :gist => "1234") + end + + it "warns about removal", :bundler => "3" do msg = <<-EOS The :gist git source is deprecated, and will be removed in the future. Add this code to the top of your Gemfile to ensure it continues to work: git_source(:gist) {|repo_name| "https://gist.github.com/\#{repo_name}.git" } EOS - expect(Bundler::SharedHelpers).to receive(:major_deprecation).with(3, msg) + expect(Bundler.ui).to receive(:warn).with("[DEPRECATED] #{msg}") subject.gem("not-really-a-gem", :gist => "1234") end - - pending "should fail with a helpful error", :bundler => "3" end end @@ -564,13 +573,9 @@ The :gist git source is deprecated, and will be removed in the future. Add this end context "bundle viz" do - let(:ruby_graphviz) do - graphviz_glob = base_system_gems.join("cache/ruby-graphviz*") - Pathname.glob(graphviz_glob).first - end - before do - system_gems ruby_graphviz + graphviz_version = RUBY_VERSION >= "2.4" ? "1.2.5" : "1.2.4" + realworld_system_gems "ruby-graphviz --version #{graphviz_version}" create_file "gems.rb" bundle "viz" end diff --git a/spec/bundler/other/platform_spec.rb b/spec/bundler/other/platform_spec.rb index 966ef68b66..565706c30c 100644 --- a/spec/bundler/other/platform_spec.rb +++ b/spec/bundler/other/platform_spec.rb @@ -823,7 +823,7 @@ G end end - context "bundle exec", :ruby_repo do + context "bundle exec" do before do ENV["BUNDLER_FORCE_TTY"] = "true" system_gems "rack-1.0.0", "rack-0.9.1", :path => default_bundle_path @@ -1051,7 +1051,7 @@ G FileUtils.rm(bundled_app_lock) - ruby "require 'bundler/setup'" + ruby "require 'bundler/setup'", :env => { "BUNDLER_VERSION" => Bundler::VERSION } expect(bundled_app_lock).not_to exist should_be_ruby_version_incorrect @@ -1068,7 +1068,7 @@ G FileUtils.rm(bundled_app_lock) - ruby "require 'bundler/setup'" + ruby "require 'bundler/setup'", :env => { "BUNDLER_VERSION" => Bundler::VERSION } expect(bundled_app_lock).not_to exist should_be_engine_incorrect @@ -1085,7 +1085,7 @@ G FileUtils.rm(bundled_app_lock) - ruby "require 'bundler/setup'" + ruby "require 'bundler/setup'", :env => { "BUNDLER_VERSION" => Bundler::VERSION } expect(bundled_app_lock).not_to exist should_be_engine_version_incorrect @@ -1102,7 +1102,7 @@ G FileUtils.rm(bundled_app_lock) - ruby "require 'bundler/setup'" + ruby "require 'bundler/setup'", :env => { "BUNDLER_VERSION" => Bundler::VERSION } expect(bundled_app_lock).not_to exist should_be_patchlevel_incorrect diff --git a/spec/bundler/plugins/install_spec.rb b/spec/bundler/plugins/install_spec.rb index 663363ca21..f530f2d740 100644 --- a/spec/bundler/plugins/install_spec.rb +++ b/spec/bundler/plugins/install_spec.rb @@ -242,7 +242,7 @@ RSpec.describe "bundler plugin install" do end RUBY - ruby code + ruby code, :env => { "BUNDLER_VERSION" => Bundler::VERSION } expect(local_plugin_gem("foo-1.0", "plugins.rb")).to exist end end diff --git a/spec/bundler/quality_spec.rb b/spec/bundler/quality_spec.rb index 3891de4738..faeeedff5f 100644 --- a/spec/bundler/quality_spec.rb +++ b/spec/bundler/quality_spec.rb @@ -218,7 +218,7 @@ RSpec.describe "The library itself" do it "ships the correct set of files" do git_list = shipped_files - gem_list = Gem::Specification.load(gemspec.to_s).files + gem_list = loaded_gemspec.files expect(git_list.to_set).to eq(gem_list.to_set) end @@ -233,7 +233,7 @@ RSpec.describe "The library itself" do ] files_to_require = lib_tracked_files.grep(/\.rb$/) - exclusions files_to_require.reject! {|f| f.start_with?("lib/bundler/vendor") } - files_to_require.map! {|f| File.expand_path(root.join("#{f}"), __dir__) } + files_to_require.map! {|f| File.expand_path(f, source_root) } sys_exec!("ruby -w") do |input, _, _| files_to_require.each do |f| input.puts "require '#{f}'" diff --git a/spec/bundler/realworld/parallel_spec.rb b/spec/bundler/realworld/parallel_spec.rb index 7738b46aac..2a5154ffbf 100644 --- a/spec/bundler/realworld/parallel_spec.rb +++ b/spec/bundler/realworld/parallel_spec.rb @@ -53,7 +53,7 @@ RSpec.describe "parallel", :realworld => true, :sometimes => true do bundle :install, :standalone => true, :jobs => 4 - ruby <<-RUBY, :no_lib => true + ruby <<-RUBY $:.unshift File.expand_path("bundle") require "bundler/setup" diff --git a/spec/bundler/runtime/executable_spec.rb b/spec/bundler/runtime/executable_spec.rb index e420594f52..92c16a5f44 100644 --- a/spec/bundler/runtime/executable_spec.rb +++ b/spec/bundler/runtime/executable_spec.rb @@ -89,10 +89,6 @@ RSpec.describe "Running bin/* commands" do end it "creates a bundle binstub" do - build_gem "bundler", Bundler::VERSION, :to_system => true do |s| - s.executables = "bundle" - end - gemfile <<-G source "#{file_uri_for(gem_repo1)}" gem "bundler" diff --git a/spec/bundler/runtime/setup_spec.rb b/spec/bundler/runtime/setup_spec.rb index b39a740653..2aa0585bac 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -112,7 +112,7 @@ RSpec.describe "Bundler.setup" do lp.map! {|p| p.sub(/^#{Regexp.union system_gem_path.to_s, default_bundle_path.to_s, lib_dir.to_s}/i, "") } end - it "puts loaded gems after -I and RUBYLIB", :ruby_repo do + it "puts loaded gems after -I and RUBYLIB" do install_gemfile <<-G source "#{file_uri_for(gem_repo1)}" gem "rack" @@ -136,7 +136,7 @@ RSpec.describe "Bundler.setup" do end it "orders the load path correctly when there are dependencies" do - system_gems :bundler + bundle "config set path.system true" install_gemfile <<-G source "#{file_uri_for(gem_repo1)}" @@ -755,7 +755,7 @@ end expect(out).to eq("yay") end - it "should clean $LOAD_PATH properly", :ruby_repo do + it "should clean $LOAD_PATH properly" do gem_name = "very_simple_binary" full_gem_name = gem_name + "-1.0" ext_dir = File.join(tmp("extensions", full_gem_name)) @@ -802,7 +802,7 @@ end Dir.mkdir(gems_dir) Dir.mkdir(specifications_dir) - FileUtils.ln_s(root, File.join(gems_dir, full_name)) + FileUtils.ln_s(source_root, File.join(gems_dir, full_name)) gemspec_content = File.binread(gemspec). sub("Bundler::VERSION", %("#{Bundler::VERSION}")). @@ -816,9 +816,9 @@ end it "should not remove itself from the LOAD_PATH and require a different copy of 'bundler/setup'" do install_gemfile "" - ruby <<-R, :env => { "GEM_PATH" => symlinked_gem_home }, :no_lib => true + ruby <<-R, :env => { "GEM_PATH" => symlinked_gem_home } TracePoint.trace(:class) do |tp| - if tp.path.include?("bundler") && !tp.path.start_with?("#{root}") + if tp.path.include?("bundler") && !tp.path.start_with?("#{source_root}") puts "OMG. Defining a class from another bundler at \#{tp.path}:\#{tp.lineno}" end end @@ -1209,6 +1209,7 @@ end %w[io-console openssl] end << "bundler" exempts << "fiddle" if Gem.win_platform? && Gem::Version.new(Gem::VERSION) >= Gem::Version.new("2.7") + exempts << "uri" if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.7") exempts end @@ -1273,19 +1274,42 @@ end build_gem "net-http-pipeline", "1.0.1" end - system_gems "net-http-pipeline-1.0.1", :gem_repo => gem_repo4 do - gemfile <<-G - source "#{file_uri_for(gem_repo4)}" - gem "net-http-pipeline", "1.0.1" - G + system_gems "net-http-pipeline-1.0.1", :gem_repo => gem_repo4 - bundle "config set --local path vendor/bundle" + gemfile <<-G + source "#{file_uri_for(gem_repo4)}" + gem "net-http-pipeline", "1.0.1" + G - bundle! :install + bundle "config set --local path vendor/bundle" - bundle! :check + bundle! :install - expect(out).to eq("The Gemfile's dependencies are satisfied") + bundle! :check + + expect(out).to eq("The Gemfile's dependencies are satisfied") + end + + # bundler respects paths specified direclty in RUBYLIB or RUBYOPT, and + # that happens when running ruby from the ruby-core setup. To + # workaround, we manually remove those for these tests when they would + # override the default gem. + def load_path_exclusions_hack_for(name) + if ruby_core? + ext_folder = source_root.join(".ext/common") + require_name = name.tr("-", "/") + if File.exist?(ext_folder.join("#{require_name}.rb")) + { :exclude_from_load_path => ext_folder.to_s } + else + lib_folder = source_root.join("lib") + if File.exist?(lib_folder.join("#{require_name}.rb")) + { :exclude_from_load_path => lib_folder.to_s } + else + {} + end + end + else + {} end end @@ -1302,7 +1326,8 @@ end gem "#{g}", "999999" G - expect(the_bundle).to include_gem("#{g} 999999", :env => { "RUBYOPT" => activation_warning_hack_rubyopt }) + opts = { :env => { "RUBYOPT" => activation_warning_hack_rubyopt } } + expect(the_bundle).to include_gem("#{g} 999999", opts.merge(load_path_exclusions_hack_for(g))) end it "activates older versions of #{g}" do @@ -1317,7 +1342,8 @@ end gem "#{g}", "0.0.0.a" G - expect(the_bundle).to include_gem("#{g} 0.0.0.a", :env => { "RUBYOPT" => activation_warning_hack_rubyopt }) + opts = { :env => { "RUBYOPT" => activation_warning_hack_rubyopt } } + expect(the_bundle).to include_gem("#{g} 0.0.0.a", opts.merge(load_path_exclusions_hack_for(g))) end end end diff --git a/spec/bundler/runtime/with_unbundled_env_spec.rb b/spec/bundler/runtime/with_unbundled_env_spec.rb index 81e4fcfd6e..2baa785285 100644 --- a/spec/bundler/runtime/with_unbundled_env_spec.rb +++ b/spec/bundler/runtime/with_unbundled_env_spec.rb @@ -39,7 +39,7 @@ RSpec.describe "Bundler.with_env helpers" do end end - it "works with nested bundle exec invocations", :ruby_repo do + it "works with nested bundle exec invocations" do create_file("exe.rb", <<-'RUBY') count = ARGV.first.to_i exit if count < 0 @@ -61,7 +61,7 @@ RSpec.describe "Bundler.with_env helpers" do EOS end - it "removes variables that bundler added", :ruby_repo do + it "removes variables that bundler added" do # Simulate bundler has not yet been loaded ENV.replace(ENV.to_hash.delete_if {|k, _v| k.start_with?(Bundler::EnvironmentPreserver::BUNDLER_PREFIX) }) @@ -89,11 +89,13 @@ RSpec.describe "Bundler.with_env helpers" do print #{modified_env}['RUBYOPT'] RUBY ENV["RUBYOPT"] = "-W2 -rbundler/setup #{ENV["RUBYOPT"]}" - bundle_exec_ruby! bundled_app("source.rb"), :env => { "BUNDLER_SPEC_DISABLE_DEFAULT_BUNDLER_GEM" => "true" } + simulate_bundler_version_when_missing_prerelease_default_gem_activation do + bundle_exec_ruby! bundled_app("source.rb") + end expect(last_command.stdboth).not_to include("-rbundler/setup") end - it "should restore RUBYLIB", :ruby_repo do + it "should restore RUBYLIB" do create_file("source.rb", <<-RUBY) print #{modified_env}['RUBYLIB'] RUBY @@ -202,7 +204,7 @@ RSpec.describe "Bundler.with_env helpers" do RUBY end - it "runs system inside with_clean_env", :ruby_repo do + it "runs system inside with_clean_env" do run_bundler_script({ "BUNDLE_FOO" => "bar" }, bundled_app("source.rb")) expect($?.exitstatus).to eq(42) end @@ -217,7 +219,7 @@ RSpec.describe "Bundler.with_env helpers" do RUBY end - it "runs system inside with_unbundled_env", :ruby_repo do + it "runs system inside with_unbundled_env" do run_bundler_script({ "BUNDLE_FOO" => "bar" }, bundled_app("source.rb")) expect($?.exitstatus).to eq(42) end diff --git a/spec/bundler/spec_helper.rb b/spec/bundler/spec_helper.rb index 6b08cb203f..1985ae45ce 100644 --- a/spec/bundler/spec_helper.rb +++ b/spec/bundler/spec_helper.rb @@ -1,9 +1,5 @@ # frozen_string_literal: true -require_relative "support/path" - -$:.unshift Spec::Path.lib_dir.to_s - require "bundler/psyched_yaml" require "bundler/vendored_fileutils" require "bundler/vendored_uri" @@ -61,8 +57,6 @@ RSpec.configure do |config| config.bisect_runner = :shell - original_env = ENV.to_hash - config.expect_with :rspec do |c| c.syntax = :expect end @@ -90,39 +84,40 @@ RSpec.configure do |config| # Don't wrap output in tests ENV["THOR_COLUMNS"] = "10000" - original_env = ENV.to_hash - - if ENV["RUBY"] - FileUtils.cp_r Spec::Path.bindir, File.join(Spec::Path.root, "lib", "exe") - end + extend(Spec::Helpers) + system_gems :bundler, :path => pristine_system_gem_path end config.before :all do build_repo1 + + reset_paths! end config.around :each do |example| - ENV.replace(original_env) - reset! - system_gems [] + begin + FileUtils.cp_r pristine_system_gem_path, system_gem_path - @command_executions = [] + with_gem_path_as(system_gem_path) do + @command_executions = [] - Bundler.ui.silence { example.run } + Bundler.ui.silence { example.run } - all_output = @command_executions.map(&:to_s_verbose).join("\n\n") - if example.exception && !all_output.empty? - warn all_output unless config.formatters.grep(RSpec::Core::Formatters::DocumentationFormatter).empty? - message = example.exception.message + "\n\nCommands:\n#{all_output}" - (class << example.exception; self; end).send(:define_method, :message) do - message + all_output = @command_executions.map(&:to_s_verbose).join("\n\n") + if example.exception && !all_output.empty? + warn all_output unless config.formatters.grep(RSpec::Core::Formatters::DocumentationFormatter).empty? + message = example.exception.message + "\n\nCommands:\n#{all_output}" + (class << example.exception; self; end).send(:define_method, :message) do + message + end + end end + ensure + reset! end end config.after :suite do - if ENV["RUBY"] - FileUtils.rm_rf File.join(Spec::Path.root, "lib", "exe") - end + FileUtils.rm_r Spec::Path.pristine_system_gem_path end end diff --git a/spec/bundler/support/artifice/compact_index.rb b/spec/bundler/support/artifice/compact_index.rb index 67fd05f9a2..5cf3a79f29 100644 --- a/spec/bundler/support/artifice/compact_index.rb +++ b/spec/bundler/support/artifice/compact_index.rb @@ -2,11 +2,13 @@ require_relative "endpoint" -$LOAD_PATH.unshift Dir[base_system_gems.join("gems/compact_index*/lib")].first.to_s +$LOAD_PATH.unshift Dir[Spec::Path.base_system_gems.join("gems/compact_index*/lib")].first.to_s require "compact_index" class CompactIndexAPI < Endpoint helpers do + include Spec::Path + def load_spec(name, version, platform, gem_repo) full_name = "#{name}-#{version}" full_name += "-#{platform}" if platform != "ruby" @@ -83,7 +85,7 @@ class CompactIndexAPI < Endpoint nil end CompactIndex::GemVersion.new(spec.version.version, spec.platform.to_s, checksum, nil, - deps, spec.required_ruby_version, spec.required_rubygems_version) + deps, spec.required_ruby_version.to_s, spec.required_rubygems_version.to_s) end CompactIndex::Gem.new(name, gem_versions) end diff --git a/spec/bundler/support/artifice/endpoint.rb b/spec/bundler/support/artifice/endpoint.rb index 3ed9a3f0f7..1dc7101389 100644 --- a/spec/bundler/support/artifice/endpoint.rb +++ b/spec/bundler/support/artifice/endpoint.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true require_relative "../path" -require Spec::Path.lib_dir.join("bundler/deprecate") -include Spec::Path $LOAD_PATH.unshift(*Dir[Spec::Path.base_system_gems.join("gems/{artifice,mustermann,rack,tilt,sinatra,ruby2_keywords}-*/lib")].map(&:to_s)) @@ -41,28 +39,27 @@ class Endpoint < Sinatra::Base end helpers do + include Spec::Path + def dependencies_for(gem_names, gem_repo = GEM_REPO) return [] if gem_names.nil? || gem_names.empty? - require "#{Spec::Path.lib_dir}/bundler" - Bundler::Deprecate.skip_during do - all_specs = %w[specs.4.8 prerelease_specs.4.8].map do |filename| - Marshal.load(File.open(gem_repo.join(filename)).read) - end.inject(:+) + all_specs = %w[specs.4.8 prerelease_specs.4.8].map do |filename| + Marshal.load(File.open(gem_repo.join(filename)).read) + end.inject(:+) - all_specs.map do |name, version, platform| - spec = load_spec(name, version, platform, gem_repo) - next unless gem_names.include?(spec.name) - { - :name => spec.name, - :number => spec.version.version, - :platform => spec.platform.to_s, - :dependencies => spec.dependencies.select {|dep| dep.type == :runtime }.map do |dep| - [dep.name, dep.requirement.requirements.map {|a| a.join(" ") }.join(", ")] - end, - } - end.compact - end + all_specs.map do |name, version, platform| + spec = load_spec(name, version, platform, gem_repo) + next unless gem_names.include?(spec.name) + { + :name => spec.name, + :number => spec.version.version, + :platform => spec.platform.to_s, + :dependencies => spec.dependencies.select {|dep| dep.type == :runtime }.map do |dep| + [dep.name, dep.requirement.requirements.map {|a| a.join(" ") }.join(", ")] + end, + } + end.compact end def load_spec(name, version, platform, gem_repo) diff --git a/spec/bundler/support/artifice/endpoint_500.rb b/spec/bundler/support/artifice/endpoint_500.rb index 7c1c4365bb..0ce8dfeaad 100644 --- a/spec/bundler/support/artifice/endpoint_500.rb +++ b/spec/bundler/support/artifice/endpoint_500.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative "../path" -include Spec::Path $LOAD_PATH.unshift(*Dir[Spec::Path.base_system_gems.join("gems/{artifice,mustermann,rack,tilt,sinatra,ruby2_keywords}-*/lib")].map(&:to_s)) diff --git a/spec/bundler/support/artifice/windows.rb b/spec/bundler/support/artifice/windows.rb index c31c6fff79..f5b4baae30 100644 --- a/spec/bundler/support/artifice/windows.rb +++ b/spec/bundler/support/artifice/windows.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative "../path" -include Spec::Path $LOAD_PATH.unshift(*Dir[Spec::Path.base_system_gems.join("gems/{artifice,mustermann,rack,tilt,sinatra,ruby2_keywords}-*/lib")].map(&:to_s)) diff --git a/spec/bundler/support/builders.rb b/spec/bundler/support/builders.rb index 5ce6e01da3..de71c64b56 100644 --- a/spec/bundler/support/builders.rb +++ b/spec/bundler/support/builders.rb @@ -758,9 +758,9 @@ module Spec gem_path = File.expand_path("#{@spec.full_name}.gem", lib_path) if opts[:to_system] - @context.system_gems gem_path, :keep_path => true + @context.system_gems gem_path elsif opts[:to_bundle] - @context.system_gems gem_path, :path => @context.default_bundle_path, :keep_path => true + @context.system_gems gem_path, :path => @context.default_bundle_path else FileUtils.mv(gem_path, destination) end diff --git a/spec/bundler/support/hax.rb b/spec/bundler/support/hax.rb index 4b5c5dd94c..7529dc460a 100644 --- a/spec/bundler/support/hax.rb +++ b/spec/bundler/support/hax.rb @@ -9,13 +9,25 @@ module Gem Gem.ruby = ENV["RUBY"] end - class Platform - @local = new(ENV["BUNDLER_SPEC_PLATFORM"]) if ENV["BUNDLER_SPEC_PLATFORM"] + if ENV["BUNDLER_SPEC_PLATFORM"] + class Platform + @local = new(ENV["BUNDLER_SPEC_PLATFORM"]) + end + @platforms = [Gem::Platform::RUBY, Gem::Platform.local] + + if ENV["BUNDLER_SPEC_PLATFORM"] == "ruby" + class << self + remove_method :finish_resolve + + def finish_resolve + [] + end + end + end end - @platforms = [Gem::Platform::RUBY, Gem::Platform.local] # We only need this hack for rubygems versions without the BundlerVersionFinder - if Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") || ENV["BUNDLER_SPEC_DISABLE_DEFAULT_BUNDLER_GEM"] + if Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") @path_to_default_spec_map.delete_if do |_path, spec| spec.name == "bundler" end @@ -24,7 +36,7 @@ end if ENV["BUNDLER_SPEC_WINDOWS"] == "true" require_relative "path" - require "#{Spec::Path.lib_dir}/bundler/constants" + require "bundler/constants" module Bundler remove_const :WINDOWS if defined?(WINDOWS) @@ -34,8 +46,8 @@ end if ENV["BUNDLER_SPEC_API_REQUEST_LIMIT"] require_relative "path" - require "#{Spec::Path.lib_dir}/bundler/source" - require "#{Spec::Path.lib_dir}/bundler/source/rubygems" + require "bundler/source" + require "bundler/source/rubygems" module Bundler class Source diff --git a/spec/bundler/support/helpers.rb b/spec/bundler/support/helpers.rb index 50cf4438d9..731a2d9664 100644 --- a/spec/bundler/support/helpers.rb +++ b/spec/bundler/support/helpers.rb @@ -2,17 +2,25 @@ require_relative "command_execution" require_relative "the_bundle" +require_relative "path" module Spec module Helpers + include Spec::Path + def reset! Dir.glob("#{tmp}/{gems/*,*}", File::FNM_DOTMATCH).each do |dir| - next if %w[base remote1 gems rubygems . ..].include?(File.basename(dir)) + next if %w[base base_system remote1 gems rubygems . ..].include?(File.basename(dir)) FileUtils.rm_rf(dir) end FileUtils.mkdir_p(home) FileUtils.mkdir_p(tmpdir) + reset_paths! + end + + def reset_paths! Bundler.reset! + Gem.clear_paths end def self.bang(method) @@ -80,14 +88,10 @@ module Spec with_sudo = options.delete(:sudo) sudo = with_sudo == :preserve_env ? "sudo -E --preserve-env=RUBYOPT" : "sudo" if with_sudo - bundle_bin = options.delete("bundle_bin") || bindir.join("bundle") - - if system_bundler = options.delete(:system_bundler) - bundle_bin = system_gem_path.join("bin/bundler") - end + bundle_bin = options.delete(:bundle_bin) + bundle_bin ||= installed_bindir.join("bundle") env = options.delete(:env) || {} - env["PATH"].gsub!("#{Path.root}/exe", "") if env["PATH"] && system_bundler requires = options.delete(:requires) || [] @@ -103,7 +107,6 @@ module Spec end load_path = [] - load_path << lib_dir unless system_bundler load_path << spec_dir dir = options.delete(:dir) || bundled_app @@ -145,12 +148,12 @@ module Spec end def bundler(cmd, options = {}) - options["bundle_bin"] = bindir.join("bundler") + options[:bundle_bin] = system_gem_path.join("bin/bundler") bundle(cmd, options) end def ruby(ruby, options = {}) - ruby_cmd = build_ruby_cmd({ :load_path => options[:no_lib] ? [] : [lib_dir] }) + ruby_cmd = build_ruby_cmd escaped_ruby = RUBY_PLATFORM == "java" ? ruby.shellescape.dump : ruby.shellescape sys_exec(%(#{ruby_cmd} -w -e #{escaped_ruby}), options) end @@ -169,8 +172,8 @@ module Spec def build_ruby_cmd(options = {}) sudo = options.delete(:sudo) - libs = options.delete(:load_path) || [] - lib_option = "-I#{libs.join(File::PATH_SEPARATOR)}" + libs = options.delete(:load_path) + lib_option = libs ? "-I#{libs.join(File::PATH_SEPARATOR)}" : [] requires = options.delete(:requires) || [] requires << "#{Path.spec_dir}/support/hax.rb" @@ -180,12 +183,8 @@ module Spec end def gembin(cmd, options = {}) - old = ENV["RUBYOPT"] - ENV["RUBYOPT"] = "#{ENV["RUBYOPT"]} -I#{lib_dir}" cmd = bundled_app("bin/#{cmd}") unless cmd.to_s.include?("/") sys_exec(cmd.to_s, options) - ensure - ENV["RUBYOPT"] = old end def gem_command(command, options = {}) @@ -328,14 +327,16 @@ module Spec FileUtils.cp shipped_file, target_shipped_file, :preserve => true end - # for Ruby core repository - if File.exist? File.join(build_path, "lib/bundler/bundler.gemspec") - FileUtils.mv File.join(build_path, "lib/bundler/bundler.gemspec"), build_path - end - replace_version_file(version, dir: build_path) # rubocop:disable Style/HashSyntax - gem_command! "build bundler.gemspec", :dir => build_path + build_metadata = { + :built_at => loaded_gemspec.date.utc.strftime("%Y-%m-%d"), + :git_commit_sha => sys_exec("git rev-parse --short HEAD", :dir => source_root).strip, + } + + replace_build_metadata(build_metadata, dir: build_path) # rubocop:disable Style/HashSyntax + + gem_command! "build #{relative_gemspec}", :dir => build_path yield(bundler_path) ensure @@ -344,19 +345,24 @@ module Spec end def with_gem_path_as(path) - backup = ENV.to_hash - ENV["GEM_HOME"] = path.to_s - ENV["GEM_PATH"] = path.to_s - ENV["BUNDLER_ORIG_GEM_PATH"] = nil - yield - ensure - ENV.replace(backup) + without_env_side_effects do + ENV["GEM_HOME"] = path.to_s + ENV["GEM_PATH"] = path.to_s + ENV["BUNDLER_ORIG_GEM_PATH"] = nil + yield + end end def with_path_as(path) + without_env_side_effects do + ENV["PATH"] = path.to_s + ENV["BUNDLER_ORIG_PATH"] = nil + yield + end + end + + def without_env_side_effects backup = ENV.to_hash - ENV["PATH"] = path.to_s - ENV["BUNDLER_ORIG_PATH"] = nil yield ensure ENV.replace(backup) @@ -397,56 +403,29 @@ module Spec with_path_added(tmp("fake_man")) { yield } end + def pristine_system_gems(*gems) + FileUtils.rm_rf(system_gem_path) + + system_gems(*gems) + end + def system_gems(*gems) opts = gems.last.is_a?(Hash) ? gems.last : {} path = opts.fetch(:path, system_gem_path) gems = gems.flatten - unless opts[:keep_path] - FileUtils.rm_rf(path) - FileUtils.mkdir_p(path) - end - - Gem.clear_paths - - env_backup = ENV.to_hash - ENV["GEM_HOME"] = path.to_s - ENV["GEM_PATH"] = path.to_s - ENV["BUNDLER_ORIG_GEM_PATH"] = nil - - install_gems(*gems) - return unless block_given? - begin - yield - ensure - ENV.replace(env_backup) + with_gem_path_as(path) do + install_gems(*gems) end end def realworld_system_gems(*gems) gems = gems.flatten - FileUtils.rm_rf(system_gem_path) - FileUtils.mkdir_p(system_gem_path) - - Gem.clear_paths - - gem_home = ENV["GEM_HOME"] - gem_path = ENV["GEM_PATH"] - path = ENV["PATH"] - ENV["GEM_HOME"] = system_gem_path.to_s - ENV["GEM_PATH"] = system_gem_path.to_s - - gems.each do |gem| - gem_command! "install --no-document #{gem}" - end - return unless block_given? - begin - yield - ensure - ENV["GEM_HOME"] = gem_home - ENV["GEM_PATH"] = gem_path - ENV["PATH"] = path + with_gem_path_as(system_gem_path) do + gems.each do |gem| + gem_command! "install --no-document #{gem}" + end end end @@ -464,9 +443,8 @@ module Spec end def simulate_new_machine - system_gems [] - FileUtils.rm_rf system_gem_path FileUtils.rm_rf bundled_app(".bundle") + pristine_system_gems :bundler end def simulate_platform(platform) @@ -490,12 +468,34 @@ module Spec old = ENV["BUNDLER_SPEC_WINDOWS"] ENV["BUNDLER_SPEC_WINDOWS"] = "true" simulate_platform platform do - yield + simulate_bundler_version_when_missing_prerelease_default_gem_activation do + yield + end end ensure ENV["BUNDLER_SPEC_WINDOWS"] = old end + # workaround for missing https://github.com/rubygems/rubygems/commit/929e92d752baad3a08f3ac92eaec162cb96aedd1 + def simulate_bundler_version_when_missing_prerelease_default_gem_activation + return yield unless Gem.rubygems_version < Gem::Version.new("3.1.0.pre.1") + + old = ENV["BUNDLER_VERSION"] + ENV["BUNDLER_VERSION"] = Bundler::VERSION + yield + ensure + ENV["BUNDLER_VERSION"] = old + end + + # workaround for missing https://github.com/rubygems/rubygems/commit/929e92d752baad3a08f3ac92eaec162cb96aedd1 + def env_for_missing_prerelease_default_gem_activation + if Gem.rubygems_version < Gem::Version.new("3.1.0.pre.1") + { "BUNDLER_VERSION" => Bundler::VERSION } + else + {} + end + end + def revision_for(path) sys_exec("git rev-parse HEAD", :dir => path).strip end diff --git a/spec/bundler/support/matchers.rb b/spec/bundler/support/matchers.rb index e6275064a8..a5e546d333 100644 --- a/spec/bundler/support/matchers.rb +++ b/spec/bundler/support/matchers.rb @@ -115,13 +115,18 @@ module Spec opts = names.last.is_a?(Hash) ? names.pop : {} source = opts.delete(:source) groups = Array(opts[:groups]) + exclude_from_load_path = opts.delete(:exclude_from_load_path) groups << opts @errors = names.map do |name| name, version, platform = name.split(/\s+/) require_path = name == "bundler" ? "#{lib_dir}/bundler" : name.tr("-", "/") version_const = name == "bundler" ? "Bundler::VERSION" : Spec::Builders.constantize(name) begin - run! "require '#{require_path}.rb'; puts #{version_const}", *groups + code = [] + code << "$LOAD_PATH.delete '#{exclude_from_load_path}'" if exclude_from_load_path + code << "require '#{require_path}.rb'" + code << "puts #{version_const}" + run! code.join("; "), *groups rescue StandardError => e next "#{name} is not installed:\n#{indent(e)}" end diff --git a/spec/bundler/support/path.rb b/spec/bundler/support/path.rb index 3fb13a0283..600f3e3b6f 100644 --- a/spec/bundler/support/path.rb +++ b/spec/bundler/support/path.rb @@ -5,56 +5,82 @@ require "rbconfig" module Spec module Path + def source_root + @source_root ||= Pathname.new(ruby_core? ? "../../../.." : "../../..").expand_path(__FILE__) + end + def root - @root ||= Pathname.new(ruby_core? ? "../../../.." : "../../..").expand_path(__FILE__) + @root ||= system_gem_path("gems/bundler-#{Bundler::VERSION}") end def gemspec - @gemspec ||= root.join(ruby_core? ? "lib/bundler/bundler.gemspec" : "bundler.gemspec") + @gemspec ||= source_root.join(relative_gemspec) + end + + def relative_gemspec + @relative_gemspec ||= ruby_core? ? "lib/bundler/bundler.gemspec" : "bundler.gemspec" end def gemspec_dir @gemspec_dir ||= gemspec.parent end + def loaded_gemspec + @loaded_gemspec ||= Gem::Specification.load(gemspec.to_s) + end + + def test_gemfile + @test_gemfile ||= source_root.join(ruby_core? ? "tool/bundler/test_gems.rb" : "test_gems.rb") + end + + def dev_gemfile + @dev_gemfile ||= source_root.join("dev_gems.rb") + end + def bindir - @bindir ||= root.join(ruby_core? ? "libexec" : "exe") + @bindir ||= source_root.join(ruby_core? ? "libexec" : "exe") + end + + def installed_bindir + @installed_bindir ||= system_gem_path("bin") end def gem_cmd - @gem_cmd ||= ruby_core? ? root.join("bin/gem") : "gem" + @gem_cmd ||= ruby_core? ? source_root.join("bin/gem") : "gem" end def gem_bin @gem_bin ||= ruby_core? ? ENV["GEM_COMMAND"] : "gem" end + def path + env_path = ENV["PATH"] + env_path = env_path.split(File::PATH_SEPARATOR).reject {|path| path == bindir.to_s }.join(File::PATH_SEPARATOR) if ruby_core? + env_path + end + def spec_dir - @spec_dir ||= root.join(ruby_core? ? "spec/bundler" : "spec") + @spec_dir ||= source_root.join(ruby_core? ? "spec/bundler" : "spec") end def tracked_files - skip "not in git working directory" unless git_root_dir? - @tracked_files ||= sys_exec(ruby_core? ? "git ls-files -z -- lib/bundler lib/bundler.rb spec/bundler man/bundler*" : "git ls-files -z", :dir => root).split("\x0") + @tracked_files ||= git_ls_files(tracked_files_glob) end def shipped_files - skip "not in git working directory" unless git_root_dir? - @shipped_files ||= sys_exec(ruby_core? ? "git ls-files -z -- lib/bundler lib/bundler.rb man/bundler* libexec/bundle*" : "git ls-files -z -- lib man exe CHANGELOG.md LICENSE.md README.md bundler.gemspec", :dir => root).split("\x0") + @shipped_files ||= git_ls_files(shipped_files_glob) end def lib_tracked_files - skip "not in git working directory" unless git_root_dir? - @lib_tracked_files ||= sys_exec(ruby_core? ? "git ls-files -z -- lib/bundler lib/bundler.rb" : "git ls-files -z -- lib", :dir => root).split("\x0") + @lib_tracked_files ||= git_ls_files(lib_tracked_files_glob) end def man_tracked_files - skip "not in git working directory" unless git_root_dir? - @man_tracked_files ||= sys_exec(ruby_core? ? "git ls-files -z -- man/bundler*" : "git ls-files -z -- man", :dir => root).split("\x0") + @man_tracked_files ||= git_ls_files(man_tracked_files_glob) end def tmp(*path) - root.join("tmp", scope, *path) + source_root.join("tmp", scope, *path) end def scope @@ -143,6 +169,10 @@ module Spec tmp("gems/system", *path) end + def pristine_system_gem_path + tmp("gems/base_system") + end + def local_gem_path(*path, base: bundled_app) base.join(*[".bundle", Gem.ruby_engine, RbConfig::CONFIG["ruby_version"], *path].compact) end @@ -151,6 +181,10 @@ module Spec tmp("libs", *args) end + def source_lib_dir + source_root.join("lib") + end + def lib_dir root.join("lib") end @@ -167,13 +201,25 @@ module Spec tmp "tmpdir", *args end - def replace_version_file(version, dir: root) + def replace_version_file(version, dir: source_root) version_file = File.expand_path("lib/bundler/version.rb", dir) contents = File.read(version_file) contents.sub!(/(^\s+VERSION\s*=\s*)"#{Gem::Version::VERSION_PATTERN}"/, %(\\1"#{version}")) File.open(version_file, "w") {|f| f << contents } end + def replace_build_metadata(build_metadata, dir: source_root) + build_metadata_file = File.expand_path("lib/bundler/build_metadata.rb", dir) + + ivars = build_metadata.sort.map do |k, v| + " @#{k} = #{loaded_gemspec.send(:ruby_code, v)}" + end.join("\n") + + contents = File.read(build_metadata_file) + contents.sub!(/^(\s+# begin ivars).+(^\s+# end ivars)/m, "\\1\n#{ivars}\n\\2") + File.open(build_metadata_file, "w") {|f| f << contents } + end + def ruby_core? # avoid to warnings @ruby_core ||= nil @@ -185,6 +231,29 @@ module Spec end end + private + + def git_ls_files(glob) + skip "not in git working directory" unless git_root_dir? + sys_exec("git ls-files -z -- #{glob}", :dir => source_root).split("\x0") + end + + def tracked_files_glob + ruby_core? ? "lib/bundler lib/bundler.rb spec/bundler man/bundle*" : "" + end + + def shipped_files_glob + ruby_core? ? "lib/bundler lib/bundler.rb man/bundle* man/gemfile* libexec/bundle*" : "lib man exe CHANGELOG.md LICENSE.md README.md bundler.gemspec" + end + + def lib_tracked_files_glob + ruby_core? ? "lib/bundler lib/bundler.rb" : "lib" + end + + def man_tracked_files_glob + ruby_core? ? "man/bundle* man/gemfile*" : "man" + end + extend self end end diff --git a/spec/bundler/support/rubygems_ext.rb b/spec/bundler/support/rubygems_ext.rb index 2aaf072715..d13567d7af 100644 --- a/spec/bundler/support/rubygems_ext.rb +++ b/spec/bundler/support/rubygems_ext.rb @@ -2,7 +2,7 @@ require_relative "path" -$LOAD_PATH.unshift(Spec::Path.lib_dir.to_s) +$LOAD_PATH.unshift(Spec::Path.source_lib_dir.to_s) module Spec module Rubygems @@ -59,7 +59,8 @@ module Spec ENV["BUNDLE_PATH"] = nil ENV["GEM_HOME"] = ENV["GEM_PATH"] = Path.base_system_gems.to_s - ENV["PATH"] = [Path.bindir, Path.system_gem_path.join("bin"), ENV["PATH"]].join(File::PATH_SEPARATOR) + ENV["PATH"] = [Path.system_gem_path.join("bin"), ENV["PATH"]].join(File::PATH_SEPARATOR) + ENV["PATH"] = [Path.bindir, ENV["PATH"]].join(File::PATH_SEPARATOR) if Path.ruby_core? end def install_test_deps @@ -103,16 +104,13 @@ module Spec require "bundler" definition = Bundler::Definition.build(gemfile, lockfile, nil) definition.validate_runtime! - Bundler::Installer.install(Path.root, definition, :path => ENV["GEM_HOME"]) + Bundler::Installer.install(Path.source_root, definition, :path => ENV["GEM_HOME"]) ensure ENV["BUNDLE_GEMFILE"] = old_gemfile end def test_gemfile - gemfile = Path.root.join("test_gems.rb") - # for Ruby core repository - gemfile = Path.root.join("tool/bundler/test_gems.rb") unless File.exist?(gemfile) - gemfile + Path.test_gemfile end def test_lockfile @@ -120,7 +118,7 @@ module Spec end def dev_gemfile - Path.root.join("dev_gems.rb") + Path.dev_gemfile end def dev_lockfile diff --git a/spec/bundler/support/rubygems_version_manager.rb b/spec/bundler/support/rubygems_version_manager.rb index aa4cfc460b..a74cb64337 100644 --- a/spec/bundler/support/rubygems_version_manager.rb +++ b/spec/bundler/support/rubygems_version_manager.rb @@ -96,7 +96,7 @@ private def resolve_local_copy_path return expanded_source if source_is_path? - rubygems_path = root.join("tmp/rubygems") + rubygems_path = source_root.join("tmp/rubygems") unless rubygems_path.directory? rubygems_path.parent.mkpath @@ -111,7 +111,7 @@ private end def expanded_source - @expanded_source ||= Pathname.new(@source).expand_path(root) + @expanded_source ||= Pathname.new(@source).expand_path(source_root) end def resolve_target_tag diff --git a/spec/bundler/support/switch_rubygems.rb b/spec/bundler/support/switch_rubygems.rb index d3dd685d31..a138d22333 100644 --- a/spec/bundler/support/switch_rubygems.rb +++ b/spec/bundler/support/switch_rubygems.rb @@ -2,13 +2,3 @@ require_relative "rubygems_version_manager" RubygemsVersionManager.new(ENV["RGV"]).switch - -if ENV["BUNDLER_SPEC_IGNORE_DEFAULT_BUNDLER_GEM"] - module NoBundlerStubs - def default_stubs(pattern = "*.gemspec") - super(pattern).reject {|s| s.name == "bundler" } - end - end - - Gem::Specification.singleton_class.prepend(NoBundlerStubs) -end