summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rodríguez <[email protected]>2024-01-05 19:47:32 +0100
committerHiroshi SHIBATA <[email protected]>2024-01-11 13:51:52 +0900
commitef0705b3c2339055d9b5c669fb6192275c39020a (patch)
tree63904928ce9defd4b47ef98942e06edbc148b16e
parentb8f859f0bf21d67d962d12a99e1f2d7d2f20e3e5 (diff)
[rubygems/rubygems] Fix development dependency not being added if introduced by two gemspecs
https://github.com/rubygems/rubygems/commit/adc05bf1c3
-rw-r--r--lib/bundler/dsl.rb14
-rw-r--r--spec/bundler/commands/install_spec.rb29
2 files changed, 36 insertions, 7 deletions
diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb
index 1eca749617..1460b9f52f 100644
--- a/lib/bundler/dsl.rb
+++ b/lib/bundler/dsl.rb
@@ -102,9 +102,6 @@ module Bundler
# if there's already a dependency with this name we try to prefer one
if current = @dependencies.find {|d| d.name == dep.name }
- # Always prefer the dependency from the Gemfile
- @dependencies.delete(current) if current.gemspec_dev_dep?
-
if current.requirement != dep.requirement
current_requirement_open = current.requirements_list.include?(">= 0")
@@ -116,8 +113,6 @@ module Bundler
Bundler.ui.warn "A gemspec development dependency (#{gemspec_dep.name}, #{gemspec_dep.requirement}) is being overridden by a Gemfile dependency (#{gemfile_dep.name}, #{gemfile_dep.requirement}).\n" \
"This behaviour may change in the future. Please remove either of them, or make sure they both have the same requirement\n"
end
-
- return if dep.gemspec_dev_dep?
else
update_prompt = ""
@@ -135,8 +130,13 @@ module Bundler
"You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
"#{update_prompt}"
end
- elsif current.gemspec_dev_dep? || dep.gemspec_dev_dep?
- return if dep.gemspec_dev_dep?
+ end
+
+ # Always prefer the dependency from the Gemfile
+ if current.gemspec_dev_dep?
+ @dependencies.delete(current)
+ elsif dep.gemspec_dev_dep?
+ return
elsif current.source != dep.source
raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
"You specified that #{dep.name} (#{dep.requirement}) should come from " \
diff --git a/spec/bundler/commands/install_spec.rb b/spec/bundler/commands/install_spec.rb
index 7c016ff3d8..f0c9aaea8e 100644
--- a/spec/bundler/commands/install_spec.rb
+++ b/spec/bundler/commands/install_spec.rb
@@ -460,6 +460,35 @@ RSpec.describe "bundle install with gem sources" do
expect(the_bundle).to include_gems("rubocop 1.37.1")
end
+ it "includes the gem without warning if two gemspecs add it with the same requirement" do
+ gem1 = tmp.join("my-gem-1")
+ gem2 = tmp.join("my-gem-2")
+
+ build_lib "my-gem", path: gem1 do |s|
+ s.add_development_dependency "rubocop", "~> 1.36.0"
+ end
+
+ build_lib "my-gem-2", path: gem2 do |s|
+ s.add_development_dependency "rubocop", "~> 1.36.0"
+ end
+
+ build_repo4 do
+ build_gem "rubocop", "1.36.0"
+ end
+
+ gemfile <<~G
+ source "#{file_uri_for(gem_repo4)}"
+
+ gemspec path: "#{gem1}"
+ gemspec path: "#{gem2}"
+ G
+
+ bundle :install
+
+ expect(err).to be_empty
+ expect(the_bundle).to include_gems("rubocop 1.36.0")
+ end
+
it "warns when a Gemfile dependency is overriding a gemspec development dependency, with different requirements" do
build_lib "my-gem", path: bundled_app do |s|
s.add_development_dependency "rails", ">= 5"