diff options
author | The Bundler Bot <bot@bundler.io> | 2017-09-05 18:48:07 +0000 |
---|---|---|
committer | The Bundler Bot <bot@bundler.io> | 2017-09-05 18:48:07 +0000 |
commit | a325b6d74f9d8db306f264c43bbe580ec0f1acc8 (patch) | |
tree | 84b714a3abecefb7dfa9f89476ffa7f0cf7aca4f | |
parent | f81b8ddaefa0528105c9e2dcb33e045b20588f42 (diff) | |
parent | 092dfb64198c4ed914e280e7ee9097f777467604 (diff) | |
download | bundler-a325b6d74f9d8db306f264c43bbe580ec0f1acc8.tar.gz |
Auto merge of #5995 - bundler:seg-gvp-major, r=indirect
[2.0] [Resolver] Use the GVP for major updates in 2.0
Thanks so much for the contribution!
To make reviewing this PR a bit easier, please fill out answers to the following questions.
### What was the end-user problem that led to this PR?
The problem was @chrismo wants to start delegating all sorting to the GVP.
### What was your diagnosis of the problem?
My diagnosis was to start doing that in 2.0.
Closes https://github.com/bundler/bundler/issues/5993
### What is your fix for the problem, implemented in this PR?
My fix adds a feature flag.
-rw-r--r-- | lib/bundler/definition.rb | 28 | ||||
-rw-r--r-- | lib/bundler/feature_flag.rb | 1 | ||||
-rw-r--r-- | lib/bundler/gem_version_promoter.rb | 6 | ||||
-rw-r--r-- | lib/bundler/resolver.rb | 3 | ||||
-rw-r--r-- | lib/bundler/settings.rb | 1 | ||||
-rw-r--r-- | spec/quality_spec.rb | 1 |
6 files changed, 23 insertions, 17 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 1385ff2a94..ecb41f83c2 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -10,7 +10,6 @@ module Bundler attr_reader( :dependencies, - :gem_version_promoter, :locked_deps, :locked_gems, :platforms, @@ -125,25 +124,25 @@ module Bundler @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! @@ -218,6 +217,7 @@ module Bundler @index = nil @resolve = nil @specs = nil + @gem_version_promoter = nil end def requested_specs diff --git a/lib/bundler/feature_flag.rb b/lib/bundler/feature_flag.rb index 6a1809cd40..921be055b1 100644 --- a/lib/bundler/feature_flag.rb +++ b/lib/bundler/feature_flag.rb @@ -52,6 +52,7 @@ module Bundler 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 } diff --git a/lib/bundler/gem_version_promoter.rb b/lib/bundler/gem_version_promoter.rb index 52b5386045..a52c9cce2b 100644 --- a/lib/bundler/gem_version_promoter.rb +++ b/lib/bundler/gem_version_promoter.rb @@ -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 @@ -61,7 +63,7 @@ module Bundler # @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 @@ -75,7 +77,7 @@ module Bundler 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 diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 0cf2da007a..cc87bcb0cb 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -38,6 +38,7 @@ module Bundler @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) @@ -123,7 +124,7 @@ module Bundler 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) diff --git a/lib/bundler/settings.rb b/lib/bundler/settings.rb index dee7c14ca1..0c62e808cb 100644 --- a/lib/bundler/settings.rb +++ b/lib/bundler/settings.rb @@ -53,6 +53,7 @@ module Bundler suppress_install_using_messages unlock_source_unlocks_spec update_requires_all_flag + use_gem_version_promoter_for_major_updates ].freeze NUMBER_KEYS = %w[ diff --git a/spec/quality_spec.rb b/spec/quality_spec.rb index d4f3ddaf9b..25956c63bf 100644 --- a/spec/quality_spec.rb +++ b/spec/quality_spec.rb @@ -178,6 +178,7 @@ RSpec.describe "The library itself" do gem.mit inline lockfile_uses_separate_rubygems_sources + use_gem_version_promoter_for_major_updates warned_version ] |