summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler/gem_version_promoter.rb66
1 files changed, 35 insertions, 31 deletions
diff --git a/lib/bundler/gem_version_promoter.rb b/lib/bundler/gem_version_promoter.rb
index d9debb899f..c2e75adb46 100644
--- a/lib/bundler/gem_version_promoter.rb
+++ b/lib/bundler/gem_version_promoter.rb
@@ -114,52 +114,56 @@ module Bundler
def sort_dep_specs(spec_groups, locked_spec)
return spec_groups unless locked_spec
- gem_name = locked_spec.name
- locked_version = locked_spec.version
+ @gem_name = locked_spec.name
+ @locked_version = locked_spec.version
- spec_groups.sort do |a, b|
- a_ver = a.version
- b_ver = b.version
+ result = spec_groups.sort do |a, b|
+ @a_ver = a.version
+ @b_ver = b.version
case
when major?
- a_ver <=> b_ver
- when either_version_older_than_locked(locked_version, a_ver, b_ver)
- a_ver <=> b_ver
- when segments_do_not_match(:major, a_ver, b_ver)
- b_ver <=> a_ver
- when !minor? && segments_do_not_match(:minor, a_ver, b_ver)
- b_ver <=> a_ver
+ @a_ver <=> @b_ver
+ when either_version_older_than_locked
+ @a_ver <=> @b_ver
+ when segments_do_not_match(:major)
+ @b_ver <=> @a_ver
+ when !minor? && segments_do_not_match(:minor)
+ @b_ver <=> @a_ver
else
- a_ver <=> b_ver
- end
- end.tap do |result|
- # default :major behavior in Bundler does not do this
- unless major?
- unless unlocking_gem?(gem_name)
- move_version_to_end(spec_groups, locked_version, result)
- end
+ @a_ver <=> @b_ver
end
end
+ post_sort(result)
end
- def either_version_older_than_locked(locked_version, a_ver, b_ver)
- a_ver < locked_version || b_ver < locked_version
+ def either_version_older_than_locked
+ @a_ver < @locked_version || @b_ver < @locked_version
end
- def segments_do_not_match(level, a_ver, b_ver)
+ def segments_do_not_match(level)
index = [:major, :minor].index(level)
- a_ver.segments[index] != b_ver.segments[index]
+ @a_ver.segments[index] != @b_ver.segments[index]
end
- def unlocking_gem?(gem_name)
- unlock_gems.empty? || unlock_gems.include?(gem_name)
+ def unlocking_gem?
+ unlock_gems.empty? || unlock_gems.include?(@gem_name)
+ end
+
+ # Specific version moves can't always reliably be done during sorting
+ # as not all elements are compared against each other.
+ def post_sort(result)
+ # default :major behavior in Bundler does not do this
+ return result if major?
+ if unlocking_gem?
+ result
+ else
+ move_version_to_end(result, @locked_version)
+ end
end
- def move_version_to_end(spec_groups, version, result)
- spec_group = spec_groups.detect {|s| s.version.to_s == version.to_s }
- return unless spec_group
- result.reject! {|s| s.version.to_s == version.to_s }
- result << spec_group
+ def move_version_to_end(result, version)
+ move, keep = result.partition {|s| s.version.to_s == version.to_s }
+ keep.concat(move)
end
def debug_format_result(dep, spec_groups)