Skip to content

Commit c8d67b9

Browse files
derrickstoleegitster
authored andcommitted
commit-graph: fix generation number v2 overflow values
The Generation Data Chunk was implemented and tested in e8b6300 (commit-graph: implement generation data chunk, 2021-01-16), but the test was carefully constructed to work on systems with 32-bit dates. Since the corrected commit date offsets still required more than 31 bits, this triggered writing the generation_data_overflow chunk. However, upon closer look, the write_graph_chunk_generation_data_overflow() method writes the offsets to the chunk (as dictated by the format) but fill_commit_graph_info() treats the value in the chunk as if it is the full corrected commit date (not an offset). For some reason, this does not cause an issue when using the FUTURE_DATE specified in t5318-commit-graph.sh, but it does show up as a failure in 'git commit-graph verify' if we increase that FUTURE_DATE to be above four billion. Fix this error and create a 64-bit timestamp version of the test so we can test these larger values. Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 3b0199d commit c8d67b9

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

commit-graph.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ static void fill_commit_graph_info(struct commit *item, struct commit_graph *g,
806806
die(_("commit-graph requires overflow generation data but has none"));
807807

808808
offset_pos = offset ^ CORRECTED_COMMIT_DATE_OFFSET_OVERFLOW;
809-
graph_data->generation = get_be64(g->chunk_generation_data_overflow + 8 * offset_pos);
809+
graph_data->generation = item->date + get_be64(g->chunk_generation_data_overflow + 8 * offset_pos);
810810
} else
811811
graph_data->generation = item->date + offset;
812812
} else

t/t5328-commit-graph-64bit-time.sh

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,31 @@ test_expect_success 'lower layers have overflow chunk' '
3636

3737
graph_git_behavior 'overflow' '' HEAD~2 HEAD
3838

39+
test_expect_success 'set up and verify repo with generation data overflow chunk' '
40+
mkdir repo &&
41+
cd repo &&
42+
git init &&
43+
test_commit --date "$UNIX_EPOCH_ZERO" 1 &&
44+
test_commit 2 &&
45+
test_commit --date "$UNIX_EPOCH_ZERO" 3 &&
46+
git commit-graph write --reachable &&
47+
graph_read_expect 3 generation_data &&
48+
test_commit --date "$FUTURE_DATE" 4 &&
49+
test_commit 5 &&
50+
test_commit --date "$UNIX_EPOCH_ZERO" 6 &&
51+
git branch left &&
52+
git reset --hard 3 &&
53+
test_commit 7 &&
54+
test_commit --date "$FUTURE_DATE" 8 &&
55+
test_commit 9 &&
56+
git branch right &&
57+
git reset --hard 3 &&
58+
test_merge M left right &&
59+
git commit-graph write --reachable &&
60+
graph_read_expect 10 "generation_data generation_data_overflow" &&
61+
git commit-graph verify
62+
'
63+
64+
graph_git_behavior 'overflow 2' repo left right
65+
3966
test_done

0 commit comments

Comments
 (0)