summaryrefslogtreecommitdiff
path: root/lib/bundler/resolver
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2021-02-01 16:17:16 +0100
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2021-03-08 13:47:35 +0900
commit53468cc11147b0d285fc376fc546b677dad600ca (patch)
treeeb9c97f544d089be2d324126b025b11f41a22c90 /lib/bundler/resolver
parent2ab6b7a7516e1b2c48a66ce513afabb62d101461 (diff)
Sync latest development version of bundler & rubygems
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4143
Diffstat (limited to 'lib/bundler/resolver')
-rw-r--r--lib/bundler/resolver/spec_group.rb100
1 files changed, 56 insertions, 44 deletions
diff --git a/lib/bundler/resolver/spec_group.rb b/lib/bundler/resolver/spec_group.rb
index 34780f9528..73ffec5838 100644
--- a/lib/bundler/resolver/spec_group.rb
+++ b/lib/bundler/resolver/spec_group.rb
@@ -3,28 +3,37 @@
module Bundler
class Resolver
class SpecGroup
- include GemHelpers
-
attr_accessor :name, :version, :source
- attr_accessor :ignores_bundler_dependencies, :activated_platforms
+ attr_accessor :activated_platforms
+
+ def self.create_for(specs, all_platforms, specific_platform)
+ specific_platform_specs = specs[specific_platform]
+ return unless specific_platform_specs.any?
+
+ platforms = all_platforms.select {|p| specs[p].any? }
+
+ new(specific_platform_specs.first, specs, platforms)
+ end
- def initialize(all_specs)
- @all_specs = all_specs
- raise ArgumentError, "cannot initialize with an empty value" unless exemplary_spec = all_specs.first
+ def initialize(exemplary_spec, specs, relevant_platforms)
+ @exemplary_spec = exemplary_spec
@name = exemplary_spec.name
@version = exemplary_spec.version
@source = exemplary_spec.source
- @activated_platforms = []
- @dependencies = nil
- @specs = Hash.new do |specs, platform|
- specs[platform] = select_best_platform_match(all_specs, platform)
+ @all_platforms = relevant_platforms
+ @activated_platforms = relevant_platforms
+ @dependencies = Hash.new do |dependencies, platforms|
+ dependencies[platforms] = dependencies_for(platforms)
end
- @ignores_bundler_dependencies = true
+ @partitioned_dependency_names = Hash.new do |partitioned_dependency_names, platforms|
+ partitioned_dependency_names[platforms] = partitioned_dependency_names_for(platforms)
+ end
+ @specs = specs
end
def to_specs
- @activated_platforms.map do |p|
+ activated_platforms.map do |p|
specs = @specs[p]
next unless specs.any?
@@ -36,18 +45,12 @@ module Bundler
end.flatten.compact.uniq
end
- def copy_for(platforms)
- platforms.select! {|p| for?(p) }
- return unless platforms.any?
-
- copied_sg = self.class.new(@all_specs)
- copied_sg.ignores_bundler_dependencies = @ignores_bundler_dependencies
- copied_sg.activated_platforms = platforms
- copied_sg
+ def activate_platform!(platform)
+ self.activated_platforms = [platform]
end
- def for?(platform)
- @specs[platform].any?
+ def activate_all_platforms!
+ self.activated_platforms = @all_platforms
end
def to_s
@@ -56,11 +59,11 @@ module Bundler
end
def dependencies_for_activated_platforms
- dependencies = @activated_platforms.map {|p| __dependencies[p] }
- metadata_dependencies = @activated_platforms.map do |platform|
- metadata_dependencies(@specs[platform].first, platform)
- end
- dependencies.concat(metadata_dependencies).flatten
+ @dependencies[activated_platforms]
+ end
+
+ def partitioned_dependency_names_for_activated_platforms
+ @partitioned_dependency_names[activated_platforms]
end
def ==(other)
@@ -86,34 +89,43 @@ module Bundler
protected
def sorted_activated_platforms
- @activated_platforms.sort_by(&:to_s)
+ activated_platforms.sort_by(&:to_s)
end
private
- def __dependencies
- @dependencies = Hash.new do |dependencies, platform|
- dependencies[platform] = []
- specs = @specs[platform]
- if spec = specs.first
- spec.dependencies.each do |dep|
- next if dep.type == :development
- next if @ignores_bundler_dependencies && dep.name == "bundler".freeze
- dependencies[platform] << DepProxy.new(dep, platform)
- end
- end
- dependencies[platform]
+ def dependencies_for(platforms)
+ platforms.map do |platform|
+ __dependencies(platform) + metadata_dependencies(platform)
+ end.flatten
+ end
+
+ def partitioned_dependency_names_for(platforms)
+ return @dependencies[platforms].map(&:name), [] if platforms.size == 1
+
+ @dependencies[platforms].partition do |dep_proxy|
+ @dependencies[platforms].count {|dp| dp.dep == dep_proxy.dep } == platforms.size
+ end.map {|deps| deps.map(&:name) }
+ end
+
+ def __dependencies(platform)
+ dependencies = []
+ @specs[platform].first.dependencies.each do |dep|
+ next if dep.type == :development
+ dependencies << DepProxy.get_proxy(dep, platform)
end
+ dependencies
end
- def metadata_dependencies(spec, platform)
- return [] unless spec && spec.is_a?(Gem::Specification)
+ def metadata_dependencies(platform)
+ spec = @specs[platform].first
+ return [] unless spec.is_a?(Gem::Specification)
dependencies = []
if !spec.required_ruby_version.nil? && !spec.required_ruby_version.none?
- dependencies << DepProxy.new(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
end
if !spec.required_rubygems_version.nil? && !spec.required_rubygems_version.none?
- dependencies << DepProxy.new(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
end
dependencies
end