Skip to content

Commit

Permalink
[rubygems/rubygems] Introduce bundle config set version feature
Browse files Browse the repository at this point in the history
  • Loading branch information
hsbt committed Jul 13, 2023
1 parent 8f61a4c commit f16c880
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 5 deletions.
3 changes: 3 additions & 0 deletions lib/bundler/man/bundle-config.1
Expand Up @@ -299,6 +299,9 @@ The following is a list of all configuration keys and their purpose\. You can le
\fBuser_agent\fR (\fBBUNDLE_USER_AGENT\fR): The custom user agent fragment Bundler includes in API requests\.
.
.IP "\(bu" 4
\fBversion\fR (\fBBUNDLE_VERSION\fR): The version of Bundler to use when running under Bundler environment\. Defaults to \fBlocal\fR\. You can also specify \fBglobal\fR or \fBx\.y\.z\fR\. \fBlocal\fR will use the Bundler version specified in the \fBGemfile\.lock\fR, \fBglobal\fR will use the system version of Bundler, and \fBx\.y\.z\fR will use the specified version of Bundler\.
.
.IP "\(bu" 4
\fBwith\fR (\fBBUNDLE_WITH\fR): A \fB:\fR\-separated list of groups whose gems bundler should install\.
.
.IP "\(bu" 4
Expand Down
6 changes: 6 additions & 0 deletions lib/bundler/man/bundle-config.1.ronn
Expand Up @@ -277,6 +277,12 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html).
and disallow passing no options to `bundle update`.
* `user_agent` (`BUNDLE_USER_AGENT`):
The custom user agent fragment Bundler includes in API requests.
* `version` (`BUNDLE_VERSION`):
The version of Bundler to use when running under Bundler environment.
Defaults to `local`. You can also specify `global` or `x.y.z`.
`local` will use the Bundler version specified in the `Gemfile.lock`,
`global` will use the system version of Bundler, and `x.y.z` will use
the specified version of Bundler.
* `with` (`BUNDLE_WITH`):
A `:`-separated list of groups whose gems bundler should install.
* `without` (`BUNDLE_WITHOUT`):
Expand Down
23 changes: 18 additions & 5 deletions lib/bundler/self_manager.rb
Expand Up @@ -15,11 +15,23 @@ def restart_with_locked_bundler_if_needed
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."
begin
# BUNDLE_VERSION=x.y.z
restart_version = Gem::Version.new(Bundler.settings[:version])

Bundler.ui.info \
"Bundler #{current_version} is running, but your configuration was #{restart_version}. " \
"Installing Bundler #{restart_version} and restarting using that version."
rescue ArgumentError
# BUNDLE_VERSION=local
restart_version = lockfile_version

Bundler.ui.info \
"Bundler #{current_version} is running, but your lockfile was generated with #{restart_version}. " \
"Installing Bundler #{restart_version} and restarting using that version."
end

install_and_restart_with(lockfile_version)
install_and_restart_with(restart_version)
end

def update_bundler_and_restart_with_it_if_needed(target)
Expand Down Expand Up @@ -79,7 +91,8 @@ def needs_switching?
autoswitching_applies? &&
released?(lockfile_version) &&
!running?(lockfile_version) &&
!updating?
!updating? &&
Bundler.settings[:version] != "global"
end

def autoswitching_applies?
Expand Down
2 changes: 2 additions & 0 deletions lib/bundler/settings.rb
Expand Up @@ -75,6 +75,7 @@ class Settings
shebang
system_bindir
trust-policy
version
].freeze

DEFAULT_CONFIG = {
Expand All @@ -84,6 +85,7 @@ class Settings
"BUNDLE_REDIRECT" => 5,
"BUNDLE_RETRY" => 3,
"BUNDLE_TIMEOUT" => 10,
"BUNDLE_VERSION" => "local",
}.freeze

def initialize(root = nil)
Expand Down
19 changes: 19 additions & 0 deletions spec/bundler/runtime/self_management_spec.rb
Expand Up @@ -103,6 +103,25 @@
expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION)
end

it "installs BUNDLE_VERSION version when using bundle config version x.y.z" do
lockfile_bundled_with(Bundler::VERSION.gsub(/\.dev/, ""))

bundle "config set --local version #{previous_minor}"
bundle "install", :artifice => "vcr"
expect(out).to include("Bundler #{Bundler::VERSION} is running, but your configuration was #{previous_minor}. Installing Bundler #{previous_minor} and restarting using that version.")
end

it "does not try to install when using bundle config version global" do
lockfile_bundled_with(previous_minor)

bundle "config set version global"
bundle "install", :artifice => "vcr"
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

private

def lockfile_bundled_with(version)
Expand Down

0 comments on commit f16c880

Please sign in to comment.