diff options
author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2021-02-01 16:17:16 +0100 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2021-03-08 13:47:35 +0900 |
commit | 53468cc11147b0d285fc376fc546b677dad600ca (patch) | |
tree | eb9c97f544d089be2d324126b025b11f41a22c90 /lib/bundler/resolver | |
parent | 2ab6b7a7516e1b2c48a66ce513afabb62d101461 (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.rb | 100 |
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 |