diff options
author | Homu <homu@barosl.com> | 2016-06-07 11:18:28 +0900 |
---|---|---|
committer | Homu <homu@barosl.com> | 2016-06-07 11:18:28 +0900 |
commit | 8d7b671909d9b75a9e1e64889f6ba45b302e3940 (patch) | |
tree | 957ba8c57e5819670694c021d824e5f98f007110 /lib/bundler/resolver.rb | |
parent | 117b98246e4c442a3899fbfe52949cfd5112c8d9 (diff) | |
parent | dd652431e48f31f782c00013ad0f48388c0fffd0 (diff) | |
download | bundler-8d7b671909d9b75a9e1e64889f6ba45b302e3940.tar.gz |
Auto merge of #4580 - bundler:seg-resolver-performance, r=indirect
Improve resolver performance
Some not insignificant improvements found while developing https://github.com/CocoaPods/Molinillo/pull/40, which I absolutely cannot wait to 🚢
\c @indirect
Diffstat (limited to 'lib/bundler/resolver.rb')
-rw-r--r-- | lib/bundler/resolver.rb | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 8c183ba885..918b3c977b 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -106,14 +106,8 @@ module Bundler specs.values end - def activate_platform(platform) - unless @activated.include?(platform) - if for?(platform, nil) - @activated << platform - return __dependencies[platform] || [] - end - end - [] + def activate_platform!(platform) + @activated << platform if !@activated.include?(platform) && for?(platform, nil) end def name @@ -252,28 +246,34 @@ module Bundler platform = dependency.__platform dependency = dependency.dep unless dependency.is_a? Gem::Dependency search = @search_for[dependency] ||= begin - index = @source_requirements[dependency.name] || @index + index = index_for(dependency) results = index.search(dependency, @base[dependency.name]) if vertex = @base_dg.vertex_named(dependency.name) 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 + version, specs = nested.last + if version == spec.version + specs << spec + else + nested << [spec.version, [spec]] end - nested.last << spec end - groups = nested.map {|a| SpecGroup.new(a) } - !locked_requirement ? groups : groups.select {|sg| locked_requirement.satisfied_by? sg.version } + nested.reduce([]) do |groups, (version, specs)| + next groups if locked_requirement && !locked_requirement.satisfied_by?(version) + groups << SpecGroup.new(specs) + end else [] end end - search.select {|sg| sg.for?(platform, @ruby_version) }.each {|sg| sg.activate_platform(platform) } + search.select {|sg| sg.for?(platform, @ruby_version) }.each {|sg| sg.activate_platform!(platform) } + end + + def index_for(dependency) + @source_requirements[dependency.name] || @index end def name_for(dependency) @@ -314,14 +314,12 @@ module Bundler if (base = @base[dependency.name]) && !base.empty? dependency.requirement.satisfied_by?(base.first.version) ? 0 : 1 else - base_dep = Dependency.new dependency.name, ">= 0.a" - all = search_for(DepProxy.new base_dep, dependency.__platform).size.to_f - if all.zero? - 0 - elsif (search = search_for(dependency).size.to_f) == all && all == 1 - 0 + all = index_for(dependency).search(dependency.name).size + if all <= 1 + all else - search / all + search = search_for(dependency).size + search - all end end end |