2018-11-02 19:07:56 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
RSpec.describe "bundle install with gem sources" do
|
|
|
|
describe "the simple case" do
|
|
|
|
it "prints output and returns if no dependencies are specified" do
|
|
|
|
gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
G
|
|
|
|
|
|
|
|
bundle :install
|
2019-04-14 02:01:35 -04:00
|
|
|
expect(err).to match(/no dependencies/)
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "does not make a lockfile if the install fails" do
|
2020-06-03 12:43:17 -04:00
|
|
|
install_gemfile <<-G, :raise_on_error => false
|
2018-11-02 19:07:56 -04:00
|
|
|
raise StandardError, "FAIL"
|
|
|
|
G
|
|
|
|
|
2019-06-01 05:49:40 -04:00
|
|
|
expect(err).to include('StandardError, "FAIL"')
|
2020-05-08 01:19:04 -04:00
|
|
|
expect(bundled_app_lock).not_to exist
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "creates a Gemfile.lock" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
2020-05-08 01:19:04 -04:00
|
|
|
expect(bundled_app_lock).to exist
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
2019-01-04 08:10:58 -05:00
|
|
|
it "does not create ./.bundle by default", :bundler => "< 3" do
|
2018-11-02 19:07:56 -04:00
|
|
|
gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
2020-06-03 14:45:36 -04:00
|
|
|
bundle :install # can't use install_gemfile since it sets retry
|
2018-11-02 19:07:56 -04:00
|
|
|
expect(bundled_app(".bundle")).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "does not create ./.bundle by default when installing to system gems" do
|
|
|
|
gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
2020-06-03 14:45:36 -04:00
|
|
|
bundle :install, :env => { "BUNDLE_PATH__SYSTEM" => "true" } # can't use install_gemfile since it sets retry
|
2018-11-02 19:07:56 -04:00
|
|
|
expect(bundled_app(".bundle")).not_to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "creates lock files based on the Gemfile name" do
|
|
|
|
gemfile bundled_app("OmgFile"), <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack", "1.0"
|
|
|
|
G
|
|
|
|
|
|
|
|
bundle "install --gemfile OmgFile"
|
|
|
|
|
|
|
|
expect(bundled_app("OmgFile.lock")).to exist
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't delete the lockfile if one already exists" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem 'rack'
|
|
|
|
G
|
|
|
|
|
2020-05-08 01:19:04 -04:00
|
|
|
lockfile = File.read(bundled_app_lock)
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2020-06-03 12:43:17 -04:00
|
|
|
install_gemfile <<-G, :raise_on_error => false
|
2018-11-02 19:07:56 -04:00
|
|
|
raise StandardError, "FAIL"
|
|
|
|
G
|
|
|
|
|
2020-05-08 01:19:04 -04:00
|
|
|
expect(File.read(bundled_app_lock)).to eq(lockfile)
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "does not touch the lockfile if nothing changed" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
2020-05-08 01:19:04 -04:00
|
|
|
expect { run "1" }.not_to change { File.mtime(bundled_app_lock) }
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "fetches gems" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem 'rack'
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(default_bundle_path("gems/rack-1.0.0")).to exist
|
|
|
|
expect(the_bundle).to include_gems("rack 1.0.0")
|
|
|
|
end
|
|
|
|
|
2021-10-09 07:42:05 -04:00
|
|
|
it "auto-heals missing gems" do
|
|
|
|
install_gemfile <<-G
|
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
gem 'rack'
|
|
|
|
G
|
|
|
|
|
|
|
|
FileUtils.rm_rf(default_bundle_path("gems/rack-1.0.0"))
|
|
|
|
|
|
|
|
bundle "install --verbose"
|
|
|
|
|
|
|
|
expect(out).to include("Installing rack 1.0.0")
|
|
|
|
expect(default_bundle_path("gems/rack-1.0.0")).to exist
|
|
|
|
expect(the_bundle).to include_gems("rack 1.0.0")
|
|
|
|
end
|
|
|
|
|
2018-11-02 19:07:56 -04:00
|
|
|
it "fetches gems when multiple versions are specified" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem 'rack', "> 0.9", "< 1.0"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(default_bundle_path("gems/rack-0.9.1")).to exist
|
|
|
|
expect(the_bundle).to include_gems("rack 0.9.1")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "fetches gems when multiple versions are specified take 2" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem 'rack', "< 1.0", "> 0.9"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(default_bundle_path("gems/rack-0.9.1")).to exist
|
|
|
|
expect(the_bundle).to include_gems("rack 0.9.1")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an appropriate error when gems are specified using symbols" do
|
2020-06-03 12:43:17 -04:00
|
|
|
install_gemfile <<-G, :raise_on_error => false
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem :rack
|
|
|
|
G
|
2020-06-24 13:53:16 -04:00
|
|
|
expect(exitstatus).to eq(4)
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "pulls in dependencies" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rails"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "actionpack 2.3.2", "rails 2.3.2"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "does the right version" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack", "0.9.1"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "rack 0.9.1"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "does not install the development dependency" do
|
2020-12-08 02:36:29 -05:00
|
|
|
build_repo2 do
|
|
|
|
build_gem "with_development_dependency" do |s|
|
|
|
|
s.add_development_dependency "activesupport", "= 2.3.5"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-11-02 19:07:56 -04:00
|
|
|
install_gemfile <<-G
|
2020-12-08 02:36:29 -05:00
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "with_development_dependency"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems("with_development_dependency 1.0.0").
|
|
|
|
and not_include_gems("activesupport 2.3.5")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "resolves correctly" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "activemerchant"
|
|
|
|
gem "rails"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "activemerchant 1.0", "activesupport 2.3.2", "actionpack 2.3.2"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "activates gem correctly according to the resolved gems" do
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "activesupport", "2.3.5"
|
|
|
|
G
|
|
|
|
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "activemerchant"
|
|
|
|
gem "rails"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "activemerchant 1.0", "activesupport 2.3.2", "actionpack 2.3.2"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "does not reinstall any gem that is already available locally" do
|
2020-05-08 01:19:04 -04:00
|
|
|
system_gems "activesupport-2.3.2", :path => default_bundle_path
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
build_repo2 do
|
|
|
|
build_gem "activesupport", "2.3.2" do |s|
|
|
|
|
s.write "lib/activesupport.rb", "ACTIVESUPPORT = 'fail'"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "activerecord", "2.3.2"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "activesupport 2.3.2"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "works when the gemfile specifies gems that only exist in the system" do
|
|
|
|
build_gem "foo", :to_bundle => true
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
gem "foo"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "rack 1.0.0", "foo 1.0.0"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "prioritizes local gems over remote gems" do
|
|
|
|
build_gem "rack", "1.0.0", :to_bundle => true do |s|
|
|
|
|
s.add_dependency "activesupport", "2.3.5"
|
|
|
|
end
|
|
|
|
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "rack 1.0.0", "activesupport 2.3.5"
|
|
|
|
end
|
|
|
|
|
2020-12-08 02:36:29 -05:00
|
|
|
it "loads env plugins" do
|
|
|
|
plugin_msg = "hello from an env plugin!"
|
|
|
|
create_file "plugins/rubygems_plugin.rb", "puts '#{plugin_msg}'"
|
|
|
|
rubylib = ENV["RUBYLIB"].to_s.split(File::PATH_SEPARATOR).unshift(bundled_app("plugins").to_s).join(File::PATH_SEPARATOR)
|
|
|
|
install_gemfile <<-G, :env => { "RUBYLIB" => rubylib }
|
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(last_command.stdboth).to include(plugin_msg)
|
|
|
|
end
|
|
|
|
|
2018-11-02 19:07:56 -04:00
|
|
|
describe "with a gem that installs multiple platforms" do
|
|
|
|
it "installs gems for the local platform as first choice" do
|
2020-05-08 01:19:04 -04:00
|
|
|
skip "version is 1.0, not 1.0.0" if Gem.win_platform?
|
|
|
|
|
2018-11-02 19:07:56 -04:00
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "platform_specific"
|
|
|
|
G
|
|
|
|
|
|
|
|
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
|
|
|
|
expect(out).to eq("1.0.0 #{Bundler.local_platform}")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "falls back on plain ruby" do
|
|
|
|
simulate_platform "foo-bar-baz"
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "platform_specific"
|
|
|
|
G
|
|
|
|
|
|
|
|
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
|
|
|
|
expect(out).to eq("1.0.0 RUBY")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "installs gems for java" do
|
|
|
|
simulate_platform "java"
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "platform_specific"
|
|
|
|
G
|
|
|
|
|
|
|
|
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
|
|
|
|
expect(out).to eq("1.0.0 JAVA")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "installs gems for windows" do
|
|
|
|
simulate_platform mswin
|
|
|
|
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "platform_specific"
|
|
|
|
G
|
|
|
|
|
|
|
|
run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
|
|
|
|
expect(out).to eq("1.0.0 MSWIN")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "doing bundle install foo" do
|
|
|
|
before do
|
|
|
|
gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
end
|
|
|
|
|
|
|
|
it "works" do
|
2021-01-03 20:11:34 -05:00
|
|
|
bundle "config set --local path vendor"
|
2020-05-29 06:46:16 -04:00
|
|
|
bundle "install"
|
2018-11-02 19:07:56 -04:00
|
|
|
expect(the_bundle).to include_gems "rack 1.0"
|
|
|
|
end
|
|
|
|
|
2019-01-04 08:10:58 -05:00
|
|
|
it "allows running bundle install --system without deleting foo", :bundler => "< 3" do
|
2020-05-28 12:03:32 -04:00
|
|
|
bundle "install --path vendor"
|
|
|
|
bundle "install --system"
|
2018-11-02 19:07:56 -04:00
|
|
|
FileUtils.rm_rf(bundled_app("vendor"))
|
|
|
|
expect(the_bundle).to include_gems "rack 1.0"
|
|
|
|
end
|
|
|
|
|
2019-01-04 08:10:58 -05:00
|
|
|
it "allows running bundle install --system after deleting foo", :bundler => "< 3" do
|
2020-05-28 12:03:32 -04:00
|
|
|
bundle "install --path vendor"
|
2018-11-02 19:07:56 -04:00
|
|
|
FileUtils.rm_rf(bundled_app("vendor"))
|
2020-05-28 12:03:32 -04:00
|
|
|
bundle "install --system"
|
2018-11-02 19:07:56 -04:00
|
|
|
expect(the_bundle).to include_gems "rack 1.0"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-01-04 08:10:58 -05:00
|
|
|
it "finds gems in multiple sources", :bundler => "< 3" do
|
2020-12-08 02:36:29 -05:00
|
|
|
build_repo2 do
|
|
|
|
build_gem "rack", "1.2" do |s|
|
|
|
|
s.executables = "rackup"
|
|
|
|
end
|
|
|
|
end
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
gem "activesupport", "1.2.3"
|
|
|
|
gem "rack", "1.2"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(the_bundle).to include_gems "rack 1.2", "activesupport 1.2.3"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "gives a useful error if no sources are set" do
|
2020-06-03 12:43:17 -04:00
|
|
|
install_gemfile <<-G, :raise_on_error => false
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
2021-07-25 00:16:11 -04:00
|
|
|
expect(err).to include("This Gemfile does not include an explicit global source. " \
|
|
|
|
"Not using an explicit global source may result in a different lockfile being generated depending on " \
|
2021-07-31 22:25:20 -04:00
|
|
|
"the gems you have installed locally before bundler is run. " \
|
2021-07-25 00:16:11 -04:00
|
|
|
"Instead, define a global source in your Gemfile like this: source \"https://rubygems.org\".")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "creates a Gemfile.lock on a blank Gemfile" do
|
|
|
|
install_gemfile <<-G
|
2021-07-24 11:27:02 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
G
|
|
|
|
|
2020-05-08 01:19:04 -04:00
|
|
|
expect(File.exist?(bundled_app_lock)).to eq(true)
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
it "throws a warning if a gem is added twice in Gemfile without version requirements" do
|
2021-12-26 19:41:55 -05:00
|
|
|
build_repo2
|
|
|
|
|
|
|
|
install_gemfile <<-G
|
2021-07-13 07:58:08 -04:00
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
|
|
|
gem "rack"
|
|
|
|
gem "rack"
|
|
|
|
G
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
expect(err).to include("Your Gemfile lists the gem rack (>= 0) more than once.")
|
|
|
|
expect(err).to include("Remove any duplicate entries and specify the gem only once.")
|
|
|
|
expect(err).to include("While it's not a problem now, it could cause errors if you change the version of one of them later.")
|
|
|
|
end
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
it "throws a warning if a gem is added twice in Gemfile with same versions" do
|
2021-12-26 19:41:55 -05:00
|
|
|
build_repo2
|
|
|
|
|
|
|
|
install_gemfile <<-G
|
2021-07-13 07:58:08 -04:00
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
|
|
|
gem "rack", "1.0"
|
|
|
|
gem "rack", "1.0"
|
|
|
|
G
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
expect(err).to include("Your Gemfile lists the gem rack (= 1.0) more than once.")
|
|
|
|
expect(err).to include("Remove any duplicate entries and specify the gem only once.")
|
|
|
|
expect(err).to include("While it's not a problem now, it could cause errors if you change the version of one of them later.")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
2021-12-26 19:41:55 -05:00
|
|
|
it "throws a warning if a gem is added twice under different platforms and does not crash when using the generated lockfile" do
|
|
|
|
build_repo2
|
|
|
|
|
|
|
|
install_gemfile <<-G
|
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
|
|
|
gem "rack", :platform => :jruby
|
|
|
|
gem "rack"
|
|
|
|
G
|
|
|
|
|
|
|
|
bundle "install"
|
|
|
|
|
|
|
|
expect(err).to include("Your Gemfile lists the gem rack (>= 0) more than once.")
|
|
|
|
expect(err).to include("Remove any duplicate entries and specify the gem only once.")
|
|
|
|
expect(err).to include("While it's not a problem now, it could cause errors if you change the version of one of them later.")
|
|
|
|
end
|
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
it "does not throw a warning if a gem is added once in Gemfile and also inside a gemspec as a development dependency" do
|
|
|
|
build_lib "my-gem", :path => bundled_app do |s|
|
|
|
|
s.add_development_dependency "my-private-gem"
|
|
|
|
end
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
build_repo2 do
|
|
|
|
build_gem "my-private-gem"
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
gemfile <<~G
|
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2021-07-13 07:58:08 -04:00
|
|
|
gemspec
|
|
|
|
|
|
|
|
gem "my-private-gem", :group => :development
|
|
|
|
G
|
|
|
|
|
|
|
|
bundle :install
|
|
|
|
|
|
|
|
expect(err).to be_empty
|
2021-07-12 04:30:16 -04:00
|
|
|
expect(the_bundle).to include_gems("my-private-gem 1.0")
|
2021-07-13 07:58:08 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "throws an error if a gem is added twice in Gemfile when version of one dependency is not specified" do
|
|
|
|
install_gemfile <<-G, :raise_on_error => false
|
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
|
|
|
gem "rack"
|
|
|
|
gem "rack", "1.0"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(err).to include("You cannot specify the same gem twice with different version requirements")
|
|
|
|
expect(err).to include("You specified: rack (>= 0) and rack (= 1.0).")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "throws an error if a gem is added twice in Gemfile when different versions of both dependencies are specified" do
|
|
|
|
install_gemfile <<-G, :raise_on_error => false
|
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
|
|
|
gem "rack", "1.0"
|
|
|
|
gem "rack", "1.1"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(err).to include("You cannot specify the same gem twice with different version requirements")
|
|
|
|
expect(err).to include("You specified: rack (= 1.0) and rack (= 1.1).")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "gracefully handles error when rubygems server is unavailable" do
|
2020-05-08 01:19:04 -04:00
|
|
|
skip "networking issue" if Gem.win_platform?
|
|
|
|
|
2020-06-03 12:43:17 -04:00
|
|
|
install_gemfile <<-G, :artifice => nil, :raise_on_error => false
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2019-04-14 02:01:35 -04:00
|
|
|
source "http://0.0.0.0:9384" do
|
2018-11-02 19:07:56 -04:00
|
|
|
gem 'foo'
|
|
|
|
end
|
|
|
|
G
|
|
|
|
|
2019-04-14 02:01:35 -04:00
|
|
|
expect(err).to include("Could not fetch specs from http://0.0.0.0:9384/")
|
|
|
|
expect(err).not_to include("file://")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
2019-04-14 02:01:35 -04:00
|
|
|
it "fails gracefully when downloading an invalid specification from the full index" do
|
2018-11-02 19:07:56 -04:00
|
|
|
build_repo2 do
|
|
|
|
build_gem "ajp-rails", "0.0.0", :gemspec => false, :skip_validation => true do |s|
|
|
|
|
bad_deps = [["ruby-ajp", ">= 0.2.0"], ["rails", ">= 0.14"]]
|
|
|
|
s.
|
|
|
|
instance_variable_get(:@spec).
|
|
|
|
instance_variable_set(:@dependencies, bad_deps)
|
|
|
|
|
|
|
|
raise "failed to set bad deps" unless s.dependencies == bad_deps
|
|
|
|
end
|
|
|
|
build_gem "ruby-ajp", "1.0.0"
|
|
|
|
end
|
|
|
|
|
2020-06-03 12:43:17 -04:00
|
|
|
install_gemfile <<-G, :full_index => true, :raise_on_error => false
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo2)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
gem "ajp-rails", "0.0.0"
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(last_command.stdboth).not_to match(/Error Report/i)
|
2019-06-01 05:49:40 -04:00
|
|
|
expect(err).to include("An error occurred while installing ajp-rails (0.0.0), and Bundler cannot continue.").
|
2021-07-23 09:53:59 -04:00
|
|
|
and include("Bundler::APIResponseInvalidDependenciesError")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't blow up when the local .bundle/config is empty" do
|
|
|
|
FileUtils.mkdir_p(bundled_app(".bundle"))
|
|
|
|
FileUtils.touch(bundled_app(".bundle/config"))
|
|
|
|
|
|
|
|
install_gemfile(<<-G)
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
gem 'foo'
|
|
|
|
G
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't blow up when the global .bundle/config is empty" do
|
|
|
|
FileUtils.mkdir_p("#{Bundler.rubygems.user_home}/.bundle")
|
|
|
|
FileUtils.touch("#{Bundler.rubygems.user_home}/.bundle/config")
|
|
|
|
|
|
|
|
install_gemfile(<<-G)
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
gem 'foo'
|
|
|
|
G
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "Ruby version in Gemfile.lock" do
|
|
|
|
include Bundler::GemHelpers
|
|
|
|
|
|
|
|
context "and using an unsupported Ruby version" do
|
|
|
|
it "prints an error" do
|
2020-06-03 12:43:17 -04:00
|
|
|
install_gemfile <<-G, :raise_on_error => false
|
2021-12-26 11:41:21 -05:00
|
|
|
ruby '~> 1.2'
|
2021-07-24 11:27:02 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
G
|
2021-12-26 11:41:21 -05:00
|
|
|
expect(err).to include("Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified ~> 1.2")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "and using a supported Ruby version" do
|
|
|
|
before do
|
|
|
|
install_gemfile <<-G
|
2021-12-26 11:41:21 -05:00
|
|
|
ruby '~> #{RUBY_VERSION}'
|
2021-07-24 11:27:02 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
G
|
|
|
|
end
|
|
|
|
|
|
|
|
it "writes current Ruby version to Gemfile.lock" do
|
2021-11-11 14:24:02 -05:00
|
|
|
expect(lockfile).to eq <<~L
|
2018-11-02 19:07:56 -04:00
|
|
|
GEM
|
2021-07-24 11:27:02 -04:00
|
|
|
remote: #{file_uri_for(gem_repo1)}/
|
2018-11-02 19:07:56 -04:00
|
|
|
specs:
|
|
|
|
|
|
|
|
PLATFORMS
|
|
|
|
#{lockfile_platforms}
|
|
|
|
|
|
|
|
DEPENDENCIES
|
|
|
|
|
|
|
|
RUBY VERSION
|
2021-12-26 11:41:21 -05:00
|
|
|
#{Bundler::RubyVersion.system}
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
BUNDLED WITH
|
|
|
|
#{Bundler::VERSION}
|
|
|
|
L
|
|
|
|
end
|
|
|
|
|
2021-12-26 11:41:21 -05:00
|
|
|
it "updates Gemfile.lock with updated yet still compatible ruby version" do
|
2018-11-02 19:07:56 -04:00
|
|
|
install_gemfile <<-G
|
2021-12-26 11:41:21 -05:00
|
|
|
ruby '~> #{RUBY_VERSION[0..2]}'
|
2021-07-24 11:27:02 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
G
|
|
|
|
|
2021-11-11 14:24:02 -05:00
|
|
|
expect(lockfile).to eq <<~L
|
2018-11-02 19:07:56 -04:00
|
|
|
GEM
|
2021-07-24 11:27:02 -04:00
|
|
|
remote: #{file_uri_for(gem_repo1)}/
|
2018-11-02 19:07:56 -04:00
|
|
|
specs:
|
|
|
|
|
|
|
|
PLATFORMS
|
|
|
|
#{lockfile_platforms}
|
|
|
|
|
|
|
|
DEPENDENCIES
|
|
|
|
|
|
|
|
RUBY VERSION
|
2021-12-26 11:41:21 -05:00
|
|
|
#{Bundler::RubyVersion.system}
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
BUNDLED WITH
|
|
|
|
#{Bundler::VERSION}
|
|
|
|
L
|
|
|
|
end
|
2020-10-15 00:20:25 -04:00
|
|
|
|
|
|
|
it "does not crash when unlocking" do
|
|
|
|
gemfile <<-G
|
2021-07-24 11:27:02 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2020-10-15 00:20:25 -04:00
|
|
|
ruby '>= 2.1.0'
|
|
|
|
G
|
|
|
|
|
|
|
|
bundle "update"
|
|
|
|
|
|
|
|
expect(err).not_to include("Could not find gem 'Ruby")
|
|
|
|
end
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "when Bundler root contains regex chars" do
|
2020-10-15 00:20:25 -04:00
|
|
|
it "doesn't blow up when using the `gem` DSL" do
|
2018-11-02 19:07:56 -04:00
|
|
|
root_dir = tmp("foo[]bar")
|
|
|
|
|
|
|
|
FileUtils.mkdir_p(root_dir)
|
|
|
|
|
|
|
|
build_lib "foo"
|
|
|
|
gemfile = <<-G
|
2021-07-24 11:27:02 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem 'foo', :path => "#{lib_path("foo-1.0")}"
|
|
|
|
G
|
2020-05-08 01:19:04 -04:00
|
|
|
File.open("#{root_dir}/Gemfile", "w") do |file|
|
2018-11-02 19:07:56 -04:00
|
|
|
file.puts gemfile
|
|
|
|
end
|
|
|
|
|
2020-05-08 01:19:04 -04:00
|
|
|
bundle :install, :dir => root_dir
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
2020-10-15 00:20:25 -04:00
|
|
|
|
|
|
|
it "doesn't blow up when using the `gemspec` DSL" do
|
|
|
|
root_dir = tmp("foo[]bar")
|
|
|
|
|
|
|
|
FileUtils.mkdir_p(root_dir)
|
|
|
|
|
|
|
|
build_lib "foo", :path => root_dir
|
|
|
|
gemfile = <<-G
|
2021-07-24 11:27:02 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2020-10-15 00:20:25 -04:00
|
|
|
gemspec
|
|
|
|
G
|
|
|
|
File.open("#{root_dir}/Gemfile", "w") do |file|
|
|
|
|
file.puts gemfile
|
|
|
|
end
|
|
|
|
|
|
|
|
bundle :install, :dir => root_dir
|
|
|
|
end
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe "when requesting a quiet install via --quiet" do
|
2021-07-25 07:03:09 -04:00
|
|
|
it "should be quiet if there are no warnings" do
|
|
|
|
bundle "config set force_ruby_platform true"
|
|
|
|
|
|
|
|
gemfile <<-G
|
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
gem 'rack'
|
|
|
|
G
|
|
|
|
|
|
|
|
bundle :install, :quiet => true
|
|
|
|
expect(out).to be_empty
|
|
|
|
expect(err).to be_empty
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should still display warnings and errors" do
|
2019-07-23 07:11:33 -04:00
|
|
|
bundle "config set force_ruby_platform true"
|
|
|
|
|
2021-07-25 06:35:35 -04:00
|
|
|
create_file("install_with_warning.rb", <<~RUBY)
|
|
|
|
require "#{lib_dir}/bundler"
|
|
|
|
require "#{lib_dir}/bundler/cli"
|
|
|
|
require "#{lib_dir}/bundler/cli/install"
|
|
|
|
|
|
|
|
module RunWithWarning
|
|
|
|
def run
|
|
|
|
super
|
|
|
|
rescue
|
|
|
|
Bundler.ui.warn "BOOOOO"
|
|
|
|
raise
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
Bundler::CLI::Install.prepend(RunWithWarning)
|
|
|
|
RUBY
|
|
|
|
|
2018-11-02 19:07:56 -04:00
|
|
|
gemfile <<-G
|
2021-07-25 06:35:35 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
gem 'non-existing-gem'
|
2018-11-02 19:07:56 -04:00
|
|
|
G
|
|
|
|
|
2021-07-25 06:35:35 -04:00
|
|
|
bundle :install, :quiet => true, :raise_on_error => false, :env => { "RUBYOPT" => "-r#{bundled_app("install_with_warning.rb")}" }
|
2021-07-25 07:03:09 -04:00
|
|
|
expect(out).to be_empty
|
2021-07-25 06:35:35 -04:00
|
|
|
expect(err).to include("Could not find gem 'non-existing-gem'")
|
2021-07-25 07:03:09 -04:00
|
|
|
expect(err).to include("BOOOOO")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-08 01:19:04 -04:00
|
|
|
describe "when bundle path does not have write access", :permissions do
|
2021-01-03 20:11:34 -05:00
|
|
|
let(:bundle_path) { bundled_app("vendor") }
|
|
|
|
|
|
|
|
before do
|
|
|
|
FileUtils.mkdir_p(bundle_path)
|
|
|
|
gemfile <<-G
|
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
gem 'rack'
|
|
|
|
G
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should display a proper message to explain the problem" do
|
|
|
|
FileUtils.chmod(0o500, bundle_path)
|
|
|
|
|
|
|
|
bundle "config set --local path vendor"
|
|
|
|
bundle :install, :raise_on_error => false
|
|
|
|
expect(err).to include(bundle_path.to_s)
|
|
|
|
expect(err).to include("grant write permissions")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-10-14 06:03:51 -04:00
|
|
|
describe "when bundle gems path does not have write access", :permissions do
|
|
|
|
let(:gems_path) { bundled_app("vendor/#{Bundler.ruby_scope}/gems") }
|
|
|
|
|
|
|
|
before do
|
|
|
|
FileUtils.mkdir_p(gems_path)
|
|
|
|
gemfile <<-G
|
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
gem 'rack'
|
|
|
|
G
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should display a proper message to explain the problem" do
|
|
|
|
FileUtils.chmod("-x", gems_path)
|
|
|
|
bundle "config set --local path vendor"
|
|
|
|
|
|
|
|
begin
|
|
|
|
bundle :install, :raise_on_error => false
|
|
|
|
ensure
|
|
|
|
FileUtils.chmod("+x", gems_path)
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(err).not_to include("ERROR REPORT TEMPLATE")
|
|
|
|
|
|
|
|
expect(err).to include(
|
|
|
|
"There was an error while trying to create `#{gems_path.join("rack-1.0.0")}`. " \
|
|
|
|
"It is likely that you need to grant executable permissions for all parent directories and write permissions for `#{gems_path}`."
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-10-14 06:03:57 -04:00
|
|
|
describe "when the path of a specific gem is not writable", :permissions do
|
|
|
|
let(:gems_path) { bundled_app("vendor/#{Bundler.ruby_scope}/gems") }
|
|
|
|
let(:foo_path) { gems_path.join("foo-1.0.0") }
|
|
|
|
|
|
|
|
before do
|
|
|
|
build_repo4 do
|
|
|
|
build_gem "foo", "1.0.0" do |s|
|
|
|
|
s.write "CHANGELOG.md", "foo"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
gemfile <<-G
|
|
|
|
source "#{file_uri_for(gem_repo4)}"
|
|
|
|
gem 'foo'
|
|
|
|
G
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should display a proper message to explain the problem" do
|
|
|
|
bundle "config set --local path vendor"
|
|
|
|
bundle :install
|
|
|
|
expect(out).to include("Bundle complete!")
|
|
|
|
expect(err).to be_empty
|
|
|
|
|
|
|
|
FileUtils.chmod("-x", foo_path)
|
|
|
|
|
|
|
|
begin
|
|
|
|
bundle "install --redownload", :raise_on_error => false
|
|
|
|
ensure
|
|
|
|
FileUtils.chmod("+x", foo_path)
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(err).not_to include("ERROR REPORT TEMPLATE")
|
|
|
|
|
|
|
|
expect(err).to include(
|
|
|
|
"There was an error while trying to delete `#{foo_path}`. " \
|
|
|
|
"It is likely that you need to grant executable permissions for all parent directories " \
|
|
|
|
"and write permissions for `#{gems_path}`, and the same thing for all subdirectories inside #{foo_path}."
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-01-03 20:11:34 -05:00
|
|
|
describe "when bundle cache path does not have write access", :permissions do
|
|
|
|
let(:cache_path) { bundled_app("vendor/#{Bundler.ruby_scope}/cache") }
|
|
|
|
|
2018-11-02 19:07:56 -04:00
|
|
|
before do
|
2021-01-03 20:11:34 -05:00
|
|
|
FileUtils.mkdir_p(cache_path)
|
2018-11-02 19:07:56 -04:00
|
|
|
gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem 'rack'
|
|
|
|
G
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should display a proper message to explain the problem" do
|
2021-01-03 20:11:34 -05:00
|
|
|
FileUtils.chmod(0o500, cache_path)
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2021-01-03 20:11:34 -05:00
|
|
|
bundle "config set --local path vendor"
|
2020-06-03 12:43:17 -04:00
|
|
|
bundle :install, :raise_on_error => false
|
2021-01-03 20:11:34 -05:00
|
|
|
expect(err).to include(cache_path.to_s)
|
2019-04-14 02:01:35 -04:00
|
|
|
expect(err).to include("grant write permissions")
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "after installing with --standalone" do
|
|
|
|
before do
|
2020-06-03 14:46:03 -04:00
|
|
|
install_gemfile <<-G
|
2019-05-06 12:06:21 -04:00
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
2018-11-02 19:07:56 -04:00
|
|
|
gem "rack"
|
|
|
|
G
|
2021-01-03 20:11:34 -05:00
|
|
|
bundle "config set --local path bundle"
|
2020-06-03 14:45:36 -04:00
|
|
|
bundle "install", :standalone => true
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "includes the standalone path" do
|
2020-06-03 14:45:36 -04:00
|
|
|
bundle "binstubs rack", :standalone => true
|
2018-11-02 19:07:56 -04:00
|
|
|
standalone_line = File.read(bundled_app("bin/rackup")).each_line.find {|line| line.include? "$:.unshift" }.strip
|
|
|
|
expect(standalone_line).to eq %($:.unshift File.expand_path "../../bundle", path.realpath)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "when bundle install is executed with unencoded authentication" do
|
|
|
|
before do
|
|
|
|
gemfile <<-G
|
|
|
|
source 'https://rubygems.org/'
|
|
|
|
gem "."
|
|
|
|
G
|
|
|
|
end
|
|
|
|
|
2019-04-14 02:01:35 -04:00
|
|
|
it "should display a helpful message explaining how to fix it" do
|
2020-06-03 12:43:17 -04:00
|
|
|
bundle :install, :env => { "BUNDLE_RUBYGEMS__ORG" => "user:pass{word" }, :raise_on_error => false
|
2020-06-24 13:53:16 -04:00
|
|
|
expect(exitstatus).to eq(17)
|
2019-04-14 02:01:35 -04:00
|
|
|
expect(err).to eq("Please CGI escape your usernames and passwords before " \
|
2018-11-02 19:07:56 -04:00
|
|
|
"setting them for authentication.")
|
|
|
|
end
|
|
|
|
end
|
2020-12-22 18:45:19 -05:00
|
|
|
|
|
|
|
context "in a frozen bundle" do
|
|
|
|
before do
|
|
|
|
build_repo4 do
|
|
|
|
build_gem "libv8", "8.4.255.0" do |s|
|
|
|
|
s.platform = "x86_64-darwin-19"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
gemfile <<-G
|
|
|
|
source "#{file_uri_for(gem_repo4)}"
|
|
|
|
|
|
|
|
gem "libv8"
|
|
|
|
G
|
|
|
|
|
|
|
|
lockfile <<-L
|
|
|
|
GEM
|
|
|
|
remote: #{file_uri_for(gem_repo4)}/
|
|
|
|
specs:
|
|
|
|
libv8 (8.4.255.0-x86_64-darwin-19)
|
|
|
|
|
|
|
|
PLATFORMS
|
|
|
|
x86_64-darwin-19
|
|
|
|
|
|
|
|
DEPENDENCIES
|
|
|
|
libv8
|
|
|
|
|
|
|
|
BUNDLED WITH
|
|
|
|
#{Bundler::VERSION}
|
|
|
|
L
|
|
|
|
|
|
|
|
bundle "config set --local deployment true"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should fail loudly if the lockfile platforms don't include the current platform" do
|
|
|
|
simulate_platform(Gem::Platform.new("x86_64-linux")) { bundle "install", :raise_on_error => false }
|
|
|
|
|
|
|
|
expect(err).to eq(
|
|
|
|
"Your bundle only supports platforms [\"x86_64-darwin-19\"] but your local platform is x86_64-linux. " \
|
|
|
|
"Add the current platform to the lockfile with `bundle lock --add-platform x86_64-linux` and try again."
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
2021-07-31 09:39:45 -04:00
|
|
|
|
[rubygems/rubygems] Fix `bundle install` crash due to an incorrectly incomplete resolve
In case we have a corrupted lockfile that claims to support a platform, but
it's missing platform specific gems for it, bundler has a check that
detects the situation and forces a re-resolve. The result of this check
is kept under the `@locked_specs_incomplete_for_platformn` instance
variable in `Definition`.
The installer, however, calls `Definition#nothing_changed?` before this
instance variable has been filled, so the result of it is actually
incorrect here since it will claim that nothing has changed, but
something has changed (locked specs are incomplete for the current
platform).
The consequence of this incorrect result is that the installer thinks it
can go on without re-resolving, resulting in the incomplete resolution
from the lockfile being used, and in a crash being triggered due to
that.
The solution is to make sure the `@locked_specs_incomplete_for_platform`
instance variable is filled before `nothing_changed?` gets called.
Moving it to `initialize` makes the most sense, not because it's the
best place for it (we can refactor this later), but because all of the
other "outdated definition" checks are already set there.
https://github.com/rubygems/rubygems/commit/708afdd789
2021-09-29 15:11:23 -04:00
|
|
|
context "with missing platform specific gems in lockfile" do
|
|
|
|
before do
|
|
|
|
build_repo4 do
|
|
|
|
build_gem "racc", "1.5.2"
|
|
|
|
|
|
|
|
build_gem "nokogiri", "1.12.4" do |s|
|
|
|
|
s.platform = "x86_64-darwin"
|
|
|
|
s.add_runtime_dependency "racc", "~> 1.4"
|
|
|
|
end
|
|
|
|
|
|
|
|
build_gem "nokogiri", "1.12.4" do |s|
|
|
|
|
s.platform = "x86_64-linux"
|
|
|
|
s.add_runtime_dependency "racc", "~> 1.4"
|
|
|
|
end
|
|
|
|
|
|
|
|
build_gem "crass", "1.0.6"
|
|
|
|
|
|
|
|
build_gem "loofah", "2.12.0" do |s|
|
|
|
|
s.add_runtime_dependency "crass", "~> 1.0.2"
|
|
|
|
s.add_runtime_dependency "nokogiri", ">= 1.5.9"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
gemfile <<-G
|
|
|
|
source "https://gem.repo4"
|
|
|
|
|
|
|
|
ruby "#{RUBY_VERSION}"
|
|
|
|
|
|
|
|
gem "loofah", "~> 2.12.0"
|
|
|
|
G
|
|
|
|
|
|
|
|
lockfile <<-L
|
|
|
|
GEM
|
|
|
|
remote: https://gem.repo4/
|
|
|
|
specs:
|
|
|
|
crass (1.0.6)
|
|
|
|
loofah (2.12.0)
|
|
|
|
crass (~> 1.0.2)
|
|
|
|
nokogiri (>= 1.5.9)
|
|
|
|
nokogiri (1.12.4-x86_64-darwin)
|
|
|
|
racc (~> 1.4)
|
|
|
|
racc (1.5.2)
|
|
|
|
|
|
|
|
PLATFORMS
|
|
|
|
x86_64-darwin-20
|
|
|
|
x86_64-linux
|
|
|
|
|
|
|
|
DEPENDENCIES
|
|
|
|
loofah (~> 2.12.0)
|
|
|
|
|
|
|
|
RUBY VERSION
|
|
|
|
#{Bundler::RubyVersion.system}
|
|
|
|
|
|
|
|
BUNDLED WITH
|
|
|
|
#{Bundler::VERSION}
|
|
|
|
L
|
|
|
|
end
|
|
|
|
|
|
|
|
it "automatically fixes the lockfile" do
|
|
|
|
bundle "config set --local path vendor/bundle"
|
|
|
|
|
|
|
|
simulate_platform "x86_64-linux" do
|
|
|
|
bundle "install", :artifice => "compact_index"
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(lockfile).to eq <<~L
|
|
|
|
GEM
|
|
|
|
remote: https://gem.repo4/
|
|
|
|
specs:
|
|
|
|
crass (1.0.6)
|
|
|
|
loofah (2.12.0)
|
|
|
|
crass (~> 1.0.2)
|
|
|
|
nokogiri (>= 1.5.9)
|
|
|
|
nokogiri (1.12.4-x86_64-darwin)
|
|
|
|
racc (~> 1.4)
|
|
|
|
nokogiri (1.12.4-x86_64-linux)
|
|
|
|
racc (~> 1.4)
|
|
|
|
racc (1.5.2)
|
|
|
|
|
|
|
|
PLATFORMS
|
|
|
|
x86_64-darwin-20
|
|
|
|
x86_64-linux
|
|
|
|
|
|
|
|
DEPENDENCIES
|
|
|
|
loofah (~> 2.12.0)
|
|
|
|
|
|
|
|
RUBY VERSION
|
|
|
|
#{Bundler::RubyVersion.system}
|
|
|
|
|
|
|
|
BUNDLED WITH
|
|
|
|
#{Bundler::VERSION}
|
|
|
|
L
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-07-31 09:39:45 -04:00
|
|
|
context "with --local flag" do
|
|
|
|
before do
|
|
|
|
system_gems "rack-1.0.0", :path => default_bundle_path
|
|
|
|
end
|
|
|
|
|
|
|
|
it "respects installed gems without fetching any remote sources" do
|
|
|
|
install_gemfile <<-G, :local => true
|
|
|
|
source "#{file_uri_for(gem_repo1)}"
|
|
|
|
|
|
|
|
source "https://not-existing-source" do
|
|
|
|
gem "rack"
|
|
|
|
end
|
|
|
|
G
|
|
|
|
|
|
|
|
expect(last_command).to be_success
|
|
|
|
end
|
|
|
|
end
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|