summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHomu <homu@barosl.com>2016-07-13 10:37:54 +0900
committerHomu <homu@barosl.com>2016-07-13 10:37:54 +0900
commitc90329aef3d0ff4b5e3d4434fd522c4e626c109c (patch)
tree38a6b69a53e4f410a8da2669f7b7d99a4502824f
parentce40e1f365d9ea69d6e9e0290c4ddfd57a59d934 (diff)
parent9596f0900c01f52268e1f0b3fdc3b3856997a7db (diff)
downloadbundler-c90329aef3d0ff4b5e3d4434fd522c4e626c109c.tar.gz
Auto merge of #4779 - chrismo:gvp_refactor, r=indirect
GemVersionPromoter refactorings I've been changing bundler-patch to work with the code portions that have been moved into Bundler, and the tap block at the end of sort_dep_specs couldn't be overridden, so that's been moved into its own method. Another refactoring was to move local vars into instance vars to stop passing them around. Going all the way to push that into a class seemed a bit much at this stage.
-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)