Fix delta "sliding window" code
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 26 Jun 2005 01:29:23 +0000 (18:29 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 26 Jun 2005 01:29:23 +0000 (18:29 -0700)
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.

pack-objects.c

index 68c7e592b51b2174390bf9ab17e7dec7a9841d52..dfa9d44a15625d71a93418c2c5bd996441c79506 100644 (file)
@@ -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;