22#include "object.h"
33#include "delta.h"
44
5- static const char pack_usage [] = "git-pack-objects [--window=N] base-name < object-list" ;
5+ static const char pack_usage [] = "git-pack-objects [--window=N] [--depth=N] base-name < object-list" ;
66
77enum object_type {
88 OBJ_NONE ,
@@ -286,7 +286,7 @@ struct unpacked {
286286 * going to be even smaller or of a different type. So return -1
287287 * once we determine that there's no point even trying.
288288 */
289- static int try_delta (struct unpacked * cur , struct unpacked * old )
289+ static int try_delta (struct unpacked * cur , struct unpacked * old , unsigned max_depth )
290290{
291291 struct object_entry * cur_entry = cur -> entry ;
292292 struct object_entry * old_entry = old -> entry ;
@@ -305,6 +305,8 @@ static int try_delta(struct unpacked *cur, struct unpacked *old)
305305 oldsize = old_entry -> size ;
306306 if (size - oldsize > oldsize / 4 )
307307 return -1 ;
308+ if (old_entry -> depth >= max_depth )
309+ return 0 ;
308310
309311 /*
310312 * NOTE!
@@ -321,11 +323,12 @@ static int try_delta(struct unpacked *cur, struct unpacked *old)
321323 return 0 ;
322324 cur_entry -> delta = old_entry ;
323325 cur_entry -> delta_size = delta_size ;
326+ cur_entry -> depth = old_entry -> depth + 1 ;
324327 free (delta_buf );
325328 return 0 ;
326329}
327330
328- static void find_deltas (struct object_entry * * list , int window )
331+ static void find_deltas (struct object_entry * * list , int window , int depth )
329332{
330333 unsigned int i ;
331334 unsigned int array_size = window * sizeof (struct unpacked );
@@ -354,7 +357,7 @@ static void find_deltas(struct object_entry **list, int window)
354357 m = array + other_idx ;
355358 if (!m -> entry )
356359 break ;
357- if (try_delta (n , m ) < 0 )
360+ if (try_delta (n , m , depth ) < 0 )
358361 break ;
359362 }
360363 }
@@ -363,7 +366,7 @@ static void find_deltas(struct object_entry **list, int window)
363366int main (int argc , char * * argv )
364367{
365368 char line [128 ];
366- int window = 10 ;
369+ int window = 10 , depth = 10 ;
367370 int i ;
368371
369372 for (i = 1 ; i < argc ; i ++ ) {
@@ -377,6 +380,13 @@ int main(int argc, char **argv)
377380 usage (pack_usage );
378381 continue ;
379382 }
383+ if (!strncmp ("--depth=" , arg , 8 )) {
384+ char * end ;
385+ depth = strtoul (arg + 8 , & end , 0 );
386+ if (!arg [8 ] || * end )
387+ usage (pack_usage );
388+ continue ;
389+ }
380390 usage (pack_usage );
381391 }
382392 if (base_name )
@@ -399,8 +409,8 @@ int main(int argc, char **argv)
399409
400410 sorted_by_sha = create_sorted_list (sha1_sort );
401411 sorted_by_type = create_sorted_list (type_size_sort );
402- if (window )
403- find_deltas (sorted_by_type , window + 1 );
412+ if (window && depth )
413+ find_deltas (sorted_by_type , window + 1 , depth );
404414
405415 write_pack_file ();
406416 write_index_file ();
0 commit comments