diff options
author | Brian Downing <bdowning@lavos.net> | 2007-07-08 23:45:21 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-07-08 23:48:17 -0700 |
commit | 848d732c10616269886d0b9c82e434b65ffc33f0 (patch) | |
tree | 8b870e4121957b3c81be9d8beb86593e2e7fe672 | |
parent | 1ed84157a21a3e868228b15588e4aadfbe5a030b (diff) | |
download | git-848d732c10616269886d0b9c82e434b65ffc33f0.tar.gz git-848d732c10616269886d0b9c82e434b65ffc33f0.tar.xz |
pack-objects: Prefer shallower deltas if the size is equal
Change "try_delta" so that if it finds a delta that has the same size
but shallower depth than the existing delta, it will prefer the
shallower one. This makes certain delta trees vastly less deep.
Signed-off-by: Brian Downing <bdowning@lavos.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-pack-objects.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index 3d396ca37..54b9d268d 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -1337,7 +1337,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, if (max_size == 0) return 0; if (trg_entry->delta && trg_entry->delta_size <= max_size) - max_size = trg_entry->delta_size-1; + max_size = trg_entry->delta_size; src_size = src_entry->size; sizediff = src_size < trg_size ? trg_size - src_size : 0; if (sizediff >= max_size) @@ -1371,6 +1371,12 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, return 0; if (trg_entry->delta_data) { + /* Prefer only shallower same-sized deltas. */ + if (delta_size == trg_entry->delta_size && + src_entry->depth + 1 >= trg_entry->depth) { + free(delta_buf); + return 0; + } delta_cache_size -= trg_entry->delta_size; free(trg_entry->delta_data); } |