Skip to content

Commit fde55b0

Browse files
derrickstoleegitster
authored andcommitted
commit-graph: be extra careful about mixed generations
When upgrading to a commit-graph with corrected commit dates from one without, there are a few things that need to be considered. When computing generation numbers for the new commit-graph file that expects to add the generation_data chunk with corrected commit dates, we need to ensure that the 'generation' member of the commit_graph_data struct is set to zero for these commits. Unfortunately, the fallback to use topological level for generation number when corrected commit dates are not available are causing us harm here: parsing commits notices that read_generation_data is false and populates 'generation' with the topological level. The solution is to iterate through the commits, parse the commits to populate initial values, then reset the generation values to zero to trigger recalculation. This loop only occurs when the existing commit-graph data has no corrected commit dates. While this improves our situation somewhat, we have not completely solved the issue for correctly computing generation numbers for mixed layers. That follows in the next change. Signed-off-by: Derrick Stolee <[email protected]> Reviewed-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 9c2c0a8 commit fde55b0

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

commit-graph.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,8 @@ struct write_commit_graph_context {
10361036
split:1,
10371037
changed_paths:1,
10381038
order_by_pack:1,
1039-
write_generation_data:1;
1039+
write_generation_data:1,
1040+
trust_generation_numbers:1;
10401041

10411042
struct topo_level_slab *topo_levels;
10421043
const struct commit_graph_opts *opts;
@@ -1508,6 +1509,15 @@ static void compute_generation_numbers(struct write_commit_graph_context *ctx)
15081509
ctx->progress = start_delayed_progress(
15091510
_("Computing commit graph generation numbers"),
15101511
ctx->commits.nr);
1512+
1513+
if (!ctx->trust_generation_numbers) {
1514+
for (i = 0; i < ctx->commits.nr; i++) {
1515+
struct commit *c = ctx->commits.list[i];
1516+
repo_parse_commit(ctx->r, c);
1517+
commit_graph_data_at(c)->generation = GENERATION_NUMBER_ZERO;
1518+
}
1519+
}
1520+
15111521
for (i = 0; i < ctx->commits.nr; i++) {
15121522
struct commit *c = ctx->commits.list[i];
15131523
timestamp_t corrected_commit_date;
@@ -2439,7 +2449,7 @@ int write_commit_graph(struct object_directory *odb,
24392449
} else
24402450
ctx->num_commit_graphs_after = 1;
24412451

2442-
validate_mixed_generation_chain(ctx->r->objects->commit_graph);
2452+
ctx->trust_generation_numbers = validate_mixed_generation_chain(ctx->r->objects->commit_graph);
24432453

24442454
compute_topological_levels(ctx);
24452455
if (ctx->write_generation_data)

0 commit comments

Comments
 (0)