diff options
author | Nicolas Pitre <nico@cam.org> | 2006-03-17 22:45:07 -0500 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-03-17 20:42:39 -0800 |
commit | 5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a (patch) | |
tree | 233d5a766950b776511d088ea7e96d09f0ec8d54 | |
parent | 71bb10336fa79ff667f4753668aaa72b6ebfc689 (diff) | |
download | git-5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a.tar.gz git-5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a.tar.xz |
3% tighter packs for free
This patch makes for 3.4% smaller pack with the git repository, and
a bit more than 3% smaller pack with the kernel repository.
And so with _no_ measurable CPU difference.
Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | diff-delta.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/diff-delta.c b/diff-delta.c index aaee7be4d..1188b31cd 100644 --- a/diff-delta.c +++ b/diff-delta.c @@ -136,7 +136,8 @@ void *diff_delta(void *from_buf, unsigned long from_size, unsigned long *delta_size, unsigned long max_size) { - unsigned int i, outpos, outsize, inscnt, hash_shift; + unsigned int i, outpos, outsize, hash_shift; + int inscnt; const unsigned char *ref_data, *ref_top, *data, *top; unsigned char *out; struct index *entry, **hash; @@ -222,6 +223,20 @@ void *diff_delta(void *from_buf, unsigned long from_size, unsigned char *op; if (inscnt) { + while (moff && ref_data[moff-1] == data[-1]) { + if (msize == 0x10000) + break; + /* we can match one byte back */ + msize++; + moff--; + data--; + outpos--; + if (--inscnt) + continue; + outpos--; /* remove count slot */ + inscnt--; /* make it -1 */ + break; + } out[outpos - inscnt - 1] = inscnt; inscnt = 0; } |