From: Nicolas Pitre Date: Sat, 18 Mar 2006 03:45:07 +0000 (-0500) Subject: 3% tighter packs for free X-Git-Tag: v1.3.0-rc1~22^2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a;p=git.git 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 Signed-off-by: Junio C Hamano --- 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; }