@@ -266,7 +266,7 @@ impl super::Store {
266
266
Option :: as_ref ( & files_guard) . expect ( "slot is set or we wouldn't know it points to this file" ) ;
267
267
if index_info. is_multi_index ( ) && files. mtime ( ) != mtime {
268
268
// 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,
270
270
// and later free the slot or dispose of the index in the slot (like we do for removed/missing files).
271
271
index_paths_to_add. push_back ( ( index_info, mtime, Some ( slot_idx) ) ) ;
272
272
// 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 {
304
304
needed : index_paths_to_add. len ( ) + 1 , /*the one currently popped off*/
305
305
} ) ;
306
306
}
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
+ }
307
313
let slot_index = next_possibly_free_index;
308
314
let slot = & self . files [ slot_index] ;
309
315
next_possibly_free_index = ( next_possibly_free_index + 1 ) % self . files . len ( ) ;
@@ -502,7 +508,7 @@ impl super::Store {
502
508
}
503
509
// Unlike libgit2, do not sort by modification date, but by size and put the biggest indices first. That way
504
510
// 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.
506
512
// NOTE: this will work well for well-packed repos or those using geometric repacking, but force us to open a lot
507
513
// of files when dealing with new objects, as there is no notion of recency here as would be with unmaintained
508
514
// repositories. Different algorithms should be provided, like newest packs first, and possibly a mix of both
@@ -512,7 +518,7 @@ impl super::Store {
512
518
Ok ( indices_by_modification_time)
513
519
}
514
520
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.
516
522
#[ allow( clippy:: too_many_arguments) ]
517
523
fn try_set_index_slot (
518
524
lock : & parking_lot:: MutexGuard < ' _ , ( ) > ,
0 commit comments