@@ -266,7 +266,7 @@ impl super::Store {
266266 Option :: as_ref ( & files_guard) . expect ( "slot is set or we wouldn't know it points to this file" ) ;
267267 if index_info. is_multi_index ( ) && files. mtime ( ) != mtime {
268268 // we have a changed multi-pack index. We can't just change the existing slot as it may alter slot indices
269- // that are currently available. Instead we have to move what's there into a new slot, along with the changes,
269+ // that are currently available. Instead, we have to move what's there into a new slot, along with the changes,
270270 // and later free the slot or dispose of the index in the slot (like we do for removed/missing files).
271271 index_paths_to_add. push_back ( ( index_info, mtime, Some ( slot_idx) ) ) ;
272272 // If the current slot is loaded, the soon-to-be copied multi-index path will be loaded as well.
@@ -304,6 +304,12 @@ impl super::Store {
304304 needed : index_paths_to_add. len ( ) + 1 , /*the one currently popped off*/
305305 } ) ;
306306 }
307+ // Don't allow duplicate indicates, we need a 1:1 mapping.
308+ if new_slot_map_indices. contains ( & next_possibly_free_index) {
309+ next_possibly_free_index = ( next_possibly_free_index + 1 ) % self . files . len ( ) ;
310+ num_indices_checked += 1 ;
311+ continue ' increment_slot_index;
312+ }
307313 let slot_index = next_possibly_free_index;
308314 let slot = & self . files [ slot_index] ;
309315 next_possibly_free_index = ( next_possibly_free_index + 1 ) % self . files . len ( ) ;
@@ -502,7 +508,7 @@ impl super::Store {
502508 }
503509 // Unlike libgit2, do not sort by modification date, but by size and put the biggest indices first. That way
504510 // the chance to hit an object should be higher. We leave it to the handle to sort by LRU.
505- // Git itself doesn't change the order which may safe time, but we want it to be stable which also helps some tests.
511+ // Git itself doesn't change the order which may save time, but we want it to be stable which also helps some tests.
506512 // NOTE: this will work well for well-packed repos or those using geometric repacking, but force us to open a lot
507513 // of files when dealing with new objects, as there is no notion of recency here as would be with unmaintained
508514 // repositories. Different algorithms should be provided, like newest packs first, and possibly a mix of both
@@ -512,7 +518,7 @@ impl super::Store {
512518 Ok ( indices_by_modification_time)
513519 }
514520
515- /// returns Ok<dest slot was empty> if the copy could happen because dest-slot was actually free or disposable , and Some(true) if it was empty
521+ /// returns `Ok(dest_slot_was_empty)` if the copy could happen because dest-slot was actually free or disposable.
516522 #[ allow( clippy:: too_many_arguments) ]
517523 fn try_set_index_slot (
518524 lock : & parking_lot:: MutexGuard < ' _ , ( ) > ,
0 commit comments