diff options
| author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2025-02-11 16:25:45 +0100 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-02-13 09:37:51 +0900 |
| commit | ee03df26bad92abb5397a82be3bc385a9ef69b5a (patch) | |
| tree | 336250ac1b03ada273bcd76ec047c9e76f32a94e | |
| parent | 151b436c9d52e879e38f40cfcbcc3e516b9b439d (diff) | |
[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
| -rw-r--r-- | lib/bundler/resolver.rb | 13 | ||||
| -rw-r--r-- | 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 |
