mirror of
https://github.com/ruby/ruby.git
synced 2025-08-24 05:25:34 +02:00

The `lock` command is specifically designed to manage the lockfile, so
running it should take precedence over any "frozen" setting.
Besides that, "frozen" is not specifically designed as "lockfile cannot
be updated" but as "installation of gems should be prevented if gemfile
is not in sync with the lockfile".
The lock command does not install any gems and preserves the property of
the lockfile being in sycn with its gemfile, so I think frozen should
not influence it.
The current behavior is quite confusing when frozen is set. On an app
where rubocop can get lockfile updates
```
$ bundle lock --update rubocop
Writing lockfile to /path/to/Gemfile.lock
```
Completely silent, it makes you think that it has written the lockfile,
but still no updates.
In verbose mode, it gives a bit more information, but still confusing
and unexpected, and does not change the lockfile:
```
$ bundle lock --update rubocop --verbose
Running `bundle lock --update "rubocop" --verbose` with bundler 2.4.20
Frozen, using resolution from the lockfile
Writing lockfile to /path/to/Gemfile.lock
```
With this commit, it updates the lockfile as expected.
1d501ae8ea
73 lines
2.1 KiB
Ruby
73 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Bundler
|
|
class CLI::Lock
|
|
attr_reader :options
|
|
|
|
def initialize(options)
|
|
@options = options
|
|
end
|
|
|
|
def run
|
|
unless Bundler.default_gemfile
|
|
Bundler.ui.error "Unable to find a Gemfile to lock"
|
|
exit 1
|
|
end
|
|
|
|
print = options[:print]
|
|
previous_ui_level = Bundler.ui.level
|
|
Bundler.ui.level = "silent" if print
|
|
|
|
Bundler::Fetcher.disable_endpoint = options["full-index"]
|
|
|
|
update = options[:update]
|
|
conservative = options[:conservative]
|
|
bundler = options[:bundler]
|
|
|
|
if update.is_a?(Array) # unlocking specific gems
|
|
Bundler::CLI::Common.ensure_all_gems_in_lockfile!(update)
|
|
update = { :gems => update, :conservative => conservative }
|
|
elsif update && conservative
|
|
update = { :conservative => conservative }
|
|
elsif update && bundler
|
|
update = { :bundler => bundler }
|
|
end
|
|
|
|
Bundler.settings.temporary(:frozen => false) do
|
|
definition = Bundler.definition(update)
|
|
|
|
Bundler::CLI::Common.configure_gem_version_promoter(definition, options) if options[:update]
|
|
|
|
options["remove-platform"].each do |platform|
|
|
definition.remove_platform(platform)
|
|
end
|
|
|
|
options["add-platform"].each do |platform_string|
|
|
platform = Gem::Platform.new(platform_string)
|
|
if platform.to_s == "unknown"
|
|
Bundler.ui.warn "The platform `#{platform_string}` is unknown to RubyGems " \
|
|
"and adding it will likely lead to resolution errors"
|
|
end
|
|
definition.add_platform(platform)
|
|
end
|
|
|
|
if definition.platforms.empty?
|
|
raise InvalidOption, "Removing all platforms from the bundle is not allowed"
|
|
end
|
|
|
|
definition.resolve_remotely! unless options[:local]
|
|
|
|
if print
|
|
puts definition.to_lock
|
|
else
|
|
file = options[:lockfile]
|
|
file = file ? File.expand_path(file) : Bundler.default_lockfile
|
|
puts "Writing lockfile to #{file}"
|
|
definition.lock(file)
|
|
end
|
|
end
|
|
|
|
Bundler.ui.level = previous_ui_level
|
|
end
|
|
end
|
|
end
|