Merge RubyGems-3.3.0 and Bundler-2.3.0

This commit is contained in:
Hiroshi SHIBATA 2021-12-21 14:50:44 +09:00
parent ad450c9fe5
commit 69dc2ea465
Notes: git 2021-12-21 15:27:36 +09:00
26 changed files with 313 additions and 209 deletions

View File

@ -66,6 +66,7 @@ module Bundler
autoload :RubyDsl, File.expand_path("bundler/ruby_dsl", __dir__) autoload :RubyDsl, File.expand_path("bundler/ruby_dsl", __dir__)
autoload :RubyVersion, File.expand_path("bundler/ruby_version", __dir__) autoload :RubyVersion, File.expand_path("bundler/ruby_version", __dir__)
autoload :Runtime, File.expand_path("bundler/runtime", __dir__) autoload :Runtime, File.expand_path("bundler/runtime", __dir__)
autoload :SelfManager, File.expand_path("bundler/self_manager", __dir__)
autoload :Settings, File.expand_path("bundler/settings", __dir__) autoload :Settings, File.expand_path("bundler/settings", __dir__)
autoload :SharedHelpers, File.expand_path("bundler/shared_helpers", __dir__) autoload :SharedHelpers, File.expand_path("bundler/shared_helpers", __dir__)
autoload :Source, File.expand_path("bundler/source", __dir__) autoload :Source, File.expand_path("bundler/source", __dir__)
@ -643,6 +644,13 @@ EOF
Bundler.rubygems.clear_paths Bundler.rubygems.clear_paths
end end
def self_manager
@self_manager ||= begin
require_relative "bundler/self_manager"
Bundler::SelfManager.new
end
end
private private
def eval_yaml_gemspec(path, contents) def eval_yaml_gemspec(path, contents)

View File

@ -61,6 +61,8 @@ module Bundler
Bundler.reset_settings_and_root! Bundler.reset_settings_and_root!
end end
Bundler.self_manager.restart_with_locked_bundler_if_needed
Bundler.settings.set_command_option_if_given :retry, options[:retry] Bundler.settings.set_command_option_if_given :retry, options[:retry]
current_cmd = args.last[:current_command].name current_cmd = args.last[:current_command].name

View File

@ -12,6 +12,8 @@ module Bundler
warn_if_root warn_if_root
Bundler.self_manager.install_locked_bundler_and_restart_with_it_if_needed
Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD
# Disable color in deployment mode # Disable color in deployment mode

View File

@ -294,7 +294,7 @@ module Bundler
if updating_major = locked_major < current_major if updating_major = locked_major < current_major
Bundler.ui.warn "Warning: the lockfile is being updated to Bundler #{current_major}, " \ Bundler.ui.warn "Warning: the lockfile is being updated to Bundler #{current_major}, " \
"after which you will be unable to return to Bundler #{@locked_bundler_version.segments.first}." "after which you will be unable to return to Bundler #{locked_major}."
end end
end end

View File

@ -122,7 +122,6 @@ module Bundler
# return the specs in the bundler format as an index # return the specs in the bundler format as an index
def specs(gem_names, source) def specs(gem_names, source)
old = Bundler.rubygems.sources
index = Bundler::Index.new index = Bundler::Index.new
if Bundler::Fetcher.disable_endpoint if Bundler::Fetcher.disable_endpoint
@ -153,8 +152,6 @@ module Bundler
rescue CertificateFailureError rescue CertificateFailureError
Bundler.ui.info "" if gem_names && use_api # newline after dots Bundler.ui.info "" if gem_names && use_api # newline after dots
raise raise
ensure
Bundler.rubygems.sources = old
end end
def use_api def use_api

View File

@ -239,7 +239,7 @@ module Bundler
def ensure_specs_are_compatible! def ensure_specs_are_compatible!
system_ruby = Bundler::RubyVersion.system system_ruby = Bundler::RubyVersion.system
rubygems_version = Gem::Version.create(Gem::VERSION) rubygems_version = Bundler.rubygems.version
@definition.specs.each do |spec| @definition.specs.each do |spec|
if required_ruby_version = spec.required_ruby_version if required_ruby_version = spec.required_ruby_version
unless required_ruby_version.satisfied_by?(system_ruby.gem_version) unless required_ruby_version.satisfied_by?(system_ruby.gem_version)

View File

@ -46,6 +46,16 @@ module Bundler
attributes attributes
end end
def self.bundled_with
lockfile = Bundler.default_lockfile
return unless lockfile.file?
lockfile_contents = Bundler.read_file(lockfile)
return unless lockfile_contents.include?(BUNDLED)
lockfile_contents.split(BUNDLED).last.strip
end
def initialize(lockfile) def initialize(lockfile)
@platforms = [] @platforms = []
@sources = [] @sources = []
@ -77,25 +87,12 @@ module Bundler
end end
end end
@specs = @specs.values.sort_by(&:identifier) @specs = @specs.values.sort_by(&:identifier)
warn_for_outdated_bundler_version
rescue ArgumentError => e rescue ArgumentError => e
Bundler.ui.debug(e) Bundler.ui.debug(e)
raise LockfileError, "Your lockfile is unreadable. Run `rm #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` " \ raise LockfileError, "Your lockfile is unreadable. Run `rm #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` " \
"and then `bundle install` to generate a new lockfile." "and then `bundle install` to generate a new lockfile."
end end
def warn_for_outdated_bundler_version
return unless bundler_version
return if bundler_version.segments.last == "dev"
prerelease_text = bundler_version.prerelease? ? " --pre" : ""
current_version = Gem::Version.create(Bundler::VERSION)
return unless current_version < bundler_version
Bundler.ui.warn "Warning: the running version of Bundler (#{current_version}) is older " \
"than the version that created the lockfile (#{bundler_version}). We suggest you to " \
"upgrade to the version that created the lockfile by running `gem install " \
"bundler:#{bundler_version}#{prerelease_text}`.\n"
end
private private
TYPES = { TYPES = {

View File

@ -21,7 +21,7 @@ module Bundler
elsif options[:local_git] elsif options[:local_git]
install_local_git(names, version, options) install_local_git(names, version, options)
else else
sources = options[:source] || Bundler.rubygems.sources sources = options[:source] || Gem.sources
install_rubygems(names, version, sources) install_rubygems(names, version, sources)
end end
end end

View File

@ -12,25 +12,21 @@ module Bundler
EXT_LOCK = Monitor.new EXT_LOCK = Monitor.new
end end
def self.version
@version ||= Gem::Version.new(Gem::VERSION)
end
def self.provides?(req_str)
Gem::Requirement.new(req_str).satisfied_by?(version)
end
def initialize def initialize
@replaced_methods = {} @replaced_methods = {}
backport_ext_builder_monitor backport_ext_builder_monitor
end end
def version def version
self.class.version @version ||= Gem.rubygems_version
end end
def provides?(req_str) def provides?(req_str)
self.class.provides?(req_str) Gem::Requirement.new(req_str).satisfied_by?(version)
end
def supports_bundler_trampolining?
provides?(">= 3.3.0.a")
end end
def build_args def build_args
@ -142,19 +138,6 @@ module Bundler
end end
end end
def sources=(val)
# Gem.configuration creates a new Gem::ConfigFile, which by default will read ~/.gemrc
# If that file exists, its settings (including sources) will overwrite the values we
# are about to set here. In order to avoid that, we force memoizing the config file now.
configuration
Gem.sources = val
end
def sources
Gem.sources
end
def gem_dir def gem_dir
Gem.dir Gem.dir
end end
@ -588,6 +571,10 @@ module Bundler
end end
end end
def find_bundler(version)
find_name("bundler").find {|s| s.version.to_s == version }
end
def find_name(name) def find_name(name)
Gem::Specification.stubs_for(name).map(&:to_spec) Gem::Specification.stubs_for(name).map(&:to_spec)
end end

View File

@ -0,0 +1,73 @@
# frozen_string_literal: true
module Bundler
#
# This class handles installing and switching to the version of bundler needed
# by an application.
#
class SelfManager
def restart_with_locked_bundler_if_needed
return unless needs_switching? && installed?
restart_with_locked_bundler
end
def install_locked_bundler_and_restart_with_it_if_needed
return unless needs_switching?
Bundler.ui.info \
"Bundler #{current_version} is running, but your lockfile was generated with #{lockfile_version}. " \
"Installing Bundler #{lockfile_version} and restarting using that version."
install_and_restart_with_locked_bundler
end
private
def install_and_restart_with_locked_bundler
bundler_dep = Gem::Dependency.new("bundler", lockfile_version)
Gem.install(bundler_dep)
rescue StandardError => e
Bundler.ui.trace e
Bundler.ui.warn "There was an error installing the locked bundler version (#{lockfile_version}), rerun with the `--verbose` flag for more details. Going on using bundler #{current_version}."
else
restart_with_locked_bundler
end
def restart_with_locked_bundler
configured_gem_home = ENV["GEM_HOME"]
configured_gem_path = ENV["GEM_PATH"]
Bundler.with_original_env do
Kernel.exec(
{ "GEM_HOME" => configured_gem_home, "GEM_PATH" => configured_gem_path, "BUNDLER_VERSION" => lockfile_version },
$PROGRAM_NAME, *ARGV
)
end
end
def needs_switching?
ENV["BUNDLER_VERSION"].nil? &&
Bundler.rubygems.supports_bundler_trampolining? &&
SharedHelpers.in_bundle? &&
lockfile_version &&
!lockfile_version.end_with?(".dev") &&
lockfile_version != current_version
end
def installed?
Bundler.configure
Bundler.rubygems.find_bundler(lockfile_version)
end
def current_version
@current_version ||= Bundler::VERSION
end
def lockfile_version
@lockfile_version ||= Bundler::LockfileParser.bundled_with
end
end
end

View File

@ -25,7 +25,7 @@ module Bundler
s.loaded_from = File.expand_path("..", __FILE__) s.loaded_from = File.expand_path("..", __FILE__)
end end
if local_spec = Bundler.rubygems.find_name("bundler").find {|s| s.version.to_s == VERSION } if local_spec = Bundler.rubygems.find_bundler(VERSION)
idx << local_spec idx << local_spec
end end

View File

@ -73,7 +73,7 @@ m = Module.new do
requirement = bundler_gem_version.approximate_recommendation requirement = bundler_gem_version.approximate_recommendation
return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0")
requirement += ".a" if bundler_gem_version.prerelease? requirement += ".a" if bundler_gem_version.prerelease?

View File

@ -1,7 +1,7 @@
# frozen_string_literal: false # frozen_string_literal: false
module Bundler module Bundler
VERSION = "2.3.0.dev".freeze VERSION = "2.3.0".freeze
def self.bundler_major_version def self.bundler_major_version
@bundler_major_version ||= VERSION.split(".").first.to_i @bundler_major_version ||= VERSION.split(".").first.to_i

View File

@ -8,7 +8,7 @@
require 'rbconfig' require 'rbconfig'
module Gem module Gem
VERSION = "3.3.0.dev".freeze VERSION = "3.3.0".freeze
end end
# Must be first since it unloads the prelude from 1.9.2 # Must be first since it unloads the prelude from 1.9.2

View File

@ -7,7 +7,7 @@ RSpec.describe Bundler::Plugin::Installer do
it "uses Gem.sources when non of the source is provided" do it "uses Gem.sources when non of the source is provided" do
sources = double(:sources) sources = double(:sources)
Bundler.settings # initialize it before we have to touch rubygems.ext_lock Bundler.settings # initialize it before we have to touch rubygems.ext_lock
allow(Bundler).to receive_message_chain("rubygems.sources") { sources } allow(Gem).to receive(:sources) { sources }
allow(installer).to receive(:install_rubygems). allow(installer).to receive(:install_rubygems).
with("new-plugin", [">= 0"], sources).once with("new-plugin", [">= 0"], sources).once

View File

@ -186,11 +186,25 @@ RSpec.describe "bundle binstubs <gem>" do
before do before do
lockfile lockfile.gsub(/BUNDLED WITH\n .*$/m, "BUNDLED WITH\n 55.0") lockfile lockfile.gsub(/BUNDLED WITH\n .*$/m, "BUNDLED WITH\n 55.0")
update_repo2 do
with_built_bundler("55.0") {|gem_path| FileUtils.mv(gem_path, gem_repo2("gems")) }
end
end end
it "runs the available version of bundler when the version is older and the same major" do it "installs and runs the exact version of bundler", :rubygems => ">= 3.3.0.dev" do
sys_exec "bin/bundle install" sys_exec "bin/bundle install --verbose", :env => { "BUNDLER_SPEC_GEM_SOURCES" => file_uri_for(gem_repo2).to_s, "RUBYOPT" => "-r#{spec_dir}/support/hax.rb" }
expect(exitstatus).not_to eq(42) expect(exitstatus).not_to eq(42)
expect(out).to include("Bundler 55.1 is running, but your lockfile was generated with 55.0. Installing Bundler 55.0 and restarting using that version.")
expect(out).to include("Using bundler 55.0")
expect(err).not_to include("Activating bundler (~> 55.0) failed:")
end
it "runs the available version of bundler", :rubygems => "< 3.3.0.dev" do
sys_exec "bin/bundle install --verbose"
expect(exitstatus).not_to eq(42)
expect(out).not_to include("Bundler 55.1 is running, but your lockfile was generated with 55.0. Installing Bundler 55.0 and restarting using that version.")
expect(out).to include("Using bundler 55.1")
expect(err).not_to include("Activating bundler (~> 55.0) failed:") expect(err).not_to include("Activating bundler (~> 55.0) failed:")
end end
end end

View File

@ -471,10 +471,10 @@ RSpec.describe "bundle check" do
end end
context "is newer" do context "is newer" do
it "does not change the lock but warns" do it "does not change the lock and does not warn" do
lockfile lock_with(Bundler::VERSION.succ) lockfile lock_with(Bundler::VERSION.succ)
bundle :check bundle :check
expect(err).to include("the running version of Bundler (#{Bundler::VERSION}) is older than the version that created the lockfile (#{Bundler::VERSION.succ})") expect(err).to be_empty
expect(lockfile).to eq lock_with(Bundler::VERSION.succ) expect(lockfile).to eq lock_with(Bundler::VERSION.succ)
end end
end end

View File

@ -39,7 +39,7 @@ RSpec.describe "the lockfile format" do
G G
end end
it "updates the lockfile's bundler version if current ver. is newer" do it "updates the lockfile's bundler version if current ver. is newer, and version was forced through BUNDLER_VERSION" do
system_gems "bundler-1.8.2" system_gems "bundler-1.8.2"
lockfile <<-L lockfile <<-L
@ -64,12 +64,15 @@ RSpec.describe "the lockfile format" do
1.8.2 1.8.2
L L
install_gemfile <<-G, :env => { "BUNDLER_VERSION" => Bundler::VERSION } install_gemfile <<-G, :verbose => true, :env => { "BUNDLER_VERSION" => Bundler::VERSION }
source "#{file_uri_for(gem_repo2)}" source "#{file_uri_for(gem_repo2)}"
gem "rack" gem "rack"
G G
expect(out).not_to include("Bundler #{Bundler::VERSION} is running, but your lockfile was generated with 1.8.2.")
expect(out).to include("Using bundler #{Bundler::VERSION}")
expect(lockfile).to eq <<~G expect(lockfile).to eq <<~G
GEM GEM
remote: #{file_uri_for(gem_repo2)}/ remote: #{file_uri_for(gem_repo2)}/
@ -87,9 +90,13 @@ RSpec.describe "the lockfile format" do
G G
end end
it "does not update the lockfile's bundler version if nothing changed during bundle install" do it "does not update the lockfile's bundler version if nothing changed during bundle install, but uses the locked version", :rubygems => ">= 3.3.0.a" do
version = "#{Bundler::VERSION.split(".").first}.0.0.a" version = "#{Bundler::VERSION.split(".").first}.0.0.a"
update_repo2 do
with_built_bundler(version) {|gem_path| FileUtils.mv(gem_path, gem_repo2("gems")) }
end
lockfile <<-L lockfile <<-L
GEM GEM
remote: #{file_uri_for(gem_repo2)}/ remote: #{file_uri_for(gem_repo2)}/
@ -106,12 +113,15 @@ RSpec.describe "the lockfile format" do
#{version} #{version}
L L
install_gemfile <<-G install_gemfile <<-G, :verbose => true, :env => { "BUNDLER_SPEC_GEM_SOURCES" => file_uri_for(gem_repo2).to_s }
source "#{file_uri_for(gem_repo2)}" source "#{file_uri_for(gem_repo2)}"
gem "rack" gem "rack"
G G
expect(out).to include("Bundler #{Bundler::VERSION} is running, but your lockfile was generated with #{version}.")
expect(out).to include("Using bundler #{version}")
expect(lockfile).to eq <<~G expect(lockfile).to eq <<~G
GEM GEM
remote: #{file_uri_for(gem_repo2)}/ remote: #{file_uri_for(gem_repo2)}/
@ -129,7 +139,56 @@ RSpec.describe "the lockfile format" do
G G
end end
it "updates the lockfile's bundler version if not present" do it "does not update the lockfile's bundler version if nothing changed during bundle install, and uses the latest version", :rubygems => "< 3.3.0.a" do
version = "#{Bundler::VERSION.split(".").first}.0.0.a"
update_repo2 do
with_built_bundler(version) {|gem_path| FileUtils.mv(gem_path, gem_repo2("gems")) }
end
lockfile <<-L
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{version}
L
install_gemfile <<-G, :verbose => true, :env => { "BUNDLER_SPEC_GEM_SOURCES" => file_uri_for(gem_repo2).to_s }
source "#{file_uri_for(gem_repo2)}"
gem "rack"
G
expect(out).not_to include("Bundler #{Bundler::VERSION} is running, but your lockfile was generated with #{version}.")
expect(out).to include("Using bundler #{Bundler::VERSION}")
expect(lockfile).to eq <<~G
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{version}
G
end
it "adds the BUNDLED WITH section if not present" do
lockfile <<-L lockfile <<-L
GEM GEM
remote: #{file_uri_for(gem_repo2)}/ remote: #{file_uri_for(gem_repo2)}/
@ -166,152 +225,6 @@ RSpec.describe "the lockfile format" do
G G
end end
it "warns if the current version is older than lockfile's bundler version, and locked version is a final release" do
current_version = "999.998.999"
system_gems "bundler-#{current_version}"
newer_minor = "999.999.0"
lockfile <<-L
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{newer_minor}
L
install_gemfile <<-G, :env => { "BUNDLER_VERSION" => current_version }
source "#{file_uri_for(gem_repo2)}"
gem "rack"
G
warning_message = "the running version of Bundler (#{current_version}) is older " \
"than the version that created the lockfile (#{newer_minor}). " \
"We suggest you to upgrade to the version that created the " \
"lockfile by running `gem install bundler:#{newer_minor}`."
expect(err).to include warning_message
expect(lockfile).to eq <<~G
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{newer_minor}
G
end
it "warns if the current version is older than lockfile's bundler version, and locked version is a prerelease" do
current_version = "999.998.999"
system_gems "bundler-#{current_version}"
newer_minor = "999.999.0.pre1"
lockfile <<-L
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{newer_minor}
L
install_gemfile <<-G, :env => { "BUNDLER_VERSION" => current_version }
source "#{file_uri_for(gem_repo2)}"
gem "rack"
G
warning_message = "the running version of Bundler (#{current_version}) is older " \
"than the version that created the lockfile (#{newer_minor}). " \
"We suggest you to upgrade to the version that created the " \
"lockfile by running `gem install bundler:#{newer_minor} --pre`."
expect(err).to include warning_message
expect(lockfile).to eq <<~G
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{newer_minor}
G
end
it "doesn't warn if the current version is older than lockfile's bundler version, and locked version is a dev version" do
current_version = "999.998.999"
system_gems "bundler-#{current_version}"
newer_minor = "999.999.0.dev"
lockfile <<-L
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{newer_minor}
L
install_gemfile <<-G, :env => { "BUNDLER_VERSION" => current_version }
source "#{file_uri_for(gem_repo2)}"
gem "rack"
G
expect(err).to be_empty
expect(lockfile).to eq <<~G
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{newer_minor}
G
end
it "warns when updating bundler major version" do it "warns when updating bundler major version" do
current_version = Bundler::VERSION current_version = Bundler::VERSION
older_major = previous_major(current_version) older_major = previous_major(current_version)

View File

@ -168,7 +168,7 @@ RSpec.describe "Bundler.setup with multi platform stuff" do
nokogiri nokogiri
BUNDLED WITH BUNDLED WITH
2.1.4 #{Bundler::VERSION}
G G
bundle "install" bundle "install"

View File

@ -0,0 +1,109 @@
# frozen_string_literal: true
RSpec.describe "Self management", :rubygems => ">= 3.3.0.dev" do
describe "auto switching" do
let(:next_minor) do
Bundler::VERSION.split(".").map.with_index {|s, i| i == 1 ? s.to_i + 1 : s }[0..2].join(".")
end
before do
build_repo2 do
with_built_bundler(next_minor) {|gem_path| FileUtils.mv(gem_path, gem_repo2("gems")) }
end
gemfile <<-G
source "#{file_uri_for(gem_repo2)}"
gem "rack"
G
end
it "installs locked version when using system path and uses it" do
lockfile_bundled_with(next_minor)
bundle "config set --local path.system true"
bundle "install", :env => { "BUNDLER_SPEC_GEM_SOURCES" => file_uri_for(gem_repo2).to_s }
expect(out).to include("Bundler #{Bundler::VERSION} is running, but your lockfile was generated with #{next_minor}. Installing Bundler #{next_minor} and restarting using that version.")
# It uninstalls the older system bundler
bundle "clean --force"
expect(out).to eq("Removing bundler (#{Bundler::VERSION})")
# App now uses locked version
bundle "-v"
expect(out).to end_with(next_minor[0] == "2" ? "Bundler version #{next_minor}" : next_minor)
# Subsequent installs use the locked version without reinstalling
bundle "install --verbose"
expect(out).to include("Using bundler #{next_minor}")
expect(out).not_to include("Bundler #{Bundler::VERSION} is running, but your lockfile was generated with #{next_minor}. Installing Bundler #{next_minor} and restarting using that version.")
end
it "installs locked version when using local path and uses it" do
lockfile_bundled_with(next_minor)
bundle "config set --local path vendor/bundle"
bundle "install", :env => { "BUNDLER_SPEC_GEM_SOURCES" => file_uri_for(gem_repo2).to_s }
expect(out).to include("Bundler #{Bundler::VERSION} is running, but your lockfile was generated with #{next_minor}. Installing Bundler #{next_minor} and restarting using that version.")
# It does not uninstall the locked bundler
bundle "clean"
expect(out).to be_empty
# App now uses locked version
bundle "-v"
expect(out).to end_with(next_minor[0] == "2" ? "Bundler version #{next_minor}" : next_minor)
# Subsequent installs use the locked version without reinstalling
bundle "install --verbose"
expect(out).to include("Using bundler #{next_minor}")
expect(out).not_to include("Bundler #{Bundler::VERSION} is running, but your lockfile was generated with #{next_minor}. Installing Bundler #{next_minor} and restarting using that version.")
end
it "does not try to install a development version" do
lockfile_bundled_with("#{next_minor}.dev")
bundle "install --verbose"
expect(out).not_to match(/restarting using that version/)
bundle "-v"
expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION)
end
it "shows a discreet message if locked bundler does not exist, and something more complete in `--verbose` mode" do
missing_minor ="#{Bundler::VERSION[0]}.999.999"
lockfile_bundled_with(missing_minor)
bundle "install"
expect(err).to eq("There was an error installing the locked bundler version (#{missing_minor}), rerun with the `--verbose` flag for more details. Going on using bundler #{Bundler::VERSION}.")
bundle "install --verbose"
expect(err).to include("There was an error installing the locked bundler version (#{missing_minor}), rerun with the `--verbose` flag for more details. Going on using bundler #{Bundler::VERSION}.")
expect(err).to include("Gem::UnsatisfiableDependencyError")
bundle "-v"
expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION)
end
private
def lockfile_bundled_with(version)
lockfile <<~L
GEM
remote: #{file_uri_for(gem_repo2)}/
specs:
rack (1.0.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
rack
BUNDLED WITH
#{version}
L
end
end
end

View File

@ -28,6 +28,7 @@ RSpec.configure do |config|
config.filter_run_excluding :git => RequirementChecker.against(git_version) config.filter_run_excluding :git => RequirementChecker.against(git_version)
config.filter_run_excluding :bundler => RequirementChecker.against(Bundler::VERSION.split(".")[0]) config.filter_run_excluding :bundler => RequirementChecker.against(Bundler::VERSION.split(".")[0])
config.filter_run_excluding :rubygems => RequirementChecker.against(Gem::VERSION)
config.filter_run_excluding :ruby_repo => !ENV["GEM_COMMAND"].nil? config.filter_run_excluding :ruby_repo => !ENV["GEM_COMMAND"].nil?
config.filter_run_excluding :no_color_tty => Gem.win_platform? || !ENV["GITHUB_ACTION"].nil? config.filter_run_excluding :no_color_tty => Gem.win_platform? || !ENV["GITHUB_ACTION"].nil?
config.filter_run_excluding :permissions => Gem.win_platform? config.filter_run_excluding :permissions => Gem.win_platform?

View File

@ -32,7 +32,7 @@ module Gem
end end
if ENV["BUNDLER_SPEC_GEM_SOURCES"] if ENV["BUNDLER_SPEC_GEM_SOURCES"]
@sources = [ENV["BUNDLER_SPEC_GEM_SOURCES"]] self.sources = [ENV["BUNDLER_SPEC_GEM_SOURCES"]]
end end
# We only need this hack for rubygems versions without the BundlerVersionFinder # We only need this hack for rubygems versions without the BundlerVersionFinder

View File

@ -166,7 +166,7 @@ module Spec
def gem_command(command, options = {}) def gem_command(command, options = {})
env = options[:env] || {} env = options[:env] || {}
env["RUBYOPT"] = opt_add("-r#{spec_dir}/support/hax.rb", env["RUBYOPT"] || ENV["RUBYOPT"]) env["RUBYOPT"] = opt_add(opt_add("-r#{spec_dir}/support/hax.rb", env["RUBYOPT"]), ENV["RUBYOPT"])
options[:env] = env options[:env] = env
sys_exec("#{Path.gem_bin} #{command}", options) sys_exec("#{Path.gem_bin} #{command}", options)
end end
@ -181,7 +181,7 @@ module Spec
def sys_exec(cmd, options = {}) def sys_exec(cmd, options = {})
env = options[:env] || {} env = options[:env] || {}
env["RUBYOPT"] = opt_add("-r#{spec_dir}/support/switch_rubygems.rb", env["RUBYOPT"] || ENV["RUBYOPT"]) env["RUBYOPT"] = opt_add(opt_add("-r#{spec_dir}/support/switch_rubygems.rb", env["RUBYOPT"]), ENV["RUBYOPT"])
dir = options[:dir] || bundled_app dir = options[:dir] || bundled_app
command_execution = CommandExecution.new(cmd.to_s, dir) command_execution = CommandExecution.new(cmd.to_s, dir)
@ -348,6 +348,7 @@ module Spec
without_env_side_effects do without_env_side_effects do
ENV["GEM_HOME"] = path.to_s ENV["GEM_HOME"] = path.to_s
ENV["GEM_PATH"] = path.to_s ENV["GEM_PATH"] = path.to_s
ENV["BUNDLER_ORIG_GEM_HOME"] = nil
ENV["BUNDLER_ORIG_GEM_PATH"] = nil ENV["BUNDLER_ORIG_GEM_PATH"] = nil
yield yield
end end

View File

@ -60,4 +60,4 @@ DEPENDENCIES
test-unit test-unit
BUNDLED WITH BUNDLED WITH
2.3.0.dev 2.3.0

View File

@ -66,4 +66,4 @@ DEPENDENCIES
test-unit test-unit
BUNDLED WITH BUNDLED WITH
2.3.0.dev 2.3.0

View File

@ -41,4 +41,4 @@ DEPENDENCIES
webrick (= 1.7.0) webrick (= 1.7.0)
BUNDLED WITH BUNDLED WITH
2.3.0.dev 2.3.0