commit-graph: clean up chains after flattened write
authorDerrick Stolee <dstolee@microsoft.com>
Tue, 18 Jun 2019 18:14:33 +0000 (11:14 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 20 Jun 2019 03:46:26 +0000 (20:46 -0700)
If we write a commit-graph file without the split option, then
we write to $OBJDIR/info/commit-graph and start to ignore
the chains in $OBJDIR/info/commit-graphs/.

Unlink the commit-graph-chain file and expire the graph-{hash}.graph
files in $OBJDIR/info/commit-graphs/ during every write.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit-graph.c
t/t5324-split-commit-graph.sh

index f33f4fe..3599ae6 100644 (file)
@@ -1687,6 +1687,12 @@ static void expire_commit_graphs(struct write_commit_graph_context *ctx)
 
        if (ctx->split_opts && ctx->split_opts->expire_time)
                expire_time -= ctx->split_opts->expire_time;
 
        if (ctx->split_opts && ctx->split_opts->expire_time)
                expire_time -= ctx->split_opts->expire_time;
+       if (!ctx->split) {
+               char *chain_file_name = get_chain_filename(ctx->obj_dir);
+               unlink(chain_file_name);
+               free(chain_file_name);
+               ctx->num_commit_graphs_after = 0;
+       }
 
        strbuf_addstr(&path, ctx->obj_dir);
        strbuf_addstr(&path, "/info/commit-graphs");
 
        strbuf_addstr(&path, ctx->obj_dir);
        strbuf_addstr(&path, "/info/commit-graphs");
@@ -1841,10 +1847,10 @@ int write_commit_graph(const char *obj_dir,
 
        res = write_commit_graph_file(ctx);
 
 
        res = write_commit_graph_file(ctx);
 
-       if (ctx->split) {
+       if (ctx->split)
                mark_commit_graphs(ctx);
                mark_commit_graphs(ctx);
-               expire_commit_graphs(ctx);
-       }
+
+       expire_commit_graphs(ctx);
 
 cleanup:
        free(ctx->graph_name);
 
 cleanup:
        free(ctx->graph_name);
index 3df90ae..e8df35c 100755 (executable)
@@ -216,6 +216,18 @@ test_expect_success 'test merge stragety constants' '
        )
 '
 
        )
 '
 
+test_expect_success 'remove commit-graph-chain file after flattening' '
+       git clone . flatten &&
+       (
+               cd flatten &&
+               test_line_count = 2 $graphdir/commit-graph-chain &&
+               git commit-graph write --reachable &&
+               test_path_is_missing $graphdir/commit-graph-chain &&
+               ls $graphdir >graph-files &&
+               test_line_count = 0 graph-files
+       )
+'
+
 corrupt_file() {
        file=$1
        pos=$2
 corrupt_file() {
        file=$1
        pos=$2