diff options
author | Junio C Hamano <gitster@pobox.com> | 2018-11-21 20:39:02 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-11-21 20:39:02 +0900 |
commit | 7fab474656cdb5517d5b627602a54776e485ddbc (patch) | |
tree | 4550c2062221ddc3f5c480c4c627d1e1ba73fc63 | |
parent | fde566f222bd473193d9b39b44973a013f8b48b2 (diff) | |
parent | 3949053617652693b659a933a1393f8be189f26a (diff) | |
download | git-7fab474656cdb5517d5b627602a54776e485ddbc.tar.gz |
Merge branch 'cc/delta-islands'
A few issues in the implementation of "delta-islands" feature has
been corrected.
* cc/delta-islands:
pack-objects: fix off-by-one in delta-island tree-depth computation
pack-objects: zero-initialize tree_depth/layer arrays
pack-objects: fix tree_depth and layer invariants
-rw-r--r-- | builtin/pack-objects.c | 4 | ||||
-rw-r--r-- | git-compat-util.h | 1 | ||||
-rw-r--r-- | pack-objects.h | 4 |
3 files changed, 6 insertions, 3 deletions
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index e7ea206c08..411aefd687 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -2786,9 +2786,11 @@ static void show_object(struct object *obj, const char *name, void *data) if (use_delta_islands) { const char *p; - unsigned depth = 0; + unsigned depth; struct object_entry *ent; + /* the empty string is a root tree, which is depth 0 */ + depth = *name ? 1 : 0; for (p = strchr(name, '/'); p; p = strchr(p + 1, '/')) depth++; diff --git a/git-compat-util.h b/git-compat-util.h index f16058182f..09b0102cae 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -861,6 +861,7 @@ extern FILE *fopen_or_warn(const char *path, const char *mode); #define FREE_AND_NULL(p) do { free(p); (p) = NULL; } while (0) #define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc))) +#define CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x))); #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc))) #define COPY_ARRAY(dst, src, n) copy_array((dst), (src), (n), sizeof(*(dst)) + \ diff --git a/pack-objects.h b/pack-objects.h index feb6a6a05e..dc869f26c2 100644 --- a/pack-objects.h +++ b/pack-objects.h @@ -412,7 +412,7 @@ static inline void oe_set_tree_depth(struct packing_data *pack, unsigned int tree_depth) { if (!pack->tree_depth) - ALLOC_ARRAY(pack->tree_depth, pack->nr_objects); + CALLOC_ARRAY(pack->tree_depth, pack->nr_alloc); pack->tree_depth[e - pack->objects] = tree_depth; } @@ -429,7 +429,7 @@ static inline void oe_set_layer(struct packing_data *pack, unsigned char layer) { if (!pack->layer) - ALLOC_ARRAY(pack->layer, pack->nr_objects); + CALLOC_ARRAY(pack->layer, pack->nr_alloc); pack->layer[e - pack->objects] = layer; } |