diff options
| author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2025-01-09 21:34:29 +0100 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-01-14 12:24:37 +0900 |
| commit | 0b1b8bc3ec08de6944e6784de1ea5e03e90d8dba (patch) | |
| tree | e80f982ef9fda23e3f5b2de553d6a65a4cb289f7 /lib | |
| parent | 5c83d09ec874db44f6a69d8f81952f31a811013d (diff) | |
[rubygems/rubygems] Don't remove platform specific variants from the lockfile unless necessary
Even if they don't match the current Ruby version, they could still work
in other rubies. So it's better to keep them.
https://github.com/rubygems/rubygems/commit/9a3e583b0c
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/12568
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/bundler/definition.rb | 2 | ||||
| -rw-r--r-- | lib/bundler/resolver.rb | 3 | ||||
| -rw-r--r-- | lib/bundler/resolver/base.rb | 3 | ||||
| -rw-r--r-- | lib/bundler/spec_set.rb | 10 |
4 files changed, 15 insertions, 3 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index fd81fe2aa3..c31682ce4e 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -742,7 +742,7 @@ module Bundler @platforms = result.add_extra_platforms!(platforms) if should_add_extra_platforms? - SpecSet.new(result.for(dependencies, @platforms)) + SpecSet.new(result.for(dependencies, @platforms | [Gem::Platform::RUBY])) end def precompute_source_requirements_for_indirect_dependencies? diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 54e25a2adc..56a6c7ac67 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -80,7 +80,8 @@ module Bundler def solve_versions(root:, logger:) solver = PubGrub::VersionSolver.new(source: self, root: root, logger: logger) result = solver.solve - result.flat_map {|package, version| version.to_specs(package, @most_specific_locked_platform) } + resolved_specs = result.flat_map {|package, version| version.to_specs(package, @most_specific_locked_platform) } + SpecSet.new(resolved_specs).specs_with_additional_variants_from(@base.locked_specs) rescue PubGrub::SolveFailure => e incompatibility = e.incompatibility diff --git a/lib/bundler/resolver/base.rb b/lib/bundler/resolver/base.rb index f7d15a3024..932a92ff41 100644 --- a/lib/bundler/resolver/base.rb +++ b/lib/bundler/resolver/base.rb @@ -5,10 +5,11 @@ require_relative "package" module Bundler class Resolver class Base - attr_reader :packages, :requirements, :source_requirements + attr_reader :packages, :requirements, :source_requirements, :locked_specs def initialize(source_requirements, dependencies, base, platforms, options) @source_requirements = source_requirements + @locked_specs = options[:locked_specs] @base = base diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb index 994c3d29d2..f0082d46d5 100644 --- a/lib/bundler/spec_set.rb +++ b/lib/bundler/spec_set.rb @@ -163,6 +163,10 @@ module Bundler @specs.detect {|spec| spec.name == name && spec.match_platform(platform) } end + def specs_with_additional_variants_from(other) + sorted | additional_variants_from(other) + end + def delete_by_name(name) @specs.reject! {|spec| spec.name == name } @@ -277,6 +281,12 @@ module Bundler @specs.flat_map {|spec| spec.source.specs.search([spec.name, spec.version]).map(&:platform) }.uniq end + def additional_variants_from(other) + other.select do |spec| + version_for(spec.name) == spec.version && valid_dependencies?(spec) + end + end + def valid_dependencies?(s) validate_deps(s) == :valid end |
