Skip to content

Commit 44f4b15

Browse files
authored
Merge pull request #9366 from Shopify/ec-bundler-checksum
Lock the checksum of Bundler itself in the lockfile
2 parents e3685c9 + 9ce52a2 commit 44f4b15

6 files changed

Lines changed: 33 additions & 4 deletions

File tree

bundler/lib/bundler/definition.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -988,6 +988,8 @@ def converge_sources
988988
end
989989
end
990990

991+
sources.metadata_source.checksum_store.merge!(@locked_gems.metadata_source.checksum_store) if @locked_gems
992+
991993
changes
992994
end
993995

bundler/lib/bundler/lockfile_generator.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def add_checksums
7171
checksums = definition.resolve.map do |spec|
7272
spec.source.checksum_store.to_lock(spec)
7373
end
74-
add_section("CHECKSUMS", checksums)
74+
75+
add_section("CHECKSUMS", checksums + bundler_checksum)
7576
end
7677

7778
def add_locked_ruby_version
@@ -100,5 +101,17 @@ def add_section(name, value)
100101
raise ArgumentError, "#{value.inspect} can't be serialized in a lockfile"
101102
end
102103
end
104+
105+
def bundler_checksum
106+
return [] if Bundler.gem_version.to_s.end_with?(".dev")
107+
108+
require "rubygems/package"
109+
110+
bundler_spec = definition.sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last
111+
package = Gem::Package.new(bundler_spec.cache_file)
112+
definition.sources.metadata_source.checksum_store.register(bundler_spec, Checksum.from_gem_package(package))
113+
114+
[definition.sources.metadata_source.checksum_store.to_lock(bundler_spec)]
115+
end
103116
end
104117
end

bundler/lib/bundler/lockfile_parser.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def to_s
2828

2929
attr_reader(
3030
:sources,
31+
:metadata_source,
3132
:dependencies,
3233
:specs,
3334
:platforms,
@@ -97,6 +98,7 @@ def self.bundled_with
9798
def initialize(lockfile, strict: false)
9899
@platforms = []
99100
@sources = []
101+
@metadata_source = Source::Metadata.new
100102
@dependencies = {}
101103
@parse_method = nil
102104
@specs = {}
@@ -252,7 +254,12 @@ def parse_checksum(line)
252254
version = Gem::Version.new(version)
253255
platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
254256
full_name = Gem::NameTuple.new(name, version, platform).full_name
255-
return unless spec = @specs[full_name]
257+
spec = @specs[full_name]
258+
259+
if name == "bundler"
260+
spec ||= LazySpecification.new(name, version, platform, @metadata_source)
261+
end
262+
return unless spec
256263

257264
if checksums
258265
checksums.split(",") do |lock_checksum|

bundler/lib/bundler/source/metadata.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ def hash
5858
def version_message(spec)
5959
"#{spec.name} #{spec.version}"
6060
end
61+
62+
def checksum_store
63+
@checksum_store ||= Checksum::Store.new
64+
end
6165
end
6266
end
6367
end

bundler/spec/commands/update_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,6 +1537,7 @@
15371537

15381538
checksums = checksums_section do |c|
15391539
c.checksum(gem_repo4, "myrack", "1.0")
1540+
c.checksum(gem_repo4, "bundler", "999.0.0")
15401541
end
15411542

15421543
install_gemfile <<-G
@@ -1621,6 +1622,7 @@
16211622

16221623
checksums = checksums_section do |c|
16231624
c.checksum(gem_repo4, "myrack", "1.0")
1625+
c.checksum(gem_repo4, "bundler", "9.9.9")
16241626
end
16251627

16261628
install_gemfile <<-G
@@ -1745,6 +1747,7 @@
17451747
# Only updates properly on modern RubyGems.
17461748
checksums = checksums_section_when_enabled do |c|
17471749
c.checksum(gem_repo4, "myrack", "1.0")
1750+
c.checksum(local_gem_path, "bundler", "9.0.0", Gem::Platform::RUBY, "cache")
17481751
end
17491752

17501753
expect(lockfile).to eq <<~L

bundler/spec/support/checksums.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ def initialize_copy(original)
1414
@checksums = @checksums.dup
1515
end
1616

17-
def checksum(repo, name, version, platform = Gem::Platform::RUBY)
17+
def checksum(repo, name, version, platform = Gem::Platform::RUBY, folder = "gems")
1818
name_tuple = Gem::NameTuple.new(name, version, platform)
19-
gem_file = File.join(repo, "gems", "#{name_tuple.full_name}.gem")
19+
gem_file = File.join(repo, folder, "#{name_tuple.full_name}.gem")
2020
File.open(gem_file, "rb") do |f|
2121
register(name_tuple, Bundler::Checksum.from_gem(f, "#{gem_file} (via ChecksumsBuilder#checksum)"))
2222
end

0 commit comments

Comments
 (0)