mirror of
https://github.com/ruby/ruby.git
synced 2026-01-28 04:54:23 +00:00
- Ref #8917 - ### Problem Prior to Bundler 2.5.6, running `bundle lock --update foo --lockfile Gemfile_bumped.lock` would update only the foo gem and write the lockfile to the `Gemfile_bumped.lock`. In Bundler 2.5.6 and above running the same command, updates absolutely all gems. This change is related to #7047 ### Solution We decided to expose the `write_lock` method rather than going through a complex deprecation cycle of the `lock` method. This commit applies the same business logic as prios to 2.5.6 where, we build the definition using the existing lockfile, make changes to the definition and dump it into the desired lockfile. https://github.com/rubygems/rubygems/commit/c88f00c41d
95 lines
2.8 KiB
Ruby
95 lines
2.8 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
|
|
|
|
check_for_conflicting_options
|
|
|
|
print = options[:print]
|
|
previous_output_stream = Bundler.ui.output_stream
|
|
Bundler.ui.output_stream = :stderr 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.default_lockfile)
|
|
definition.add_checksums if options["add-checksums"]
|
|
|
|
Bundler::CLI::Common.configure_gem_version_promoter(definition, options) if options[:update]
|
|
|
|
options["remove-platform"].each do |platform_string|
|
|
platform = Gem::Platform.new(platform_string)
|
|
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.error "The platform `#{platform_string}` is unknown to RubyGems and can't be added to the lockfile."
|
|
exit 1
|
|
end
|
|
definition.add_platform(platform)
|
|
end
|
|
|
|
if definition.platforms.empty?
|
|
raise InvalidOption, "Removing all platforms from the bundle is not allowed"
|
|
end
|
|
|
|
definition.remotely! unless options[:local]
|
|
|
|
if options["normalize-platforms"]
|
|
definition.normalize_platforms
|
|
end
|
|
|
|
if print
|
|
puts definition.to_lock
|
|
else
|
|
file = options[:lockfile]
|
|
file = file ? Pathname.new(file).expand_path : Bundler.default_lockfile
|
|
|
|
puts "Writing lockfile to #{file}"
|
|
definition.write_lock(file, false)
|
|
end
|
|
end
|
|
|
|
Bundler.ui.output_stream = previous_output_stream
|
|
end
|
|
|
|
private
|
|
|
|
def check_for_conflicting_options
|
|
if options["normalize-platforms"] && options["add-platform"].any?
|
|
raise InvalidOption, "--normalize-platforms can't be used with --add-platform"
|
|
end
|
|
|
|
if options["normalize-platforms"] && options["remove-platform"].any?
|
|
raise InvalidOption, "--normalize-platforms can't be used with --remove-platform"
|
|
end
|
|
end
|
|
end
|
|
end
|