Merge RubyGems-3.3.0 and Bundler-2.3.0
This commit is contained in:
parent
ad450c9fe5
commit
69dc2ea465
Notes:
git
2021-12-21 15:27:36 +09:00
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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 = {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
73
lib/bundler/self_manager.rb
Normal file
73
lib/bundler/self_manager.rb
Normal 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
|
@ -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
|
||||||
|
|
||||||
|
@ -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?
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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"
|
||||||
|
109
spec/bundler/runtime/self_management_spec.rb
Normal file
109
spec/bundler/runtime/self_management_spec.rb
Normal 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
|
@ -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?
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -60,4 +60,4 @@ DEPENDENCIES
|
|||||||
test-unit
|
test-unit
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.3.0.dev
|
2.3.0
|
||||||
|
@ -66,4 +66,4 @@ DEPENDENCIES
|
|||||||
test-unit
|
test-unit
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.3.0.dev
|
2.3.0
|
||||||
|
@ -41,4 +41,4 @@ DEPENDENCIES
|
|||||||
webrick (= 1.7.0)
|
webrick (= 1.7.0)
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.3.0.dev
|
2.3.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user