[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]