Skip to content

Commit 7c93cf2

Browse files
Raise an error when top level dependency does not resolve under all locked platforms
1 parent 4098927 commit 7c93cf2

File tree

3 files changed

+68
-2
lines changed

3 files changed

+68
-2
lines changed

bundler/lib/bundler/resolver.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,13 @@ def all_versions_for(package)
248248
results = filter_matching_specs(results, locked_requirement) if locked_requirement
249249

250250
versions = results.group_by(&:version).reduce([]) do |groups, (version, specs)|
251-
platform_specs = package.platforms.flat_map {|platform| select_best_platform_match(specs, platform) }
252-
next groups if platform_specs.empty?
251+
platform_specs = package.platforms.map {|platform| select_best_platform_match(specs, platform) }
252+
if package.top_level?
253+
next groups if platform_specs.any?(&:empty?)
254+
else
255+
next groups if platform_specs.all?(&:empty?)
256+
end
257+
platform_specs.flatten!
253258

254259
ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY)
255260
groups << Resolver::Candidate.new(version, :specs => ruby_specs) if ruby_specs.any?

bundler/lib/bundler/resolver/package.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, depen
2121
@locked_version = locked_specs[name].first&.version
2222
@unlock = unlock
2323
@dependency = dependency || Dependency.new(name, @locked_version)
24+
@top_level = !dependency.nil?
2425
@prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore
2526
end
2627

@@ -32,6 +33,10 @@ def root?
3233
false
3334
end
3435

36+
def top_level?
37+
@top_level
38+
end
39+
3540
def meta?
3641
@name.end_with?("\0")
3742
end

bundler/spec/install/gems/resolving_spec.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,62 @@
425425
end
426426
end
427427

428+
context "when adding a new gem that does not resolve under all locked platforms" do
429+
before do
430+
simulate_platform "x86_64-linux" do
431+
build_repo4 do
432+
build_gem "nokogiri", "1.14.0" do |s|
433+
s.platform = "x86_64-linux"
434+
end
435+
build_gem "nokogiri", "1.14.0" do |s|
436+
s.platform = "arm-linux"
437+
end
438+
439+
build_gem "sorbet-static", "0.5.10696" do |s|
440+
s.platform = "x86_64-linux"
441+
end
442+
end
443+
444+
lockfile <<~L
445+
GEM
446+
remote: #{file_uri_for(gem_repo4)}/
447+
specs:
448+
nokogiri (1.14.0-arm-linux)
449+
nokogiri (1.14.0-x86_64-linux)
450+
451+
PLATFORMS
452+
arm-linux
453+
x86_64-linux
454+
455+
DEPENDENCIES
456+
nokogiri
457+
458+
BUNDLED WITH
459+
#{Bundler::VERSION}
460+
L
461+
462+
gemfile <<~G
463+
source "#{file_uri_for(gem_repo4)}"
464+
465+
gem "nokogiri"
466+
gem "sorbet-static"
467+
G
468+
469+
bundle "lock", :raise_on_error => false
470+
end
471+
end
472+
473+
it "raises a proper error" do
474+
nice_error = <<~E.strip
475+
Could not find gems matching 'sorbet-static' valid for all resolution platforms (arm-linux, x86_64-linux) in rubygems repository #{file_uri_for(gem_repo4)}/ or installed locally.
476+
477+
The source contains the following gems matching 'sorbet-static':
478+
* sorbet-static-0.5.10696-x86_64-linux
479+
E
480+
expect(err).to end_with(nice_error)
481+
end
482+
end
483+
428484
it "gives a meaningful error on ruby version mismatches between dependencies" do
429485
build_repo4 do
430486
build_gem "requires-old-ruby" do |s|

0 commit comments

Comments
 (0)