]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-graph: respect 'commitGraph.readChangedPaths'
authorTaylor Blau <me@ttaylorr.com>
Wed, 9 Sep 2020 15:23:10 +0000 (11:23 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 9 Sep 2020 19:51:48 +0000 (12:51 -0700)
Git uses the 'core.commitGraph' configuration value to control whether
or not the commit graph is used when parsing commits or performing a
traversal.

Now that commit-graphs can also contain a section for changed-path Bloom
filters, administrators that already have commit-graphs may find it
convenient to use those graphs without relying on their changed-path
Bloom filters. This can happen, for example, during a staged roll-out,
or in the event of an incident.

Introduce 'commitGraph.readChangedPaths' to control whether or not Bloom
filters are read. Note that this configuration is independent from both:

  - 'core.commitGraph', to allow flexibility in using all parts of a
    commit-graph _except_ for its Bloom filters.

  - The '--changed-paths' option for 'git commit-graph write', to allow
    reading and writing Bloom filters to be controlled independently.

When the variable is set, pretend as if no Bloom data was specified at
all. This avoids adding additional special-casing outside of the
commit-graph internals.

Suggested-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
Documentation/config/commitgraph.txt [new file with mode: 0644]
commit-graph.c
repo-settings.c
repository.h
t/t4216-log-bloom.sh

index ef0768b91a02cafdcb6044dba0169a5092bbd913..78883c6e63b9fc01a6f4eeea2758034905384a26 100644 (file)
@@ -340,6 +340,8 @@ include::config/column.txt[]
 
 include::config/commit.txt[]
 
+include::config/commitgraph.txt[]
+
 include::config/credential.txt[]
 
 include::config/completion.txt[]
diff --git a/Documentation/config/commitgraph.txt b/Documentation/config/commitgraph.txt
new file mode 100644 (file)
index 0000000..cff0797
--- /dev/null
@@ -0,0 +1,4 @@
+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.
index 0c1030641cff8d94b7095bb2aba8f0e5cb0ebde4..a516e93d718d2e5a7e13bba460938f4a65de3510 100644 (file)
@@ -320,6 +320,8 @@ struct commit_graph *parse_commit_graph(struct repository *r,
                return NULL;
        }
 
+       prepare_repo_settings(r);
+
        graph = alloc_commit_graph();
 
        graph->hash_len = the_hash_algo->rawsz;
@@ -396,14 +398,14 @@ struct commit_graph *parse_commit_graph(struct repository *r,
                case GRAPH_CHUNKID_BLOOMINDEXES:
                        if (graph->chunk_bloom_indexes)
                                chunk_repeated = 1;
-                       else
+                       else if (r->settings.commit_graph_read_changed_paths)
                                graph->chunk_bloom_indexes = data + chunk_offset;
                        break;
 
                case GRAPH_CHUNKID_BLOOMDATA:
                        if (graph->chunk_bloom_data)
                                chunk_repeated = 1;
-                       else {
+                       else if (r->settings.commit_graph_read_changed_paths) {
                                uint32_t hash_version;
                                graph->chunk_bloom_data = data + chunk_offset;
                                hash_version = get_be32(data + chunk_offset);
index 0918408b34436a02589cdb850da8345671e4a5f1..9e551bc03d274ab728e64d22a84aadb24bb81a27 100644 (file)
@@ -17,9 +17,12 @@ void prepare_repo_settings(struct repository *r)
 
        if (!repo_config_get_bool(r, "core.commitgraph", &value))
                r->settings.core_commit_graph = value;
+       if (!repo_config_get_bool(r, "commitgraph.readchangedpaths", &value))
+               r->settings.commit_graph_read_changed_paths = value;
        if (!repo_config_get_bool(r, "gc.writecommitgraph", &value))
                r->settings.gc_write_commit_graph = value;
        UPDATE_DEFAULT_BOOL(r->settings.core_commit_graph, 1);
+       UPDATE_DEFAULT_BOOL(r->settings.commit_graph_read_changed_paths, 1);
        UPDATE_DEFAULT_BOOL(r->settings.gc_write_commit_graph, 1);
 
        if (!repo_config_get_int(r, "index.version", &value))
index 3c1f7d54bd37a55f6cd1b1ac1f936dc0c17b3dab..81759b7d2786fb3c3eeb2d73c0b5bd7936f27a95 100644 (file)
@@ -29,6 +29,7 @@ struct repo_settings {
        int initialized;
 
        int core_commit_graph;
+       int commit_graph_read_changed_paths;
        int gc_write_commit_graph;
        int fetch_write_commit_graph;
 
index fe19f6a60c0097215dcb9d648622505a7853dd68..b3d1f596f8dc612bd1d3738c4fb6cc0d73a0aba5 100755 (executable)
@@ -90,7 +90,9 @@ do
                      "--ancestry-path side..master"
        do
                test_expect_success "git log option: $option for path: $path" '
-                       test_bloom_filters_used "$option -- $path"
+                       test_bloom_filters_used "$option -- $path" &&
+                       test_config commitgraph.readChangedPaths false &&
+                       test_bloom_filters_not_used "$option -- $path"
                '
        done
 done