summaryrefslogtreecommitdiff
path: root/lib/bundler/resolver.rb
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2016-05-15 22:28:43 -0500
committerSamuel Giddins <segiddins@segiddins.me>2016-06-02 16:51:13 -0500
commit5bf3ba253134c25e8b03ec230e3e663563c6aba6 (patch)
treeee31899ed252a0c169befd686f806802d2ff8afd /lib/bundler/resolver.rb
parentcfab22c4b21aa4190c7debdd12ff69ba0dcfb893 (diff)
downloadbundler-5bf3ba253134c25e8b03ec230e3e663563c6aba6.tar.gz
[Resolver] Speed up searching
1) even group_by isnt as good as manually enumerating -- it also gets rid of a bunch of convoluted logic 2) dont create SpecGroup objects just to throw them array 3) drop allocation of intermediary arrays
Diffstat (limited to 'lib/bundler/resolver.rb')
-rw-r--r--lib/bundler/resolver.rb15
1 files changed, 6 insertions, 9 deletions
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb
index 0c9b324203..578723d9de 100644
--- a/lib/bundler/resolver.rb
+++ b/lib/bundler/resolver.rb
@@ -258,17 +258,14 @@ module Bundler
locked_requirement = vertex.payload.requirement
end
if results.any?
- version = results.first.version
- nested = [[]]
+ nested = {}
results.each do |spec|
- if spec.version != version
- nested << []
- version = spec.version
- end
- nested.last << spec
+ (nested[spec.version] ||= []) << spec
+ end
+ nested.reduce([]) do |groups, (version, specs)|
+ next groups if locked_requirement && !locked_requirement.satisfied_by?(version)
+ groups << SpecGroup.new(specs)
end
- groups = nested.map {|a| SpecGroup.new(a) }
- !locked_requirement ? groups : groups.select {|sg| locked_requirement.satisfied_by? sg.version }
else
[]
end