Use new topo-order logic with GIT_TEST_COMMIT_GRAPH
cover Use new topo-order logic with GIT_TEST_COMMIT_GRAPH
The recent Git test report for v2.20.0-rc0 shows that the logic around UNINTERESTING commits is not covered by the test suite. This is because the code is currently unreachable! See the commit message for details.
An alternate approach would be to delete the code around UNINTERESTING commits, but that doesn't seem necessary.
Thanks, -Stolee
Derrick Stolee (1):
revision.c: use new topo-order logic in tests
revision.c | 4 ++++ 1 file changed, 4 insertions(+)
base-commit: 561b583749b7428f1790f03164d0d0e75be71d7b
Published-As: https://github.com/gitgitgadget/git/releases/tags/pr-83%2Fderrickstolee%2Ftopo-order-test-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-83/derrickstolee/topo-order-test-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/83
Signature · 1 line
gitgitgadget
PATCH 1/1 revision.c: use new topo-order logic in tests
From: Derrick Stolee <[email protected]>
The revision-walk machinery is being rewritten to use generation numbers in the commit-graph when availble. Due to some problematic commit histories, the new logic can be slower than the previous method due to how commit dates and generation numbers interact. Thus, the new logic is not used in comparison queries, such as
git log --topo-order A..B
The logic for these queries was implemented during the refactor, but is unreachable due to the potential performance penalty. The code came along with a larger block of code that was copied from the old code. When generation numbers are updated to v2 (corrected commit dates), then we will no longer have a performance penalty and this logic is what we will want to use.
In the meantime, use the new logic when GIT_TEST_COMMIT_GRAPH is enabled. This will demonstrate that the new logic works for all comparison queries in the test suite, including these variants:
git log --topo-order --ancestry-path A..B git log --topo-order A...B
--- revision.c | 4 ++++ 1 file changed, 4 insertions(+)
revision.c +4 -0
@@ -27,6 +27,7 @@#include "commit-reach.h" #include "commit-graph.h" #include "prio-queue.h" +#include "config.h" volatile show_early_output_fn_t show_early_output;
@@ -3143,6 +3144,9 @@ int prepare_revision_walk(struct rev_info *revs)commit_list_sort_by_date (&revs->commits);if (revs->no_walk)return 0 ; +if (revs->limited && +git_env_bool (GIT_TEST_COMMIT_GRAPH ,0 )) + revs->limited =0 ;if (revs->limited) {if (limit_list (revs) <0 )return -1 ;
Signature · 1 line
gitgitgadget
Re: [PATCH 1/1] revision.c: use new topo-order logic in tests
revision.c int prepare_revision_walk(struct rev_info *revs) · line 3152
Quoted 10 lines · Derrick Stolee via GitGitGadget
revision.c +3
-0@@ -3143,6 +3144,9 @@ int prepare_revision_walk(struct rev_info *revs)commit_list_sort_by_date (&revs->commits);if (revs->no_walk)return 0 ; +if (revs->limited && +git_env_bool (GIT_TEST_COMMIT_GRAPH ,0 )) + revs->limited =0 ;if (revs->limited) {if (limit_list (revs) <0 )return -1 ;
That is equivalent to say
if (git_env_bool(GIT_TEST_COMMIT_GRAPH, 0)) revs->limited = 0;
Wouldn't that make the codepath that involves limit_list() completely unreachable while testing, though?
The title only mentions "topo-order" logic, but the topo-order is not the only reason why limited bit can be set, is it? When showing merges, simplifying merges, or post-processing to show ancestry path, or showing a bottom-limited revision range, the limited bit is automatically set because all of these depend on first calling limit_list() and then postprocessing its result. Doesn't it hurt these cases to unconditionally drop limited bit?
Re: [PATCH 1/1] revision.c: use new topo-order logic in tests
Quoted 14 lines · Junio C Hamano
revision.c int prepare_revision_walk(struct rev_info *revs) · line 3152
Quoted 10 lines · Derrick Stolee via GitGitGadget
revision.c +3
-0@@ -3143,6 +3144,9 @@ int prepare_revision_walk(struct rev_info *revs)commit_list_sort_by_date (&revs->commits);if (revs->no_walk)return 0 ; +if (revs->limited && +git_env_bool (GIT_TEST_COMMIT_GRAPH ,0 )) + revs->limited =0 ;if (revs->limited) {if (limit_list (revs) <0 )return -1 ;That is equivalent to say
Quoted 2 lines
if (git_env_bool(GIT_TEST_COMMIT_GRAPH, 0)) revs->limited = 0;
Not exactly equivalent, because we can use short-circuiting to avoid the git_env_bool check, but I see what you mean.
Quoted 2 lines
Wouldn't that make the codepath that involves
limit_list()completely unreachable while testing, though?
Testing with GIT_TEST_COMMIT_GRAPH=0 would still hit limit_list(). Both modes are important to test (for instance, to ensure we still have correct behavior without a commit-graph file).
Quoted 7 lines
The title only mentions "topo-order" logic, but the topo-order is not the only reason why limited bit can be set, is it? When showing merges, simplifying merges, or post-processing to show ancestry path, or showing a bottom-limited revision range, the limited bit is automatically set because all of these depend on first calling
limit_list()and then postprocessing its result. Doesn't it hurt these cases to unconditionally drop limited bit?
You're right that we only want to do this in the topo-order case, so perhaps the diff should instead be:
if (revs->no_walk)
return 0;
+ if (revs->topo_order &&
+ git_env_bool(GIT_TEST_COMMIT_GRAPH, 0))
+ revs->limited = 0;
if (revs->limited) {
if (limit_list(revs) < 0)
return -1;
Thanks,
-Stolee