ruby-changes:73039
From: Hiroshi <ko1@a...>
Date: Tue, 23 Aug 2022 10:46:24 +0900 (JST)
Subject: [ruby-changes:73039] f69244cee8 (master): Merge rubygems/bundler HEAD
https://git.ruby-lang.org/ruby.git/commit/?id=f69244cee8 From f69244cee8c01d82e94d38032c82be684f37808a Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA <hsbt@r...> Date: Mon, 22 Aug 2022 11:52:51 +0900 Subject: Merge rubygems/bundler HEAD Pick from https://github.com/rubygems/rubygems/commit/6b3a5a9ab0453463381a8164efb6298ea9eb776f --- lib/bundler.rb | 2 +- lib/bundler/definition.rb | 41 +++++++------- lib/bundler/endpoint_specification.rb | 13 +---- lib/bundler/gem_version_promoter.rb | 4 ++ lib/bundler/incomplete_specification.rb | 12 ---- lib/bundler/installer.rb | 17 ++---- lib/bundler/lazy_specification.rb | 4 +- lib/bundler/match_metadata.rb | 13 +++++ lib/bundler/match_remote_metadata.rb | 26 +++++++++ lib/bundler/remote_specification.rb | 8 +-- lib/bundler/resolver.rb | 56 +++++++++++++------ lib/bundler/resolver/spec_group.rb | 2 +- lib/bundler/rubygems_ext.rb | 2 + lib/bundler/spec_set.rb | 28 +++++++--- spec/bundler/install/gems/dependency_api_spec.rb | 16 ++++++ spec/bundler/install/gems/resolving_spec.rb | 71 ++++++++++++++++++++++++ 16 files changed, 225 insertions(+), 90 deletions(-) delete mode 100644 lib/bundler/incomplete_specification.rb create mode 100644 lib/bundler/match_metadata.rb create mode 100644 lib/bundler/match_remote_metadata.rb diff --git a/lib/bundler.rb b/lib/bundler.rb index b24d47c6d0..79f65ccbe1 100644 --- a/lib/bundler.rb +++ b/lib/bundler.rb @@ -53,12 +53,12 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler.rb#L53 autoload :GemHelpers, File.expand_path("bundler/gem_helpers", __dir__) autoload :GemVersionPromoter, File.expand_path("bundler/gem_version_promoter", __dir__) autoload :Graph, File.expand_path("bundler/graph", __dir__) - autoload :IncompleteSpecification, File.expand_path("bundler/incomplete_specification", __dir__) autoload :Index, File.expand_path("bundler/index", __dir__) autoload :Injector, File.expand_path("bundler/injector", __dir__) autoload :Installer, File.expand_path("bundler/installer", __dir__) autoload :LazySpecification, File.expand_path("bundler/lazy_specification", __dir__) autoload :LockfileParser, File.expand_path("bundler/lockfile_parser", __dir__) + autoload :MatchRemoteMetadata, File.expand_path("bundler/match_remote_metadata", __dir__) autoload :ProcessLock, File.expand_path("bundler/process_lock", __dir__) autoload :RemoteSpecification, File.expand_path("bundler/remote_specification", __dir__) autoload :Resolver, File.expand_path("bundler/resolver", __dir__) diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 7d28375bb5..66efd82b53 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -145,8 +145,6 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/definition.rb#L145 @dependency_changes = converge_dependencies @local_changes = converge_locals - @reresolve = nil - @requires = compute_requires end @@ -218,6 +216,7 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/definition.rb#L216 true rescue BundlerError => e @resolve = nil + @resolver = nil @specs = nil @gem_version_promoter = nil @@ -288,7 +287,7 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/definition.rb#L287 end else Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}") - @reresolve = reresolve + resolver.start(expanded_dependencies) end end @@ -482,11 +481,18 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/definition.rb#L481 private - def reresolve - last_resolve = converge_locked_specs - remove_ruby_from_platforms_if_necessary!(dependencies) - expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true) - Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms) + def resolver + @resolver ||= begin + last_resolve = converge_locked_specs + Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms) + end + end + + def expanded_dependencies + @expanded_dependencies ||= begin + remove_ruby_from_platforms_if_necessary!(dependencies) + expand_dependencies(dependencies + metadata_dependencies, true) + end end def filter_specs(specs, deps) @@ -514,15 +520,13 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/definition.rb#L520 raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}" end - if @reresolve.nil? + loop do incomplete_specs = specs.incomplete_specs + break if incomplete_specs.empty? - if incomplete_specs.any? - Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies") - @unlock[:gems].concat(incomplete_specs.map(&:name)) - @resolve = reresolve - specs = resolve.materialize(dependencies) - end + Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies") + @resolve = resolver.start(expanded_dependencies, :exclude_specs => incomplete_specs) + specs = resolve.materialize(dependencies) end bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last @@ -879,10 +883,8 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/definition.rb#L883 def additional_base_requirements_for_resolve return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources) converge_specs(@originally_locked_specs).map do |locked_spec| - name = locked_spec.name - dep = Dependency.new(name, ">= #{locked_spec.version}") - DepProxy.get_proxy(dep, locked_spec.platform) - end + Dependency.new(locked_spec.name, ">= #{locked_spec.version}") + end.uniq end def remove_ruby_from_platforms_if_necessary!(dependencies) @@ -894,6 +896,7 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/definition.rb#L896 remove_platform(Gem::Platform::RUBY) add_current_platform + resolver.platforms = @platforms end def source_map diff --git a/lib/bundler/endpoint_specification.rb b/lib/bundler/endpoint_specification.rb index 368534ba6d..ea197328ba 100644 --- a/lib/bundler/endpoint_specification.rb +++ b/lib/bundler/endpoint_specification.rb @@ -3,6 +3,8 @@ https://github.com/ruby/ruby/blob/trunk/lib/bundler/endpoint_specification.rb#L3 module Bundler # used for Creating Specifications from the Gemcutter Endpoint class EndpointSpecification < Gem::Specification + include MatchRemoteMetadata + attr_reader :name, :version, :platform, :checksum attr_accessor :source, :remote, :dependencies @@ -20,17 +22,6 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/endpoint_specification.rb#L22 parse_metadata(metadata) end - def required_ruby_version - @required_ruby_version ||= _remote_specification.required_ruby_version - end - - # A fallback is included because the original version of the specification - # API didn't include that field, so some marshalled specs in the index have it - # set to +nil+. - def required_rubygems_version - @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default - end - def fetch_platform @platform end diff --git a/lib/bundler/gem_version_promoter.rb b/lib/bundler/gem_version_promoter.rb index 3cce3f2139..ddf7446dd2 100644 --- a/lib/bundler/gem_version_promoter.rb +++ b/lib/bundler/gem_version_promoter.rb @@ -88,6 +88,10 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/gem_version_promoter.rb#L88 end end + def reset + @sort_versions = {} + end + # @return [bool] Convenience method for testing value of level variable. def major? level == :major diff --git a/lib/bundler/incomplete_specification.rb b/lib/bundler/incomplete_specification.rb deleted file mode 100644 index 6d0b9b901c..0000000000 --- a/lib/bundler/incomplete_specification.rb +++ /dev/null @@ -1,12 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/lib/bundler/gem_version_promoter.rb#L0 -# frozen_string_literal: true - -module Bundler - class IncompleteSpecification - attr_reader :name, :platform - - def initialize(name, platform) - @name = name - @platform = platform - end - end -end diff --git a/lib/bundler/installer.rb b/lib/bundler/installer.rb index b7b0e36dfd..1b17de5d4e 100644 --- a/lib/bundler/installer.rb +++ b/lib/bundler/installer.rb @@ -238,19 +238,14 @@ module Bundler https://github.com/ruby/ruby/blob/trunk/lib/bundler/installer.rb#L238 end def ensure_specs_are_compatible! - system_ruby = Bundler::RubyVersion.system - rubygems_version = Bundler.rubygems.version @definition.specs.each do |spec| - if required_ruby_version = spec.required_ruby_version - unless required_ruby_version.satisfied_by?(system_ruby.gem_version) - raise InstallError, "#{spec.full_name} requires ruby version #{required_ruby_version}, " \ - "which is incompatible with the current versi (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/