@@ -3314,50 +3314,6 @@ static int should_attempt_deltas(struct object_entry *entry)
3314
3314
return 1 ;
3315
3315
}
3316
3316
3317
- static void find_deltas_for_region (struct object_entry * list UNUSED ,
3318
- struct packing_region * region ,
3319
- unsigned int * processed )
3320
- {
3321
- struct object_entry * * delta_list ;
3322
- uint32_t delta_list_nr = 0 ;
3323
-
3324
- ALLOC_ARRAY (delta_list , region -> nr );
3325
- for (uint32_t i = 0 ; i < region -> nr ; i ++ ) {
3326
- struct object_entry * entry = to_pack .objects + region -> start + i ;
3327
- if (should_attempt_deltas (entry ))
3328
- delta_list [delta_list_nr ++ ] = entry ;
3329
- }
3330
-
3331
- QSORT (delta_list , delta_list_nr , type_size_sort );
3332
- find_deltas (delta_list , & delta_list_nr , window , depth , processed );
3333
- free (delta_list );
3334
- }
3335
-
3336
- static void find_deltas_by_region (struct object_entry * list ,
3337
- struct packing_region * regions ,
3338
- uint32_t start , uint32_t nr )
3339
- {
3340
- unsigned int processed = 0 ;
3341
- uint32_t progress_nr ;
3342
-
3343
- if (!nr )
3344
- return ;
3345
-
3346
- progress_nr = regions [nr - 1 ].start + regions [nr - 1 ].nr ;
3347
-
3348
- if (progress )
3349
- progress_state = start_progress (_ ("Compressing objects by path" ),
3350
- progress_nr );
3351
-
3352
- while (nr -- )
3353
- find_deltas_for_region (list ,
3354
- & regions [start ++ ],
3355
- & processed );
3356
-
3357
- display_progress (progress_state , progress_nr );
3358
- stop_progress (& progress_state );
3359
- }
3360
-
3361
3317
static void prepare_pack (int window , int depth )
3362
3318
{
3363
3319
struct object_entry * * delta_list ;
@@ -3382,10 +3338,6 @@ static void prepare_pack(int window, int depth)
3382
3338
if (!to_pack .nr_objects || !window || !depth )
3383
3339
return ;
3384
3340
3385
- if (path_walk )
3386
- find_deltas_by_region (to_pack .objects , to_pack .regions ,
3387
- 0 , to_pack .nr_regions );
3388
-
3389
3341
ALLOC_ARRAY (delta_list , to_pack .nr_objects );
3390
3342
nr_deltas = n = 0 ;
3391
3343
@@ -4341,8 +4293,10 @@ static int add_objects_by_path(const char *path,
4341
4293
enum object_type type ,
4342
4294
void * data )
4343
4295
{
4296
+ struct object_entry * * delta_list ;
4344
4297
size_t oe_start = to_pack .nr_objects ;
4345
4298
size_t oe_end ;
4299
+ unsigned int sub_list_size ;
4346
4300
unsigned int * processed = data ;
4347
4301
4348
4302
/*
@@ -4375,17 +4329,32 @@ static int add_objects_by_path(const char *path,
4375
4329
if (oe_end == oe_start || !window )
4376
4330
return 0 ;
4377
4331
4378
- ALLOC_GROW (to_pack .regions ,
4379
- to_pack .nr_regions + 1 ,
4380
- to_pack .nr_regions_alloc );
4332
+ sub_list_size = 0 ;
4333
+ ALLOC_ARRAY (delta_list , oe_end - oe_start );
4381
4334
4382
- to_pack .regions [to_pack .nr_regions ].start = oe_start ;
4383
- to_pack .regions [to_pack .nr_regions ].nr = oe_end - oe_start ;
4384
- to_pack .nr_regions ++ ;
4335
+ for (size_t i = 0 ; i < oe_end - oe_start ; i ++ ) {
4336
+ struct object_entry * entry = to_pack .objects + oe_start + i ;
4385
4337
4386
- * processed += oids -> nr ;
4387
- display_progress ( progress_state , * processed ) ;
4338
+ if (! should_attempt_deltas ( entry ))
4339
+ continue ;
4388
4340
4341
+ delta_list [sub_list_size ++ ] = entry ;
4342
+ }
4343
+
4344
+ /*
4345
+ * Find delta bases among this list of objects that all match the same
4346
+ * path. This causes the delta compression to be interleaved in the
4347
+ * object walk, which can lead to confusing progress indicators. This is
4348
+ * also incompatible with threaded delta calculations. In the future,
4349
+ * consider creating a list of regions in the full to_pack.objects array
4350
+ * that could be picked up by the threaded delta computation.
4351
+ */
4352
+ if (sub_list_size && window ) {
4353
+ QSORT (delta_list , sub_list_size , type_size_sort );
4354
+ find_deltas (delta_list , & sub_list_size , window , depth , processed );
4355
+ }
4356
+
4357
+ free (delta_list );
4389
4358
return 0 ;
4390
4359
}
4391
4360
0 commit comments