From 758e01d39da4b84a9950ad1301af98010e27fbee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 14 Jun 2024 11:08:48 +0200 Subject: [PATCH] [rubygems/rubygems] Make sure to not re-resolve when a not fully specific local platform is locked https://github.com/rubygems/rubygems/commit/36a02c6128 --- lib/bundler/definition.rb | 9 ++++- .../install/gemfile/specific_platform_spec.rb | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 93ddfeaed9..7eac113254 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -621,11 +621,13 @@ module Bundler end def start_resolution + @platforms |= [local_platform] + result = SpecSet.new(resolver.start) @resolved_bundler_version = result.find {|spec| spec.name == "bundler" }&.version - if @current_ruby_locked_platform && @current_ruby_locked_platform != local_platform + if most_specific_ruby_locked_platform_is_not_local_platform? @platforms.delete(result.incomplete_for_platform?(dependencies, @current_ruby_locked_platform) ? @current_ruby_locked_platform : local_platform) end @@ -667,10 +669,15 @@ module Bundler def add_current_platform @current_ruby_locked_platform = most_specific_locked_platform if current_ruby_platform_locked? + return if most_specific_ruby_locked_platform_is_not_local_platform? add_platform(local_platform) end + def most_specific_ruby_locked_platform_is_not_local_platform? + @current_ruby_locked_platform && @current_ruby_locked_platform != local_platform + end + def change_reason if unlocking? unlock_targets = if @gems_to_unlock.any? diff --git a/spec/bundler/install/gemfile/specific_platform_spec.rb b/spec/bundler/install/gemfile/specific_platform_spec.rb index 4814ab4fd2..b9ee294df8 100644 --- a/spec/bundler/install/gemfile/specific_platform_spec.rb +++ b/spec/bundler/install/gemfile/specific_platform_spec.rb @@ -1434,6 +1434,40 @@ RSpec.describe "bundle install with specific platforms" do end end + it "does not re-resolve when a specific platform, but less specific than the current platform, is locked" do + build_repo4 do + build_gem "nokogiri" + end + + gemfile <<~G + source "#{file_uri_for(gem_repo4)}" + + gem "nokogiri" + G + + lockfile <<~L + GEM + remote: #{file_uri_for(gem_repo4)}/ + specs: + nokogiri (1.0) + + PLATFORMS + arm64-darwin + + DEPENDENCIES + nokogiri! + + BUNDLED WITH + #{Bundler::VERSION} + L + + simulate_platform "arm64-darwin-23" do + bundle "install --verbose" + + expect(out).to include("Found no changes, using resolution from the lockfile") + end + end + private def setup_multiplatform_gem