]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-graph: prepare commit graph
authorDerrick Stolee <dstolee@microsoft.com>
Tue, 2 Feb 2021 03:01:23 +0000 (03:01 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 2 Feb 2021 05:03:36 +0000 (21:03 -0800)
Before checking if the repository has a commit-graph loaded, be sure
to run prepare_commit_graph(). This is necessary because otherwise
the topo_levels slab is not initialized. As we compute topo_levels for
the new commits, we iterate further into the lower layers since the
first visit to each commit looks as though the topo_level is not
populated.

By properly initializing the topo_slab, we fix the previously broken
case of a split commit graph where a base layer has the
generation_data_overflow chunk.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit-graph.c
t/t5318-commit-graph.sh

index ee8d5a0cdb4d6e3c93c69f2829b5aa942b126684..94d3ab4a04f2ceec5c7d33876e37467f79892033 100644 (file)
@@ -2348,6 +2348,7 @@ int write_commit_graph(struct object_directory *odb,
        init_topo_level_slab(&topo_levels);
        ctx->topo_levels = &topo_levels;
 
+       prepare_commit_graph(ctx->r);
        if (ctx->r->objects->commit_graph) {
                struct commit_graph *g = ctx->r->objects->commit_graph;
 
@@ -2361,7 +2362,6 @@ int write_commit_graph(struct object_directory *odb,
                ctx->changed_paths = 1;
        if (!(flags & COMMIT_GRAPH_NO_WRITE_BLOOM_FILTERS)) {
                struct commit_graph *g;
-               prepare_commit_graph_one(ctx->r, ctx->odb);
 
                g = ctx->r->objects->commit_graph;
 
@@ -2373,10 +2373,7 @@ int write_commit_graph(struct object_directory *odb,
        }
 
        if (ctx->split) {
-               struct commit_graph *g;
-               prepare_commit_graph(ctx->r);
-
-               g = ctx->r->objects->commit_graph;
+               struct commit_graph *g = ctx->r->objects->commit_graph;
 
                while (g) {
                        ctx->num_commit_graphs_before++;
@@ -2400,9 +2397,6 @@ int write_commit_graph(struct object_directory *odb,
 
        ctx->approx_nr_objects = approximate_object_count();
 
-       if (ctx->append)
-               prepare_commit_graph_one(ctx->r, ctx->odb);
-
        if (ctx->append && ctx->r->objects->commit_graph) {
                struct commit_graph *g = ctx->r->objects->commit_graph;
                for (i = 0; i < g->num_commits; i++) {
index 2cf29f425a070f86ee0631234a7cc88677243e16..5b15f1aa0f60e819a6a2b12f376224f2ea1ef13f 100755 (executable)
@@ -446,7 +446,7 @@ test_expect_success 'warn on improper hash version' '
        )
 '
 
-test_expect_failure 'lower layers have overflow chunk' '
+test_expect_success 'lower layers have overflow chunk' '
        cd "$TRASH_DIRECTORY/full" &&
        UNIX_EPOCH_ZERO="@0 +0000" &&
        FUTURE_DATE="@2147483646 +0000" &&