Merge branch 'jc/delta' into next
[gitweb.git] / pack-objects.c
index dd40a0307085e4180f922ea9884f12c82cb32463..d6a3463604bf3e61d8cf8b7d55947c229def8f07 100644 (file)
@@ -99,7 +99,7 @@ static int reused_delta = 0;
 
 static int pack_revindex_ix(struct packed_git *p)
 {
-       unsigned int ui = (unsigned int) p;
+       unsigned long ui = (unsigned long)p;
        int i;
 
        ui = ui ^ (ui >> 16); /* defeat structure alignment */
@@ -204,7 +204,7 @@ static void *delta_against(void *buf, unsigned long size, struct object_entry *e
        if (!otherbuf)
                die("unable to read %s", sha1_to_hex(entry->delta->sha1));
         delta_buf = diff_delta(otherbuf, othersize,
-                              buf, size, &delta_size, 0);
+                              buf, size, &delta_size, 0, NULL);
         if (!delta_buf || delta_size != entry->delta_size)
                die("delta size changed");
         free(buf);
@@ -768,7 +768,7 @@ static int sha1_sort(const struct object_entry *a, const struct object_entry *b)
        return memcmp(a->sha1, b->sha1, 20);
 }
 
-static struct object_entry **create_final_object_list()
+static struct object_entry **create_final_object_list(void)
 {
        struct object_entry **list;
        int i, j;
@@ -810,6 +810,7 @@ static int type_size_sort(const struct object_entry *a, const struct object_entr
 struct unpacked {
        struct object_entry *entry;
        void *data;
+       void **delta_index;
 };
 
 /*
@@ -851,11 +852,10 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de
        }
 
        size = cur_entry->size;
-       if (size < 50)
-               return -1;
        oldsize = old_entry->size;
        sizediff = oldsize > size ? oldsize - size : size - oldsize;
-       if (sizediff > size / 8)
+
+       if (size < 50)
                return -1;
        if (old_entry->depth >= max_depth)
                return 0;
@@ -892,7 +892,8 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de
        if (sizediff >= max_size)
                return -1;
        delta_buf = diff_delta(old->data, oldsize,
-                              cur->data, size, &delta_size, max_size);
+                              cur->data, size, &delta_size,
+                              max_size, old->delta_index);
        if (!delta_buf)
                return 0;
        cur_entry->delta = old_entry;
@@ -949,6 +950,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
                         */
                        continue;
 
+               free(n->delta_index);
                free(n->data);
                n->entry = entry;
                n->data = read_sha1_file(entry->sha1, type, &size);
@@ -975,8 +977,10 @@ static void find_deltas(struct object_entry **list, int window, int depth)
        if (progress)
                fputc('\n', stderr);
 
-       for (i = 0; i < window; ++i)
+       for (i = 0; i < window; ++i) {
+               free(array[i].delta_index);
                free(array[i].data);
+       }
        free(array);
 }