class Bundler::Checksum::Store
Attributes
store[R]
Public Class Methods
new()
click to toggle source
# File bundler/checksum.rb, line 170 def initialize @store = {} @store_mutex = Mutex.new end
Public Instance Methods
inspect()
click to toggle source
# File bundler/checksum.rb, line 175 def inspect "#<#{self.class}:#{object_id} size=#{store.size}>" end
merge!(other)
click to toggle source
# File bundler/checksum.rb, line 210 def merge!(other) other.store.each do |lock_name, checksums| checksums.each do |_algo, checksum| register_checksum(lock_name, checksum) end end end
register(spec, checksum)
click to toggle source
# File bundler/checksum.rb, line 204 def register(spec, checksum) return unless checksum register_checksum(spec.name_tuple.lock_name, checksum) end
replace(spec, checksum)
click to toggle source
Replace when the new checksum is from the same source. The primary purpose is registering checksums from gems where there are duplicates of the same gem (according to full_name) in the index.
In particular, this is when 2 gems have two similar platforms, e.g. “darwin20” and “darwin-20”, both of which resolve to darwin-20. In the Index
, the later gem replaces the former, so we do that here.
However, if the new checksum is from a different source, we register like normal. This ensures a mismatch error where there are multiple top level sources that contain the same gem with different checksums.
# File bundler/checksum.rb, line 190 def replace(spec, checksum) return unless checksum lock_name = spec.name_tuple.lock_name @store_mutex.synchronize do existing = fetch_checksum(lock_name, checksum.algo) if !existing || existing.same_source?(checksum) store_checksum(lock_name, checksum) else merge_checksum(lock_name, checksum, existing) end end end
to_lock(spec)
click to toggle source
# File bundler/checksum.rb, line 218 def to_lock(spec) lock_name = spec.name_tuple.lock_name checksums = @store[lock_name] if checksums "#{lock_name} #{checksums.values.map(&:to_lock).sort.join(",")}" else lock_name end end
Private Instance Methods
fetch_checksum(lock_name, algo)
click to toggle source
# File bundler/checksum.rb, line 249 def fetch_checksum(lock_name, algo) @store[lock_name]&.fetch(algo, nil) end
merge_checksum(lock_name, checksum, existing)
click to toggle source
# File bundler/checksum.rb, line 241 def merge_checksum(lock_name, checksum, existing) existing.merge!(checksum) || raise(ChecksumMismatchError.new(lock_name, existing, checksum)) end
register_checksum(lock_name, checksum)
click to toggle source
# File bundler/checksum.rb, line 230 def register_checksum(lock_name, checksum) @store_mutex.synchronize do existing = fetch_checksum(lock_name, checksum.algo) if existing merge_checksum(lock_name, checksum, existing) else store_checksum(lock_name, checksum) end end end
store_checksum(lock_name, checksum)
click to toggle source
# File bundler/checksum.rb, line 245 def store_checksum(lock_name, checksum) (@store[lock_name] ||= {})[checksum.algo] = checksum end