Class: Bundler::Checksum::Store

Inherits:
Object
  • Object
show all
Defined in:
lib/bundler/checksum.rb

Instance Method Summary collapse

Constructor Details

#initializeStore

Returns a new instance of Store.



170
171
172
173
# File 'lib/bundler/checksum.rb', line 170

def initialize
  @store = {}
  @store_mutex = Mutex.new
end

Instance Method Details

#inspectObject



175
176
177
# File 'lib/bundler/checksum.rb', line 175

def inspect
  "#<#{self.class}:#{object_id} size=#{store.size}>"
end

#merge!(other) ⇒ Object



210
211
212
213
214
215
216
# File 'lib/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) ⇒ Object



204
205
206
207
208
# File 'lib/bundler/checksum.rb', line 204

def register(spec, checksum)
  return unless checksum

  register_checksum(spec.name_tuple.lock_name, checksum)
end

#replace(spec, checksum) ⇒ Object

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.



190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/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) ⇒ Object



218
219
220
221
222
223
224
225
226
# File 'lib/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