diff options
author | chrismo <chrismo@clabs.org> | 2016-06-21 21:16:39 -0500 |
---|---|---|
committer | chrismo <chrismo@clabs.org> | 2016-07-08 19:35:57 -0500 |
commit | 8cbe425e39ec0d710309993956dc37fe8abbb733 (patch) | |
tree | 7d109e4bdfef7d356ec73761b15e0a2151c592db /lib/bundler/gem_version_promoter.rb | |
parent | cb2f8c8f210d5fa04a1ea897fb61df0213e064bc (diff) | |
download | bundler-8cbe425e39ec0d710309993956dc37fe8abbb733.tar.gz |
Moved GemVersionPromoter inside search_for cache.
In the process I was able to simplify some of the code inside
GemVersionPromoter dealing with SpecGroups.
I also attempted to implement the :major behavior into
GemVersionPromoter as that would eliminate the logic to skip it in
`#search_for`, however I ran into some test failures that I need to
investigate further, though unit specs are working so far.
Diffstat (limited to 'lib/bundler/gem_version_promoter.rb')
-rw-r--r-- | lib/bundler/gem_version_promoter.rb | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/lib/bundler/gem_version_promoter.rb b/lib/bundler/gem_version_promoter.rb index 20a3a2b2..50848ca5 100644 --- a/lib/bundler/gem_version_promoter.rb +++ b/lib/bundler/gem_version_promoter.rb @@ -1,9 +1,11 @@ # frozen_string_literal: true module Bundler + # MODO: docs class GemVersionPromoter attr_reader :level, :locked_specs, :unlock_gems attr_accessor :strict + # MODO: docs def initialize(locked_specs = SpecSet.new([]), unlock_gems = []) @level_default = :major @level = @level_default @@ -13,6 +15,7 @@ module Bundler @sort_versions = {} end + # MODO: docs def level=(value) v = begin case value @@ -25,6 +28,7 @@ module Bundler @level = v end + # MODO: docs def sort_versions(dep, dep_specs) before_result = "before sort_versions: #{debug_format_result(dep, dep_specs).inspect}" if ENV["DEBUG_RESOLVER"] @@ -53,13 +57,9 @@ module Bundler private def filter_dep_specs(specs, locked_spec) - res = specs.select do |sg| - # SpecGroup is grouped by name/version, multiple entries for multiple platforms. - # We only need the name, which will be the same, so hard coding to first is ok. - gem_spec = sg.first - - if locked_spec - gsv = gem_spec.version + res = specs.select do |spec_group| + if locked_spec && !(level == :major) + gsv = spec_group.version lsv = locked_spec.version must_match = level == :minor ? [0] : [0, 1] @@ -74,20 +74,19 @@ module Bundler sort_dep_specs(res, locked_spec) end - # reminder: sort still filters anything older than locked version - # :major bundle update behavior can move a gem to an older version - # in order to satisfy the dependency tree. def sort_dep_specs(specs, locked_spec) return specs unless locked_spec gem_name = locked_spec.name locked_version = locked_spec.version - filtered = specs.select {|s| s.first.version >= locked_version } + filtered = specs.select {|s| s.version >= locked_version } filtered.sort do |a, b| - a_ver = a.first.version - b_ver = b.first.version + a_ver = a.version + b_ver = b.version case + when level == :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]) @@ -107,15 +106,16 @@ module Bundler end def move_version_to_end(specs, version, result) - spec_group = specs.detect {|s| s.first.version.to_s == version.to_s } + spec_group = specs.detect {|s| s.version.to_s == version.to_s } return unless spec_group - result.reject! {|s| s.first.version.to_s == version.to_s } + result.reject! {|s| s.version.to_s == version.to_s } result << spec_group end def debug_format_result(dep, res) a = [dep.to_s, res.map {|sg| [sg.version, sg.dependencies_for_activated_platforms.map {|dp| [dp.name, dp.requirement.to_s] }] }] + last_map = a.last.map {|sg_data| [sg_data.first.version, sg_data.last.map {|aa| aa.join(" ") }] } [a.first, last_map, level, strict ? :strict : :not_strict] end end |