Skip to content
This repository was archived by the owner on Apr 14, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions lib/bundler/definition.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ class Definition

attr_reader(
:dependencies,
:gem_version_promoter,
:locked_deps,
:locked_gems,
:platforms,
Expand Down Expand Up @@ -125,25 +124,25 @@ def initialize(lockfile, dependencies, sources, unlock, ruby_version = nil, opti
@unlock[:gems] = @locked_specs.for(eager_unlock).map(&:name)
end

@gem_version_promoter = create_gem_version_promoter

@dependency_changes = converge_dependencies
@local_changes = converge_locals

@requires = compute_requires
end

def create_gem_version_promoter
locked_specs =
if unlocking? && @locked_specs.empty? && !@lockfile_contents.empty?
# Definition uses an empty set of locked_specs to indicate all gems
# are unlocked, but GemVersionPromoter needs the locked_specs
# for conservative comparison.
Bundler::SpecSet.new(@locked_gems.specs)
else
@locked_specs
end
GemVersionPromoter.new(locked_specs, @unlock[:gems])
def gem_version_promoter
@gem_version_promoter ||= begin
locked_specs =
if unlocking? && @locked_specs.empty? && !@lockfile_contents.empty?
# Definition uses an empty set of locked_specs to indicate all gems
# are unlocked, but GemVersionPromoter needs the locked_specs
# for conservative comparison.
Bundler::SpecSet.new(@locked_gems.specs)
else
@locked_specs
end
GemVersionPromoter.new(locked_specs, @unlock[:gems])
end
end

def resolve_with_cache!
Expand Down Expand Up @@ -218,6 +217,7 @@ def missing_specs?
@index = nil
@resolve = nil
@specs = nil
@gem_version_promoter = nil
end

def requested_specs
Expand Down
1 change: 1 addition & 0 deletions lib/bundler/feature_flag.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def self.settings_method(name, key, &default)
settings_flag(:suppress_install_using_messages) { bundler_2_mode? }
settings_flag(:unlock_source_unlocks_spec) { !bundler_2_mode? }
settings_flag(:update_requires_all_flag) { bundler_2_mode? }
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_2_mode? }

settings_option(:default_cli_command) { bundler_2_mode? ? :cli_help : :install }

Expand Down
6 changes: 4 additions & 2 deletions lib/bundler/gem_version_promoter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ module Bundler
# available dependency versions as found in its index, before returning it to
# to the resolution engine to select the best version.
class GemVersionPromoter
DEBUG = ENV["DEBUG_RESOLVER"]

attr_reader :level, :locked_specs, :unlock_gems

# By default, strict is false, meaning every available version of a gem
Expand Down Expand Up @@ -61,7 +63,7 @@ def level=(value)
# @return [SpecGroup] A new instance of the SpecGroup Array sorted and
# possibly filtered.
def sort_versions(dep, spec_groups)
before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if ENV["DEBUG_RESOLVER"]
before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG

@sort_versions[dep] ||= begin
gem_name = dep.name
Expand All @@ -75,7 +77,7 @@ def sort_versions(dep, spec_groups)
else
sort_dep_specs(spec_groups, locked_spec)
end.tap do |specs|
if ENV["DEBUG_RESOLVER"]
if DEBUG
STDERR.puts before_result
STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
end
Expand Down
3 changes: 2 additions & 1 deletion lib/bundler/resolver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ def initialize(index, source_requirements, base, gem_version_promoter, additiona
@platforms = platforms
@gem_version_promoter = gem_version_promoter
@allow_bundler_dependency_conflicts = Bundler.feature_flag.allow_bundler_dependency_conflicts?
@use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
end

def start(requirements)
Expand Down Expand Up @@ -123,7 +124,7 @@ def search_for(dependency)
end
# GVP handles major itself, but it's still a bit risky to trust it with it
# until we get it settled with new behavior. For 2.x it can take over all cases.
if @gem_version_promoter.major?
if !@use_gvp
spec_groups
else
@gem_version_promoter.sort_versions(dependency, spec_groups)
Expand Down
1 change: 1 addition & 0 deletions lib/bundler/settings.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ class Settings
suppress_install_using_messages
unlock_source_unlocks_spec
update_requires_all_flag
use_gem_version_promoter_for_major_updates
].freeze

NUMBER_KEYS = %w[
Expand Down
1 change: 1 addition & 0 deletions spec/quality_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ def check_for_specific_pronouns(filename)
gem.mit
inline
lockfile_uses_separate_rubygems_sources
use_gem_version_promoter_for_major_updates
warned_version
]

Expand Down