diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2016-05-15 22:28:43 -0500 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2016-06-02 16:51:13 -0500 |
commit | 5bf3ba253134c25e8b03ec230e3e663563c6aba6 (patch) | |
tree | ee31899ed252a0c169befd686f806802d2ff8afd /lib/bundler/resolver.rb | |
parent | cfab22c4b21aa4190c7debdd12ff69ba0dcfb893 (diff) | |
download | bundler-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.rb | 15 |
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 |