summaryrefslogtreecommitdiff
path: root/lib/rubygems/resolver.rb
diff options
context:
space:
mode:
authorhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-17 01:29:22 +0000
committerhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-17 01:29:22 +0000
commitfa59a2ea808e6b7af862462c764a2110f1ff7ab2 (patch)
tree6ce8d14bd2fd646ca55c80f9676688b2616b4dd1 /lib/rubygems/resolver.rb
parent9eb94b4dc1e6cb21c80b2dfa930bc522a85414ec (diff)
Merge rubygems-2.6.11
This version fixed regression of rubygems-2.6.10. https://github.com/rubygems/rubygems/pull/1856 See details of changelogs for 2.6.11 release: https://github.com/rubygems/rubygems/blob/adfcf40502716080bd9cdfdd2e43bd4296872784/History.txt#L3 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57998 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/resolver.rb')
-rw-r--r--lib/rubygems/resolver.rb41
1 files changed, 38 insertions, 3 deletions
diff --git a/lib/rubygems/resolver.rb b/lib/rubygems/resolver.rb
index 50a547e1be..a7b11179c8 100644
--- a/lib/rubygems/resolver.rb
+++ b/lib/rubygems/resolver.rb
@@ -4,9 +4,6 @@ require 'rubygems/exceptions'
require 'rubygems/util'
require 'rubygems/util/list'
-require 'uri'
-require 'net/http'
-
##
# Given a set of Gem::Dependency objects as +needed+ and a way to query the
# set of available specs via +set+, calculates a set of ActivationRequest
@@ -256,6 +253,44 @@ class Gem::Resolver
@soft_missing
end
+ def sort_dependencies(dependencies, activated, conflicts)
+ dependencies.sort_by do |dependency|
+ name = name_for(dependency)
+ [
+ activated.vertex_named(name).payload ? 0 : 1,
+ amount_constrained(dependency),
+ conflicts[name] ? 0 : 1,
+ activated.vertex_named(name).payload ? 0 : search_for(dependency).count,
+ ]
+ end
+ end
+
+ SINGLE_POSSIBILITY_CONSTRAINT_PENALTY = 1_000_000
+ private_constant :SINGLE_POSSIBILITY_CONSTRAINT_PENALTY if defined?(private_constant)
+
+ # 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
+ name_dependency = Gem::Dependency.new(dependency.name)
+ dependency_request_for_name = Gem::Resolver::DependencyRequest.new(name_dependency, dependency.requester)
+ all = @set.find_all(dependency_request_for_name).size
+
+ if all <= 1
+ all - SINGLE_POSSIBILITY_CONSTRAINT_PENALTY
+ else
+ search = search_for(dependency).size
+ search - all
+ end
+ end
+ end
+ private :amount_constrained
+
end
##