diff options
-rw-r--r-- | lib/bundler/gem_version_promoter.rb | 42 | ||||
-rw-r--r-- | lib/bundler/resolver.rb | 42 |
2 files changed, 45 insertions, 39 deletions
diff --git a/lib/bundler/gem_version_promoter.rb b/lib/bundler/gem_version_promoter.rb index 50848ca580..57fc9f4c12 100644 --- a/lib/bundler/gem_version_promoter.rb +++ b/lib/bundler/gem_version_promoter.rb @@ -7,8 +7,7 @@ module Bundler # MODO: docs def initialize(locked_specs = SpecSet.new([]), unlock_gems = []) - @level_default = :major - @level = @level_default + @level = :major @strict = false @locked_specs = locked_specs @unlock_gems = unlock_gems @@ -17,11 +16,9 @@ module Bundler # MODO: docs def level=(value) - v = begin - case value - when String, Symbol - value.to_sym - end + v = case value + when String, Symbol + value.to_sym end raise ArgumentError, "Unexpected level #{v}. Must be :major, :minor or :patch" unless [:major, :minor, :patch].include?(v) @@ -45,8 +42,8 @@ module Bundler sort_dep_specs(dep_specs, locked_spec) end.tap do |specs| if ENV["DEBUG_RESOLVER"] - Bundler.ui.debug before_result - Bundler.ui.debug " after sort_versions: #{debug_format_result(dep, specs).inspect}" + STDERR.puts before_result + STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}" end end end @@ -54,15 +51,23 @@ module Bundler result.dup # not ideal, but elsewhere in bundler the resulting array is occasionally emptied, corrupting the cache. end + def major? + level == :major + end + + def minor? + level == :minor + end + private def filter_dep_specs(specs, locked_spec) res = specs.select do |spec_group| - if locked_spec && !(level == :major) + if locked_spec && !major? gsv = spec_group.version lsv = locked_spec.version - must_match = level == :minor ? [0] : [0, 1] + must_match = minor? ? [0] : [0, 1] matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] } (matches.uniq == [true]) ? (gsv >= lsv) : false @@ -79,24 +84,27 @@ module Bundler gem_name = locked_spec.name locked_version = locked_spec.version - filtered = specs.select {|s| s.version >= locked_version } + specs = specs.select {|s| s.version >= locked_version } unless major? - filtered.sort do |a, b| + specs.sort do |a, b| a_ver = a.version b_ver = b.version case - when level == :major + when major? a_ver <=> b_ver when a_ver.segments[0] != b_ver.segments[0] b_ver <=> a_ver - when !(level == :minor) && (a_ver.segments[1] != b_ver.segments[1]) + when !minor? && (a_ver.segments[1] != b_ver.segments[1]) b_ver <=> a_ver else a_ver <=> b_ver end end.tap do |result| - unless unlocking_gem?(gem_name) - move_version_to_end(specs, locked_version, result) + # default :major behavior in Bundler does not do this + unless major? + unless unlocking_gem?(gem_name) + move_version_to_end(specs, locked_version, result) + end end end end diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index eb564f5857..e1df04efb1 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -250,32 +250,30 @@ module Bundler if vertex = @base_dg.vertex_named(dependency.name) locked_requirement = vertex.payload.requirement end - spec_groups = begin - if results.any? - nested = [] - results.each do |spec| - version, specs = nested.last - if version == spec.version - specs << spec - else - nested << [spec.version, [spec]] - end - end - nested.reduce([]) do |groups, (version, specs)| - next groups if locked_requirement && !locked_requirement.satisfied_by?(version) - groups << SpecGroup.new(specs) + spec_groups = if results.any? + nested = [] + results.each do |spec| + version, specs = nested.last + if version == spec.version + specs << spec + else + nested << [spec.version, [spec]] end - else - [] end - end - # MODO: ideally trying to get GVP to sort by major. but some test cases aren't showing consistent order - # by default. (so we don't have to have this conditional here) - if @gem_version_promoter.level != :major - @gem_version_promoter.sort_versions(dependency, spec_groups) + nested.reduce([]) do |groups, (version, specs)| + next groups if locked_requirement && !locked_requirement.satisfied_by?(version) + groups << SpecGroup.new(specs) + end else + [] + 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? spec_groups - end # .tap {|sg| STDERR.puts "sg>> #{sg.inspect}" } + else + @gem_version_promoter.sort_versions(dependency, spec_groups) + end end search.select {|sg| sg.for?(platform, @ruby_version) }.each {|sg| sg.activate_platform!(platform) } end |