summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThe Bundler Bot <bot@bundler.io>2017-09-05 18:48:07 +0000
committerThe Bundler Bot <bot@bundler.io>2017-09-05 18:48:07 +0000
commita325b6d74f9d8db306f264c43bbe580ec0f1acc8 (patch)
tree84b714a3abecefb7dfa9f89476ffa7f0cf7aca4f
parentf81b8ddaefa0528105c9e2dcb33e045b20588f42 (diff)
parent092dfb64198c4ed914e280e7ee9097f777467604 (diff)
downloadbundler-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.rb28
-rw-r--r--lib/bundler/feature_flag.rb1
-rw-r--r--lib/bundler/gem_version_promoter.rb6
-rw-r--r--lib/bundler/resolver.rb3
-rw-r--r--lib/bundler/settings.rb1
-rw-r--r--spec/quality_spec.rb1
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
]