diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 18:29:23 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 18:29:23 -0700 |
commit | 78817c15de0dfb408d1e35a2f692f54dc51e80a3 (patch) | |
tree | 35370170f660f0fd308f7d45a510e5176b839903 | |
parent | [PATCH] (patchlet) pack-objects.c: try_delta() (diff) | |
download | tgif-78817c15de0dfb408d1e35a2f692f54dc51e80a3.tar.xz |
Fix delta "sliding window" code
When Junio fixed the lack of a successful error code from try_delta(),
that uncovered an off-by-one error in the caller.
Also, some testing made it clear that we now find a lot more deltas,
because we used to (incorrectly) break early on bogus "failure"
cases.
-rw-r--r-- | pack-objects.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/pack-objects.c b/pack-objects.c index 68c7e592b5..dfa9d44a15 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -344,11 +344,12 @@ static void find_deltas(struct object_entry **list, int window) n->data = read_sha1_file(entry->sha1, type, &size); if (size != entry->size) die("object %s inconsistent object length (%lu vs %lu)", sha1_to_hex(entry->sha1), size, entry->size); - for (j = 0; j < window; j++) { - unsigned int other_idx = idx - 1 - j; + j = window; + while (--j > 0) { + unsigned int other_idx = idx + j; struct unpacked *m; - if (other_idx < 0) - other_idx += window; + if (other_idx >= window) + other_idx -= window; m = array + other_idx; if (!m->entry) break; |