Class: Bundler::Checksum::Store
- Inherits:
-
Object
- Object
- Bundler::Checksum::Store
- Defined in:
- lib/bundler/checksum.rb
Instance Method Summary collapse
-
#initialize ⇒ Store
constructor
A new instance of Store.
- #inspect ⇒ Object
- #merge!(other) ⇒ Object
- #register(spec, checksum) ⇒ Object
-
#replace(spec, checksum) ⇒ Object
Replace when the new checksum is from the same source.
- #to_lock(spec) ⇒ Object
Constructor Details
#initialize ⇒ Store
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
#inspect ⇒ Object
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 |