Skip to content

Commit d116a45

Browse files
author
Linus Torvalds
committed
Add "--depth=N" parameter to git-pack-objects to limit maximum delta depth
It too defaults to 10. A nice round random number.
1 parent f846bbf commit d116a45

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

pack-objects.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
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

77
enum 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)
363366
int 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

Comments
 (0)