class Bundler::CompactIndexClient
Constants
- DEBUG_MUTEX
- GemParser
- SUPPORTED_DIGESTS
NOTE: MD5 is here not because we expect a server to respond with it, but because we use it to generate the etag on first request during the upgrade to the compact index client that uses opaque etags saved to files. Remove once 2.5.0 has been out for a while.
Attributes
directory[R]
Public Class Methods
debug()
click to toggle source
# File bundler/compact_index_client.rb, line 15 def self.debug return unless ENV["DEBUG_COMPACT_INDEX"] DEBUG_MUTEX.synchronize { warn("[#{self}] #{yield}") } end
new(directory, fetcher)
click to toggle source
# File bundler/compact_index_client.rb, line 28 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 @mutex = Thread::Mutex.new end
Public Instance Methods
dependencies(names)
click to toggle source
# File bundler/compact_index_client.rb, line 75 def dependencies(names) Bundler::CompactIndexClient.debug { "dependencies(#{names})" } execution_mode.call(names) do |name| update_info(name) @cache.dependencies(name).map {|d| d.unshift(name) } end.flatten(1) end
execution_mode()
click to toggle source
@return [Lambda] A lambda that takes an array of inputs and a block, and
maps the inputs with the block in parallel.
# File bundler/compact_index_client.rb, line 48 def execution_mode @execution_mode || sequentially end
execution_mode=(block)
click to toggle source
# File bundler/compact_index_client.rb, line 38 def execution_mode=(block) Bundler::CompactIndexClient.debug { "execution_mode=" } @endpoints = Set.new @execution_mode = block end
names()
click to toggle source
# File bundler/compact_index_client.rb, line 62 def names Bundler::CompactIndexClient.debug { "/names" } update("names", @cache.names_path, @cache.names_etag_path) @cache.names end
sequential_execution_mode!()
click to toggle source
# File bundler/compact_index_client.rb, line 52 def sequential_execution_mode! self.execution_mode = sequentially end
sequentially()
click to toggle source
# File bundler/compact_index_client.rb, line 56 def sequentially @sequentially ||= lambda do |inputs, &blk| inputs.map(&blk) end end
update_and_parse_checksums!()
click to toggle source
# File bundler/compact_index_client.rb, line 83 def update_and_parse_checksums! Bundler::CompactIndexClient.debug { "update_and_parse_checksums!" } return @info_checksums_by_name if @parsed_checksums update("versions", @cache.versions_path, @cache.versions_etag_path) @info_checksums_by_name = @cache.checksums @parsed_checksums = true end
versions()
click to toggle source
# File bundler/compact_index_client.rb, line 68 def versions Bundler::CompactIndexClient.debug { "/versions" } update("versions", @cache.versions_path, @cache.versions_etag_path) versions, @info_checksums_by_name = @cache.versions versions end
Private Instance Methods
synchronize() { || ... }
click to toggle source
# File bundler/compact_index_client.rb, line 122 def synchronize @mutex.synchronize { yield } end
update(remote_path, local_path, local_etag_path)
click to toggle source
# File bundler/compact_index_client.rb, line 93 def update(remote_path, local_path, local_etag_path) Bundler::CompactIndexClient.debug { "update(#{local_path}, #{remote_path})" } unless synchronize { @endpoints.add?(remote_path) } Bundler::CompactIndexClient.debug { "already fetched #{remote_path}" } return end @updater.update(url(remote_path), local_path, local_etag_path) end
update_info(name)
click to toggle source
# File bundler/compact_index_client.rb, line 102 def update_info(name) Bundler::CompactIndexClient.debug { "update_info(#{name})" } path = @cache.info_path(name) unless existing = @info_checksums_by_name[name] Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since it is missing from versions" } return end checksum = SharedHelpers.checksum_for_file(path, :MD5) if checksum == existing Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since the versions checksum matches the local checksum" } return end Bundler::CompactIndexClient.debug { "updating info for #{name} since the versions checksum #{existing} != the local checksum #{checksum}" } update("info/#{name}", path, @cache.info_etag_path(name)) end
url(path)
click to toggle source
# File bundler/compact_index_client.rb, line 118 def url(path) path end