summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2022-02-09 17:11:52 +0100
committergit <svn-admin@ruby-lang.org>2022-02-11 18:20:20 +0900
commit7b676b3ce383c0b43a81694f80fbb424ee753213 (patch)
tree290fdcce68bee611b5d102ca7da3e5dd6e94ec2e
parent22bf6e43937a198b94230b7a496983bf816551c6 (diff)
[rubygems/rubygems] Fix corrupted lockfile when using `gemspec` and multiple sources
https://github.com/rubygems/rubygems/commit/9712262d90
-rw-r--r--lib/bundler/definition.rb3
-rw-r--r--lib/bundler/source_map.rb17
-rw-r--r--spec/bundler/commands/check_spec.rb63
3 files changed, 80 insertions, 3 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index 77f065c5c7..20b5340203 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -786,6 +786,7 @@ module Bundler
else
{ :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
end
+ source_requirements.merge!(source_map.locked_requirements) unless @remote
metadata_dependencies.each do |dep|
source_requirements[dep.name] = sources.metadata_source
end
@@ -832,7 +833,7 @@ module Bundler
end
def source_map
- @source_map ||= SourceMap.new(sources, dependencies)
+ @source_map ||= SourceMap.new(sources, dependencies, @locked_specs)
end
end
end
diff --git a/lib/bundler/source_map.rb b/lib/bundler/source_map.rb
index a554f26f76..ca73e01f9d 100644
--- a/lib/bundler/source_map.rb
+++ b/lib/bundler/source_map.rb
@@ -2,11 +2,12 @@
module Bundler
class SourceMap
- attr_reader :sources, :dependencies
+ attr_reader :sources, :dependencies, :locked_specs
- def initialize(sources, dependencies)
+ def initialize(sources, dependencies, locked_specs)
@sources = sources
@dependencies = dependencies
+ @locked_specs = locked_specs
end
def pinned_spec_names(skip = nil)
@@ -54,5 +55,17 @@ module Bundler
requirements
end
end
+
+ def locked_requirements
+ @locked_requirements ||= begin
+ requirements = {}
+ locked_specs.each do |locked_spec|
+ source = locked_spec.source
+ source.add_dependency_names(locked_spec.name)
+ requirements[locked_spec.name] = source
+ end
+ requirements
+ end
+ end
end
end
diff --git a/spec/bundler/commands/check_spec.rb b/spec/bundler/commands/check_spec.rb
index e0c9a04c25..b4996977c1 100644
--- a/spec/bundler/commands/check_spec.rb
+++ b/spec/bundler/commands/check_spec.rb
@@ -431,6 +431,69 @@ RSpec.describe "bundle check" do
end
end
+ context "with gemspec directive and scoped sources" do
+ before do
+ build_repo4 do
+ build_gem "awesome_print"
+ end
+
+ build_repo2 do
+ build_gem "dex-dispatch-engine"
+ end
+
+ build_lib("bundle-check-issue", :path => tmp.join("bundle-check-issue")) do |s|
+ s.write "Gemfile", <<-G
+ source "https://localgemserver.test"
+
+ gemspec
+
+ source "https://localgemserver.test/extra" do
+ gem "dex-dispatch-engine"
+ end
+ G
+
+ s.add_dependency "awesome_print"
+ end
+
+ bundle "install", :artifice => "compact_index_extra", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }, :dir => tmp.join("bundle-check-issue")
+ end
+
+ it "does not corrupt lockfile when changing version" do
+ version_file = tmp.join("bundle-check-issue/bundle-check-issue.gemspec")
+ File.write(version_file, File.read(version_file).gsub(/s\.version = .+/, "s.version = '9999'"))
+
+ bundle "check --verbose", :dir => tmp.join("bundle-check-issue")
+
+ expect(File.read(tmp.join("bundle-check-issue/Gemfile.lock"))).to eq <<~L
+ PATH
+ remote: .
+ specs:
+ bundle-check-issue (9999)
+ awesome_print
+
+ GEM
+ remote: https://localgemserver.test/
+ specs:
+ awesome_print (1.0)
+
+ GEM
+ remote: https://localgemserver.test/extra/
+ specs:
+ dex-dispatch-engine (1.0)
+
+ PLATFORMS
+ #{lockfile_platforms}
+
+ DEPENDENCIES
+ bundle-check-issue!
+ dex-dispatch-engine!
+
+ BUNDLED WITH
+ #{Bundler::VERSION}
+ L
+ end
+ end
+
describe "BUNDLED WITH" do
def lock_with(bundler_version = nil)
lock = <<~L