]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-graph: use config to specify generation type
authorDerrick Stolee <dstolee@microsoft.com>
Thu, 25 Feb 2021 18:19:43 +0000 (18:19 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 25 Feb 2021 23:10:41 +0000 (15:10 -0800)
We have two established generation number versions:

 1: topological levels
 2: corrected commit dates

The corrected commit dates are enabled by default, but they also write
extra data in the GDAT and GDOV chunks. Services that host Git data
might want to have more control over when this feature rolls out than
just updating the Git binaries.

Add a new "commitGraph.generationVersion" config option that specifies
the intended generation number version. If this value is less than 2,
then the GDAT chunk is never written _or read_ from an existing file.

This can replace our use of the GIT_TEST_COMMIT_GRAPH_NO_GDAT
environment variable in the test suite. Remove it.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/commitgraph.txt
commit-graph.c
commit-graph.h
t/README
t/t5318-commit-graph.sh
t/t5324-split-commit-graph.sh
t/t6600-test-reach.sh

index 4582c39fc462757b05a9b1c3871d29e1c373c605..30604e4a4c296783f55dd3644d866b8775796db2 100644 (file)
@@ -1,3 +1,9 @@
+commitGraph.generationVersion::
+       Specifies the type of generation number version to use when writing
+       or reading the commit-graph file. If version 1 is specified, then
+       the corrected commit dates will not be written or read. Defaults to
+       2.
+
 commitGraph.maxNewFilters::
        Specifies the default value for the `--max-new-filters` option of `git
        commit-graph write` (c.f., linkgit:git-commit-graph[1]).
index 8b07a9a0a6dfc1952c193ab2c1aaf7c5e646739b..1e9b88c003d773cfccc98d2de82abaaaf1ad95df 100644 (file)
@@ -96,6 +96,13 @@ define_commit_slab(commit_graph_data_slab, struct commit_graph_data);
 static struct commit_graph_data_slab commit_graph_data_slab =
        COMMIT_SLAB_INIT(1, commit_graph_data_slab);
 
+static int get_configured_generation_version(struct repository *r)
+{
+       int version = 2;
+       repo_config_get_int(r, "commitgraph.generationversion", &version);
+       return version;
+}
+
 uint32_t commit_graph_position(const struct commit *c)
 {
        struct commit_graph_data *data =
@@ -394,10 +401,13 @@ struct commit_graph *parse_commit_graph(struct repository *r,
        pair_chunk(cf, GRAPH_CHUNKID_DATA, &graph->chunk_commit_data);
        pair_chunk(cf, GRAPH_CHUNKID_EXTRAEDGES, &graph->chunk_extra_edges);
        pair_chunk(cf, GRAPH_CHUNKID_BASE, &graph->chunk_base_graphs);
-       pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA,
-                  &graph->chunk_generation_data);
-       pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW,
-                  &graph->chunk_generation_data_overflow);
+
+       if (get_configured_generation_version(r) >= 2) {
+               pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA,
+                       &graph->chunk_generation_data);
+               pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW,
+                       &graph->chunk_generation_data_overflow);
+       }
 
        if (r->settings.commit_graph_read_changed_paths) {
                pair_chunk(cf, GRAPH_CHUNKID_BLOOMINDEXES,
@@ -1771,8 +1781,6 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
        add_chunk(cf, GRAPH_CHUNKID_DATA, (hashsz + 16) * ctx->commits.nr,
                  write_graph_chunk_data);
 
-       if (git_env_bool(GIT_TEST_COMMIT_GRAPH_NO_GDAT, 0))
-               ctx->write_generation_data = 0;
        if (ctx->write_generation_data)
                add_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA,
                          sizeof(uint32_t) * ctx->commits.nr,
@@ -2179,7 +2187,7 @@ int write_commit_graph(struct object_directory *odb,
        ctx->split = flags & COMMIT_GRAPH_WRITE_SPLIT ? 1 : 0;
        ctx->opts = opts;
        ctx->total_bloom_filter_data_size = 0;
-       ctx->write_generation_data = 1;
+       ctx->write_generation_data = (get_configured_generation_version(r) == 2);
        ctx->num_generation_data_overflows = 0;
 
        bloom_settings.bits_per_entry = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY",
index 97f3497c2790c5bca0f9c73dd069291c95456895..96c24fb5777de48ccb5d5144543b3c2ff6f7efae 100644 (file)
@@ -6,7 +6,6 @@
 #include "oidset.h"
 
 #define GIT_TEST_COMMIT_GRAPH "GIT_TEST_COMMIT_GRAPH"
-#define GIT_TEST_COMMIT_GRAPH_NO_GDAT "GIT_TEST_COMMIT_GRAPH_NO_GDAT"
 #define GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE "GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE"
 #define GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS "GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS"
 
index 8a121487279bf1b98618e1a1fcf79478acff4bcc..c730a7077057d4104a8d4f18737309a2e2dcbdf4 100644 (file)
--- a/t/README
+++ b/t/README
@@ -393,9 +393,6 @@ GIT_TEST_COMMIT_GRAPH=<boolean>, when true, forces the commit-graph to
 be written after every 'git commit' command, and overrides the
 'core.commitGraph' setting to true.
 
-GIT_TEST_COMMIT_GRAPH_NO_GDAT=<boolean>, when true, forces the
-commit-graph to be written without generation data chunk.
-
 GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=<boolean>, when true, forces
 commit-graph write to compute and write changed path Bloom filters for
 every 'git commit-graph write', as if the `--changed-paths` option was
index c7da741284e587f003195a2e249ce4028282d816..6c051ca6bcf7e85c2fa6da51a121e4b175ea801d 100755 (executable)
@@ -454,7 +454,7 @@ test_expect_success 'warn on improper hash version' '
 
 test_expect_success 'git commit-graph verify' '
        cd "$TRASH_DIRECTORY/full" &&
-       git rev-parse commits/8 | GIT_TEST_COMMIT_GRAPH_NO_GDAT=1 git commit-graph write --stdin-commits &&
+       git rev-parse commits/8 | git -c commitGraph.generationVersion=1 commit-graph write --stdin-commits &&
        git commit-graph verify >output &&
        graph_read_expect 9 extra_edges
 '
index 8e90f3423b8f23397d1a7dd86405215d1d8502fd..587226ed10320cb57ea0f6da8ac333572e847f56 100755 (executable)
@@ -489,7 +489,7 @@ test_expect_success 'setup repo for mixed generation commit-graph-chain' '
                        test_commit $i &&
                        git branch commits/$i || return 1
                done &&
-               git commit-graph write --reachable --split &&
+               git -c commitGraph.generationVersion=2 commit-graph write --reachable --split &&
                graph_read_expect $NUM_FIRST_LAYER_COMMITS &&
                test_line_count = 1 $graphdir/commit-graph-chain &&
                for i in $(test_seq $SECOND_LAYER_SEQUENCE_START $SECOND_LAYER_SEQUENCE_END)
@@ -497,7 +497,7 @@ test_expect_success 'setup repo for mixed generation commit-graph-chain' '
                        test_commit $i &&
                        git branch commits/$i || return 1
                done &&
-               GIT_TEST_COMMIT_GRAPH_NO_GDAT=1 git commit-graph write --reachable --split=no-merge &&
+               git -c commitGraph.generationVersion=1 commit-graph write --reachable --split=no-merge &&
                test_line_count = 2 $graphdir/commit-graph-chain &&
                test-tool read-graph >output &&
                cat >expect <<-EOF &&
index e2d33a8a4c46124fcdf2c3ee69554c5ecf2af774..3d7a62ddab61729d37c183fe327a9d8997f96c1c 100755 (executable)
@@ -55,7 +55,7 @@ test_expect_success 'setup' '
        git show-ref -s commit-5-5 | git commit-graph write --stdin-commits &&
        mv .git/objects/info/commit-graph commit-graph-half &&
        chmod u+w commit-graph-half &&
-       GIT_TEST_COMMIT_GRAPH_NO_GDAT=1 git commit-graph write --reachable &&
+       git -c commitGraph.generationVersion=1 commit-graph write --reachable &&
        mv .git/objects/info/commit-graph commit-graph-no-gdat &&
        chmod u+w commit-graph-no-gdat &&
        git config core.commitGraph true