]> git.ipfire.org Git - thirdparty/git.git/commitdiff
maintenance: test commit-graph auto condition
authorDerrick Stolee <dstolee@microsoft.com>
Thu, 8 Oct 2020 00:50:39 +0000 (00:50 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Oct 2020 17:24:40 +0000 (10:24 -0700)
The auto condition for the commit-graph maintenance task walks refs
looking for commits that are not in the commit-graph file. This was
added in 4ddc79b2 (maintenance: add auto condition for commit-graph
task, 2020-09-17) but was left untested.

The initial goal of this change was to demonstrate the feature works
properly by adding tests. However, there was an off-by-one error that
caused the basic tests around maintenance.commit-graph.auto=1 to fail
when it should work.

The subtlety is that if a ref tip is not in the commit-graph, then we
were not adding that to the total count. In the test, we see that we
have only added one commit since our last commit-graph write, so the
auto condition would say there is nothing to do.

The fix is simple: add the check for the commit-graph position to see
that the tip is not in the commit-graph file before starting our walk.
Since this happens before adding to the DFS stack, we do not need to
clear our (currently empty) commit list.

This does add some extra complexity for the test, because we also want
to verify that the walk along the parents actually does some work. This
means we need to add at least two commits in a row without writing the
commit-graph. However, we also need to make sure no additional refs are
pointing to the middle of this list or else the for_each_ref() in
should_write_commit_graph() might visit these commits as tips instead of
doing a DFS walk. Hence, the last two commits are added with "git
commit" instead of "test_commit".

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/gc.c
t/t7900-maintenance.sh

index 090959350e06c0821889cab4d3a217ef814e5618..12ddb68bba9ada6ec828c61b862668bd7947f6ff 100644 (file)
@@ -737,9 +737,15 @@ static int dfs_on_ref(const char *refname,
        commit = lookup_commit(the_repository, oid);
        if (!commit)
                return 0;
-       if (parse_commit(commit))
+       if (parse_commit(commit) ||
+           commit_graph_position(commit) != COMMIT_NOT_FROM_GRAPH)
                return 0;
 
+       data->num_not_in_graph++;
+
+       if (data->num_not_in_graph >= data->limit)
+               return 1;
+
        commit_list_append(commit, &stack);
 
        while (!result && stack) {
index 53c883531e440c0d55db95134bab5a17e96a71e1..ee1f4a7ae440c9aa13c9e00893198971f0e3852b 100755 (executable)
@@ -52,6 +52,35 @@ test_expect_success 'run --task=<task>' '
        test_subcommand git commit-graph write --split --reachable --no-progress <run-both.txt
 '
 
+test_expect_success 'commit-graph auto condition' '
+       COMMAND="maintenance run --task=commit-graph --auto --quiet" &&
+
+       GIT_TRACE2_EVENT="$(pwd)/cg-no.txt" \
+               git -c maintenance.commit-graph.auto=1 $COMMAND &&
+       GIT_TRACE2_EVENT="$(pwd)/cg-negative-means-yes.txt" \
+               git -c maintenance.commit-graph.auto="-1" $COMMAND &&
+
+       test_commit first &&
+
+       GIT_TRACE2_EVENT="$(pwd)/cg-zero-means-no.txt" \
+               git -c maintenance.commit-graph.auto=0 $COMMAND &&
+       GIT_TRACE2_EVENT="$(pwd)/cg-one-satisfied.txt" \
+               git -c maintenance.commit-graph.auto=1 $COMMAND &&
+
+       git commit --allow-empty -m "second" &&
+       git commit --allow-empty -m "third" &&
+
+       GIT_TRACE2_EVENT="$(pwd)/cg-two-satisfied.txt" \
+               git -c maintenance.commit-graph.auto=2 $COMMAND &&
+
+       COMMIT_GRAPH_WRITE="git commit-graph write --split --reachable --no-progress" &&
+       test_subcommand ! $COMMIT_GRAPH_WRITE <cg-no.txt &&
+       test_subcommand $COMMIT_GRAPH_WRITE <cg-negative-means-yes.txt &&
+       test_subcommand ! $COMMIT_GRAPH_WRITE <cg-zero-means-no.txt &&
+       test_subcommand $COMMIT_GRAPH_WRITE <cg-one-satisfied.txt &&
+       test_subcommand $COMMIT_GRAPH_WRITE <cg-two-satisfied.txt
+'
+
 test_expect_success 'run --task=bogus' '
        test_must_fail git maintenance run --task=bogus 2>err &&
        test_i18ngrep "is not a valid task" err