The delta depth doesn't have to be stored in the global object array structure since it is only used during the deltification pass. Signed-off-by: Nicolas Pitre <nico@xxxxxxx> --- diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index b4f3e7c..55609f3 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -25,9 +25,6 @@ git-pack-objects [{ -q | --progress | --all-progress }] [--max-pack-size=N] \n\ struct object_entry { struct pack_idx_entry idx; unsigned long size; /* uncompressed size */ - - unsigned int hash; /* name hint hash */ - unsigned int depth; /* delta depth */ struct packed_git *in_pack; /* already in pack */ off_t in_pack_offset; struct object_entry *delta; /* delta base object */ @@ -37,6 +34,7 @@ struct object_entry { */ void *delta_data; /* cached delta (uncompressed) */ unsigned long delta_size; /* delta data size (uncompressed) */ + unsigned int hash; /* name hint hash */ enum object_type type; enum object_type in_pack_type; /* could be delta */ unsigned char in_pack_header_size; @@ -1270,6 +1268,7 @@ struct unpacked { struct object_entry *entry; void *data; struct delta_index *index; + unsigned depth; }; static int delta_cacheable(struct unpacked *trg, struct unpacked *src, @@ -1328,7 +1327,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, return 0; /* Let's not bust the allowed depth. */ - if (src_entry->depth >= max_depth) + if (src->depth >= max_depth) return 0; /* Now some size filtering heuristics. */ @@ -1338,9 +1337,9 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, ref_depth = 1; } else { max_size = trg_entry->delta_size; - ref_depth = trg_entry->depth; + ref_depth = trg->depth; } - max_size = max_size * (max_depth - src_entry->depth) / + max_size = max_size * (max_depth - src->depth) / (max_depth - ref_depth + 1); if (max_size == 0) return 0; @@ -1379,17 +1378,17 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, if (trg_entry->delta_data) { /* Prefer only shallower same-sized deltas. */ if (delta_size == trg_entry->delta_size && - src_entry->depth + 1 >= trg_entry->depth) { + src->depth + 1 >= trg->depth) { free(delta_buf); return 0; } delta_cache_size -= trg_entry->delta_size; free(trg_entry->delta_data); + trg_entry->delta_data = NULL; } - trg_entry->delta_data = 0; trg_entry->delta = src_entry; trg_entry->delta_size = delta_size; - trg_entry->depth = src_entry->depth + 1; + trg->depth = src->depth + 1; if (delta_cacheable(src, trg, src_size, trg_size, delta_size)) { trg_entry->delta_data = xrealloc(delta_buf, delta_size); @@ -1484,7 +1483,7 @@ static void find_deltas(struct object_entry **list, int window, int depth) * depth, leaving it in the window is pointless. we * should evict it first. */ - if (entry->delta && depth <= entry->depth) + if (entry->delta && depth <= n->depth) continue; next: - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html