Skip to content

Commit 8d00d7c

Browse files
abhishekkumar2718gitster
authored andcommitted
commit-reach: use corrected commit dates in paint_down_to_common()
091f4cf (commit: don't use generation numbers if not needed, 2018-08-30) changed paint_down_to_common() to use commit dates instead of generation numbers v1 (topological levels) as the performance regressed on certain topologies. With generation number v2 (corrected commit dates) implemented, we no longer have to rely on commit dates and can use generation numbers. For example, the command `git merge-base v4.8 v4.9` on the Linux repository walks 167468 commits, taking 0.135s for committer date and 167496 commits, taking 0.157s for corrected committer date respectively. While using corrected commit dates, Git walks nearly the same number of commits as commit date, the process is slower as for each comparision we have to access a commit-slab (for corrected committer date) instead of accessing struct member (for committer date). This change incidentally broke the fragile t6404-recursive-merge test. t6404-recursive-merge sets up a unique repository where all commits have the same committer date without a well-defined merge-base. While running tests with GIT_TEST_COMMIT_GRAPH unset, we use committer date as a heuristic in paint_down_to_common(). 6404.1 'combined merge conflicts' merges commits in the order: - Merge C with B to form an intermediate commit. - Merge the intermediate commit with A. With GIT_TEST_COMMIT_GRAPH=1, we write a commit-graph and subsequently use the corrected committer date, which changes the order in which commits are merged: - Merge A with B to form an intermediate commit. - Merge the intermediate commit with C. While resulting repositories are equivalent, 6404.4 'virtual trees were processed' fails with GIT_TEST_COMMIT_GRAPH=1 as we are selecting different merge-bases and thus have different object ids for the intermediate commits. As this has already causes problems (as noted in 859fdc0 (commit-graph: define GIT_TEST_COMMIT_GRAPH, 2018-08-29)), we disable commit graph within t6404-recursive-merge. Signed-off-by: Abhishek Kumar <[email protected]> Reviewed-by: Taylor Blau <[email protected]> Reviewed-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 1fdc383 commit 8d00d7c

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

commit-graph.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,20 @@ int generation_numbers_enabled(struct repository *r)
714714
return !!first_generation;
715715
}
716716

717+
int corrected_commit_dates_enabled(struct repository *r)
718+
{
719+
struct commit_graph *g;
720+
if (!prepare_commit_graph(r))
721+
return 0;
722+
723+
g = r->objects->commit_graph;
724+
725+
if (!g->num_commits)
726+
return 0;
727+
728+
return g->read_generation_data;
729+
}
730+
717731
struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r)
718732
{
719733
struct commit_graph *g = r->objects->commit_graph;

commit-graph.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ struct commit_graph *parse_commit_graph(struct repository *r,
9595
*/
9696
int generation_numbers_enabled(struct repository *r);
9797

98+
/*
99+
* Return 1 if and only if the repository has a commit-graph
100+
* file and generation data chunk has been written for the file.
101+
*/
102+
int corrected_commit_dates_enabled(struct repository *r);
103+
98104
struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r);
99105

100106
enum commit_graph_write_flags {

commit-reach.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ static struct commit_list *paint_down_to_common(struct repository *r,
3939
int i;
4040
timestamp_t last_gen = GENERATION_NUMBER_INFINITY;
4141

42-
if (!min_generation)
42+
if (!min_generation && !corrected_commit_dates_enabled(r))
4343
queue.compare = compare_commits_by_commit_date;
4444

4545
one->object.flags |= PARENT1;

t/t6404-recursive-merge.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ GIT_COMMITTER_DATE="2006-12-12 23:28:00 +0100"
1515
export GIT_COMMITTER_DATE
1616

1717
test_expect_success 'setup tests' '
18+
GIT_TEST_COMMIT_GRAPH=0 &&
19+
export GIT_TEST_COMMIT_GRAPH &&
1820
echo 1 >a1 &&
1921
git add a1 &&
2022
GIT_AUTHOR_DATE="2006-12-12 23:00:00" git commit -m 1 a1 &&
@@ -66,7 +68,7 @@ test_expect_success 'setup tests' '
6668
'
6769

6870
test_expect_success 'combined merge conflicts' '
69-
test_must_fail env GIT_TEST_COMMIT_GRAPH=0 git merge -m final G
71+
test_must_fail git merge -m final G
7072
'
7173

7274
test_expect_success 'result contains a conflict' '
@@ -82,6 +84,7 @@ test_expect_success 'result contains a conflict' '
8284
'
8385

8486
test_expect_success 'virtual trees were processed' '
87+
# TODO: fragile test, relies on ambigious merge-base resolution
8588
git ls-files --stage >out &&
8689
8790
cat >expect <<-EOF &&

0 commit comments

Comments
 (0)