blob: 1d8db7d78fabb1455813796c02245370015e53b4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# frozen_string_literal: true
require 'openssl'
module BundlerChecksum::Command
module Init
extend self
def execute
$stderr.puts "Initializing checksum file #{checksum_file}"
checksums = []
compact_index_cache = Bundler::Fetcher::CompactIndex
.new(nil, Bundler::Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org")), nil)
.send(:compact_index_client)
.instance_variable_get(:@cache)
Bundler.definition.resolve.sort_by(&:name).each do |spec|
next unless spec.source.is_a?(Bundler::Source::Rubygems)
spec_identifier = "#{spec.name}==#{spec.version}"
previous_checksum = previous_checksums.select do |checksum|
checksum[:name] == spec.name && checksum[:version] == spec.version.to_s
end
if !previous_checksum.empty?
$stderr.puts "Using #{spec_identifier}"
checksums += previous_checksum
next
end
$stderr.puts "Adding #{spec_identifier}"
compact_index_dependencies = compact_index_cache.dependencies(spec.name).select { |item| item.first == spec.version.to_s }
if !compact_index_dependencies.empty?
compact_index_checksums = compact_index_dependencies.map do |version, platform, dependencies, requirements|
{
name: spec.name,
version: spec.version.to_s,
platform: Gem::Platform.new(platform).to_s,
checksum: requirements.detect { |requirement| requirement.first == 'checksum' }.flatten[1]
}
end
checksums += compact_index_checksums.sort_by { |hash| hash.values }
else
remote_checksum = Helper.remote_checksums_for_gem(spec.name, spec.version)
if remote_checksum.empty?
raise "#{spec.name} #{spec.version} not found on Rubygems!"
end
checksums += remote_checksum.sort_by { |hash| hash.values }
end
end
File.write(checksum_file, JSON.generate(checksums, array_nl: "\n") + "\n")
end
private
def previous_checksums
@previous_checksums ||=
if File.exist?(checksum_file)
::BundlerChecksum.checksums_from_file
else
[]
end
end
def checksum_file
::BundlerChecksum.checksum_file
end
def lockfile
lockfile_path = Bundler.default_lockfile
lockfile = Bundler::LockfileParser.new(Bundler.read_file(lockfile_path))
end
end
end
|