diff options
author | The Bundler Bot <bot@bundler.io> | 2017-02-18 12:56:39 +0000 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2017-02-22 11:54:12 +1100 |
commit | 711ea8d212b22fc062a69be6b2768887cf737f8e (patch) | |
tree | e158f4b3bb6fb5109c9d9633d933e31cfa86f466 /lib | |
parent | e09565b3c8efeebbb9ede8d38e3ddd8550199525 (diff) | |
download | bundler-711ea8d212b22fc062a69be6b2768887cf737f8e.tar.gz |
Auto merge of #5443 - bundler:seg-resolver-sorting, r=indirect
[Resolver] Improve sorting of deps with 0 or 1 possibility
As the added comment says, this will force all dependencies where there are only 0 or 1 total specs with that name to be resolved first. Right now, they sort ~last, which leads to poor performance.
(This was one way of fixing some recent resolver issues, even though we've done the proper fixes in Molinillo for them)
(cherry picked from commit cc4414ca7cfe76989ecbefec8408e2c26cdaf71d)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/bundler/resolver.rb | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 2bdf4721ec..cdf2419c42 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -230,11 +230,11 @@ module Bundler def debug? return @debug_mode if defined?(@debug_mode) - @debug_mode = ENV["DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER_TREE"] + @debug_mode = ENV["DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER_TREE"] || false end def before_resolution - Bundler.ui.info "Resolving dependencies...", false + Bundler.ui.info "Resolving dependencies...", debug? end def after_resolution @@ -242,7 +242,7 @@ module Bundler end def indicate_progress - Bundler.ui.info ".", false + Bundler.ui.info ".", false unless debug? end include Molinillo::SpecificationProvider @@ -328,6 +328,12 @@ module Bundler private + # returns an integer \in (-\infty, 0] + # a number closer to 0 means the dependency is less constraining + # + # dependencies w/ 0 or 1 possibilities (ignoring version requirements) + # are given very negative values, so they _always_ sort first, + # before dependencies that are unconstrained def amount_constrained(dependency) @amount_constrained ||= {} @amount_constrained[dependency.name] ||= begin @@ -335,8 +341,9 @@ module Bundler dependency.requirement.satisfied_by?(base.first.version) ? 0 : 1 else all = index_for(dependency).search(dependency.name).size + if all <= 1 - all + all - 1_000_000 else search = search_for(dependency).size search - all |