]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repo-settings: introduce commitgraph.changedPathsVersion
authorTaylor Blau <me@ttaylorr.com>
Tue, 25 Jun 2024 17:39:50 +0000 (13:39 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 25 Jun 2024 20:52:06 +0000 (13:52 -0700)
A subsequent commit will introduce another version of the changed-path
filter in the commit graph file. In order to control which version to
write (and read), a config variable is needed.

Therefore, introduce this config variable. For forwards compatibility,
teach Git to not read commit graphs when the config variable
is set to an unsupported version. Because we teach Git this,
commitgraph.readChangedPaths is now redundant, so deprecate it and
define its behavior in terms of the config variable we introduce.

This commit does not change the behavior of writing (Git writes changed
path filters when explicitly instructed regardless of any config
variable), but a subsequent commit will restrict Git such that it will
only write when commitgraph.changedPathsVersion is a recognized value.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/commitgraph.txt
commit-graph.c
oss-fuzz/fuzz-commit-graph.c
repo-settings.c
repository.h

index 30604e4a4c296783f55dd3644d866b8775796db2..e68cdededa2233150d84e4502d6c2b9d880f53b6 100644 (file)
@@ -9,6 +9,26 @@ commitGraph.maxNewFilters::
        commit-graph write` (c.f., linkgit:git-commit-graph[1]).
 
 commitGraph.readChangedPaths::
-       If true, then git will use the changed-path Bloom filters in the
-       commit-graph file (if it exists, and they are present). Defaults to
-       true. See linkgit:git-commit-graph[1] for more information.
+       Deprecated. Equivalent to commitGraph.changedPathsVersion=-1 if true, and
+       commitGraph.changedPathsVersion=0 if false. (If commitGraph.changedPathVersion
+       is also set, commitGraph.changedPathsVersion takes precedence.)
+
+commitGraph.changedPathsVersion::
+       Specifies the version of the changed-path Bloom filters that Git will read and
+       write. May be -1, 0 or 1. Note that values greater than 1 may be
+       incompatible with older versions of Git which do not yet understand
+       those versions. Use caution when operating in a mixed-version
+       environment.
++
+Defaults to -1.
++
+If -1, Git will use the version of the changed-path Bloom filters in the
+repository, defaulting to 1 if there are none.
++
+If 0, Git will not read any Bloom filters, and will write version 1 Bloom
+filters when instructed to write.
++
+If 1, Git will only read version 1 Bloom filters, and will write version 1
+Bloom filters.
++
+See linkgit:git-commit-graph[1] for more information.
index 00113b0f62b83daddbdd0ee632966ee4bc1b342e..91c98ebc6c50718ee9da7e4882ef048604a69c72 100644 (file)
@@ -459,7 +459,7 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
                        graph->read_generation_data = 1;
        }
 
-       if (s->commit_graph_read_changed_paths) {
+       if (s->commit_graph_changed_paths_version) {
                read_chunk(cf, GRAPH_CHUNKID_BLOOMINDEXES,
                           graph_read_bloom_index, graph);
                read_chunk(cf, GRAPH_CHUNKID_BLOOMDATA,
@@ -555,7 +555,8 @@ static void validate_mixed_bloom_settings(struct commit_graph *g)
                }
 
                if (g->bloom_filter_settings->bits_per_entry != settings->bits_per_entry ||
-                   g->bloom_filter_settings->num_hashes != settings->num_hashes) {
+                   g->bloom_filter_settings->num_hashes != settings->num_hashes ||
+                   g->bloom_filter_settings->hash_version != settings->hash_version) {
                        g->chunk_bloom_indexes = NULL;
                        g->chunk_bloom_data = NULL;
                        FREE_AND_NULL(g->bloom_filter_settings);
index 2992079dd97d75892f4f411cd4a979f459d68170..325c0b991ab1b30477d5ee8a6f03bb606c3d2385 100644 (file)
@@ -19,7 +19,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
         * possible.
         */
        the_repository->settings.commit_graph_generation_version = 2;
-       the_repository->settings.commit_graph_read_changed_paths = 1;
+       the_repository->settings.commit_graph_changed_paths_version = 1;
        g = parse_commit_graph(&the_repository->settings, (void *)data, size);
        repo_clear(the_repository);
        free_commit_graph(g);
index 30cd4787627b7cacbc2dbceddc0babee1b72cb3e..c821583fe5644452f8055429a0c5425707401543 100644 (file)
@@ -23,6 +23,7 @@ void prepare_repo_settings(struct repository *r)
        int value;
        const char *strval;
        int manyfiles;
+       int read_changed_paths;
 
        if (!r->gitdir)
                BUG("Cannot add settings for uninitialized repository");
@@ -53,7 +54,10 @@ void prepare_repo_settings(struct repository *r)
        /* Commit graph config or default, does not cascade (simple) */
        repo_cfg_bool(r, "core.commitgraph", &r->settings.core_commit_graph, 1);
        repo_cfg_int(r, "commitgraph.generationversion", &r->settings.commit_graph_generation_version, 2);
-       repo_cfg_bool(r, "commitgraph.readchangedpaths", &r->settings.commit_graph_read_changed_paths, 1);
+       repo_cfg_bool(r, "commitgraph.readchangedpaths", &read_changed_paths, 1);
+       repo_cfg_int(r, "commitgraph.changedpathsversion",
+                    &r->settings.commit_graph_changed_paths_version,
+                    read_changed_paths ? -1 : 0);
        repo_cfg_bool(r, "gc.writecommitgraph", &r->settings.gc_write_commit_graph, 1);
        repo_cfg_bool(r, "fetch.writecommitgraph", &r->settings.fetch_write_commit_graph, 0);
 
index 5f18486f6465c44b44abb2ded74bcdda14ba7bd9..f71154e12cb5b21886a9be3847b2d88871f5663c 100644 (file)
@@ -29,7 +29,7 @@ struct repo_settings {
 
        int core_commit_graph;
        int commit_graph_generation_version;
-       int commit_graph_read_changed_paths;
+       int commit_graph_changed_paths_version;
        int gc_write_commit_graph;
        int fetch_write_commit_graph;
        int command_requires_full_index;