summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2025-02-11 16:25:45 +0100
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2025-02-13 09:37:51 +0900
commitee03df26bad92abb5397a82be3bc385a9ef69b5a (patch)
tree336250ac1b03ada273bcd76ec047c9e76f32a94e
parent151b436c9d52e879e38f40cfcbcc3e516b9b439d (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.rb13
-rw-r--r--spec/bundler/commands/install_spec.rb20
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