summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2006-03-18 03:45:07 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-03-18 04:42:39 (GMT)
commit5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a (patch)
tree233d5a766950b776511d088ea7e96d09f0ec8d54
parent71bb10336fa79ff667f4753668aaa72b6ebfc689 (diff)
downloadgit-5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a.zip
git-5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a.tar.gz
git-5a1fb2ca92caaa7ae9044ab81dc102f59d17b97a.tar.bz2
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.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/diff-delta.c b/diff-delta.c
index aaee7be..1188b31 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;
}