[rubygems/rubygems] Automatically remove "ruby" from lockfile if incomplete

https://github.com/rubygems/rubygems/commit/69d0b4e10b
This commit is contained in:
David Rodríguez 2022-08-02 17:45:28 +02:00 committed by git
parent 73f0573cb3
commit 5a9db23734
3 changed files with 87 additions and 0 deletions

View File

@ -484,6 +484,7 @@ module Bundler
def reresolve def reresolve
last_resolve = converge_locked_specs last_resolve = converge_locked_specs
remove_ruby_from_platforms_if_necessary!(dependencies)
expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true) 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) Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
end end
@ -865,6 +866,17 @@ module Bundler
end end
end end
def remove_ruby_from_platforms_if_necessary!(dependencies)
return if Bundler.frozen_bundle? ||
Bundler.local_platform == Gem::Platform::RUBY ||
!platforms.include?(Gem::Platform::RUBY) ||
(@new_platform && platforms.last == Gem::Platform::RUBY) ||
!@originally_locked_specs.incomplete_ruby_specs?(dependencies)
remove_platform(Gem::Platform::RUBY)
add_current_platform
end
def source_map def source_map
@source_map ||= SourceMap.new(sources, dependencies, @locked_specs) @source_map ||= SourceMap.new(sources, dependencies, @locked_specs)
end end

View File

@ -91,6 +91,10 @@ module Bundler
SpecSet.new(materialized) SpecSet.new(materialized)
end end
def incomplete_ruby_specs?(deps)
self.class.new(self.for(deps, true, [Gem::Platform::RUBY])).incomplete_specs.any?
end
def missing_specs def missing_specs
@specs.select {|s| s.is_a?(LazySpecification) } @specs.select {|s| s.is_a?(LazySpecification) }
end end

View File

@ -374,6 +374,77 @@ RSpec.describe "bundle install with specific platforms" do
ERROR ERROR
end end
it "automatically fixes the lockfile if RUBY platform is locked and some gem has no RUBY variant available" do
build_repo4 do
build_gem("sorbet-static-and-runtime", "0.5.10160") do |s|
s.add_runtime_dependency "sorbet", "= 0.5.10160"
s.add_runtime_dependency "sorbet-runtime", "= 0.5.10160"
end
build_gem("sorbet", "0.5.10160") do |s|
s.add_runtime_dependency "sorbet-static", "= 0.5.10160"
end
build_gem("sorbet-runtime", "0.5.10160")
build_gem("sorbet-static", "0.5.10160") do |s|
s.platform = Gem::Platform.local
end
end
gemfile <<~G
source "#{file_uri_for(gem_repo4)}"
gem "sorbet-static-and-runtime"
G
lockfile <<~L
GEM
remote: #{file_uri_for(gem_repo4)}/
specs:
sorbet (0.5.10160)
sorbet-static (= 0.5.10160)
sorbet-runtime (0.5.10160)
sorbet-static (0.5.10160-#{Gem::Platform.local})
sorbet-static-and-runtime (0.5.10160)
sorbet (= 0.5.10160)
sorbet-runtime (= 0.5.10160)
PLATFORMS
#{lockfile_platforms_for([specific_local_platform, "ruby"])}
DEPENDENCIES
sorbet-static-and-runtime
BUNDLED WITH
#{Bundler::VERSION}
L
bundle "update"
expect(lockfile).to eq <<~L
GEM
remote: #{file_uri_for(gem_repo4)}/
specs:
sorbet (0.5.10160)
sorbet-static (= 0.5.10160)
sorbet-runtime (0.5.10160)
sorbet-static (0.5.10160-#{Gem::Platform.local})
sorbet-static-and-runtime (0.5.10160)
sorbet (= 0.5.10160)
sorbet-runtime (= 0.5.10160)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
sorbet-static-and-runtime
BUNDLED WITH
#{Bundler::VERSION}
L
end
it "can fallback to a source gem when platform gems are incompatible with current ruby version" do it "can fallback to a source gem when platform gems are incompatible with current ruby version" do
setup_multiplatform_gem_with_source_gem setup_multiplatform_gem_with_source_gem