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
|
# frozen_string_literal: true
require "pathname"
require "set"
class Bundler::CompactIndexClient
class Error < StandardError; end
require "bundler/vendor/compact_index_client/lib/compact_index_client/cache"
require "bundler/vendor/compact_index_client/lib/compact_index_client/updater"
require "bundler/vendor/compact_index_client/lib/compact_index_client/version"
attr_reader :directory
# @return [Lambda] A lambda that takes an array of inputs and a block, and
# maps the inputs with the block in parallel.
#
attr_accessor :in_parallel
def initialize(directory, fetcher)
@directory = Pathname.new(directory)
@updater = Updater.new(fetcher)
@cache = Cache.new(@directory)
@endpoints = Set.new
@info_checksums_by_name = {}
@parsed_checksums = false
@in_parallel = lambda do |inputs, &blk|
inputs.map(&blk)
end
end
def names
update(@cache.names_path, "names")
@cache.names
end
def versions
update(@cache.versions_path, "versions")
versions, @info_checksums_by_name = @cache.versions
versions
end
def dependencies(names)
in_parallel.call(names) do |name|
update_info(name)
@cache.dependencies(name).map {|d| d.unshift(name) }
end.flatten(1)
end
def spec(name, version, platform = nil)
update_info(name)
@cache.specific_dependency(name, version, platform)
end
def update_and_parse_checksums!
return @info_checksums_by_name if @parsed_checksums
update(@cache.versions_path, "versions")
@info_checksums_by_name = @cache.checksums
@parsed_checksums = true
end
private
def update(local_path, remote_path)
return if @endpoints.include?(remote_path)
@updater.update(local_path, url(remote_path))
@endpoints << remote_path
end
def update_info(name)
path = @cache.info_path(name)
checksum = @updater.checksum_for_file(path)
return unless existing = @info_checksums_by_name[name]
return if checksum == existing
update(path, "info/#{name}")
end
def url(path)
path
end
end
|