From ee03df26bad92abb5397a82be3bc385a9ef69b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 11 Feb 2025 16:25:45 +0100 Subject: [PATCH] [rubygems/rubygems] `--prefer-local` should resolve to latest version if no gems are available locally Filtering out remote specs should only apply where there are locally installed specs. Otherwise they should always be considered. https://github.com/rubygems/rubygems/commit/118f8389a1 --- lib/bundler/resolver.rb | 13 +++++++++++-- spec/bundler/commands/install_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 56a6c7ac67..ce51056904 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -389,9 +389,18 @@ module Bundler end def filter_remote_specs(specs, package) - return specs unless package.prefer_local? + if package.prefer_local? + local_specs = specs.select {|s| s.is_a?(StubSpecification) } - specs.select {|s| s.is_a?(StubSpecification) } + if local_specs.empty? + package.consider_remote_versions! + specs + else + local_specs + end + else + specs + end end # Ignore versions that depend on themselves incorrectly diff --git a/spec/bundler/commands/install_spec.rb b/spec/bundler/commands/install_spec.rb index 92c8f52195..f2c1781418 100644 --- a/spec/bundler/commands/install_spec.rb +++ b/spec/bundler/commands/install_spec.rb @@ -1606,6 +1606,26 @@ RSpec.describe "bundle install with gem sources" do expect(out).to include("Fetching foo 1.0.1").and include("Installing foo 1.0.1").and include("Fetching b 1.0.0").and include("Installing b 1.0.0") expect(last_command).to be_success end + + it "resolves to the latest version if no gems are available locally" do + build_repo4 do + build_gem "myreline", "0.3.8" + build_gem "debug", "0.2.1" + + build_gem "debug", "1.10.0" do |s| + s.add_dependency "myreline" + end + end + + install_gemfile <<~G, "prefer-local": true, verbose: true + source "https://gem.repo4" + + gem "debug" + G + + expect(out).to include("Fetching debug 1.10.0").and include("Installing debug 1.10.0").and include("Fetching myreline 0.3.8").and include("Installing myreline 0.3.8") + expect(last_command).to be_success + end end context "with a symlinked configured as bundle path and a gem with symlinks" do