Specify generation number version by config
cover Specify generation number version by config
This is based on ds/chunked-file-api.
Generation number v2 (corrected commit dates) was introduced by ak/corrected-commit-date. The new data could be opted-out only using the GIT_TEST_COMMIT_GRAPH_NO_GDAT environment variable.
As this feature gets deployed more widely, servers in particular might want more control over when this format is used. Add a config option instead.
Thanks, -Stolee
Derrick Stolee (2):
commit-graph: create local repository pointer
commit-graph: use config to specify generation type
Documentation/config/commitgraph.txt | 6 ++++++ commit-graph.c | 31 ++++++++++++++++++---------- commit-graph.h | 1 - t/README | 3 --- t/t5318-commit-graph.sh | 2 +- t/t5324-split-commit-graph.sh | 4 ++-- t/t6600-test-reach.sh | 2 +- 7 files changed, 30 insertions(+), 19 deletions(-)
base-commit: c4ff24bbb354377a6a7937744fbbef2898243fc7
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-886%2Fderrickstolee%2Fcommit-graph-generation-config-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-886/derrickstolee/commit-graph-generation-config-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/886
Signature · 1 line
gitgitgadget
PATCH 1/2 commit-graph: create local repository pointer
From: Derrick Stolee <[email protected]>
The write_commit_graph() method uses 'the_repository' in a few places. A new need for a repository pointer is coming in the following change, so group these instances into a local variable 'r' that could eventually become part of the method signature, if so desired.
--- commit-graph.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
commit-graph.c +5 -4
@@ -2155,6 +2155,7 @@ int write_commit_graph(struct object_directory *odb,enum commit_graph_write_flags flags, const struct commit_graph_opts *opts) { + struct repository *r = the_repository;struct write_commit_graph_context *ctx;uint32_t i;int res =0 ;
@@ -2162,16 +2163,16 @@ int write_commit_graph(struct object_directory *odb,struct bloom_filter_settings bloom_settings =DEFAULT_BLOOM_FILTER_SETTINGS ;struct topo_level_slab topo_levels; -prepare_repo_settings (the_repository); -if (!the_repository->settings.core_commit_graph) { +prepare_repo_settings (r); +if (!r->settings.core_commit_graph) {warning (_ ("attempting to write a commit-graph, but 'core.commitGraph' is disabled" ));return 0 ; } -if (!commit_graph_compatible (the_repository)) +if (!commit_graph_compatible (r))return 0 ; ctx =xcalloc (1 ,sizeof (struct write_commit_graph_context )); - ctx->r = the_repository; + ctx->r = r; ctx->odb = odb; ctx->append = flags &COMMIT_GRAPH_WRITE_APPEND ?1 :0 ; ctx->report_progress = flags &COMMIT_GRAPH_WRITE_PROGRESS ?1 :0 ;
Signature · 1 line
gitgitgadget
PATCH 2/2 commit-graph: use config to specify generation type
In reply to Derrick Stolee via GitGitGadgetFrom: Derrick Stolee <[email protected]>
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.
--- Documentation/config/commitgraph.txt | 6 ++++++ commit-graph.c | 22 +++++++++++++++------- commit-graph.h | 1 - t/README | 3 --- t/t5318-commit-graph.sh | 2 +- t/t5324-split-commit-graph.sh | 4 ++-- t/t6600-test-reach.sh | 2 +- 7 files changed, 25 insertions(+), 15 deletions(-)
Documentation/config/commitgraph.txt +6 -0
@@ -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]).
commit-graph.c +15 -7
@@ -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",
commit-graph.h +0 -1
@@ -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"
t/README +0 -3
@@ -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
t/t5318-commit-graph.sh +1 -1
@@ -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 '
t/t5324-split-commit-graph.sh +2 -2
@@ -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 &&
t/t6600-test-reach.sh +1 -1
@@ -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
Signature · 1 line
gitgitgadget