]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-graph: return generation from memory
authorDerrick Stolee <derrickstolee@github.com>
Mon, 20 Mar 2023 11:26:51 +0000 (11:26 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 20 Mar 2023 19:17:33 +0000 (12:17 -0700)
The commit_graph_generation() method used to report a value of
GENERATION_NUMBER_INFINITY if the commit_graph_data_slab had an instance
for the given commit but the graph_pos indicated the commit was not in
the commit-graph file.

However, an upcoming change will introduce the ability to set generation
values in-memory without writing the commit-graph file. Thus, we can no
longer trust 'graph_pos' to indicate whether or not the generation
member can be trusted.

Instead, trust the 'generation' member if the commit has a value in the
slab _and_ the 'generation' member is non-zero. Otherwise, treat it as
GENERATION_NUMBER_INFINITY.

This only makes a difference for a very old case for the commit-graph:
the very first Git release to write commit-graph files wrote zeroes in
the topological level positions. If we are parsing a commit-graph with
all zeroes, those commits will now appear to have
GENERATION_NUMBER_INFINITY (as if they were not parsed from the
commit-graph).

I attempted several variations to work around the need for providing an
uninitialized 'generation' member, but this was the best one I found. It
does require a change to a verification test in t5318 because it reports
a different error than the one about non-zero generation numbers.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit-graph.c
t/t5318-commit-graph.sh

index d1c98681e883c6cbfaf603d9e8a7b5d9adc72715..63a56483cf6a041a47ed438cc33097c1fc88b408 100644 (file)
@@ -116,12 +116,10 @@ timestamp_t commit_graph_generation(const struct commit *c)
        struct commit_graph_data *data =
                commit_graph_data_slab_peek(&commit_graph_data_slab, c);
 
-       if (!data)
-               return GENERATION_NUMBER_INFINITY;
-       else if (data->graph_pos == COMMIT_NOT_FROM_GRAPH)
-               return GENERATION_NUMBER_INFINITY;
+       if (data && data->generation)
+               return data->generation;
 
-       return data->generation;
+       return GENERATION_NUMBER_INFINITY;
 }
 
 static struct commit_graph_data *commit_graph_data_at(const struct commit *c)
index 049c5fc8ead328860ef7ed38dea410f4524107c9..b6e12115786fda5b3b89ad63f2761192593c7f1b 100755 (executable)
@@ -630,7 +630,7 @@ test_expect_success 'detect incorrect generation number' '
 
 test_expect_success 'detect incorrect generation number' '
        corrupt_graph_and_verify $GRAPH_BYTE_COMMIT_GENERATION "\01" \
-               "non-zero generation number"
+               "commit-graph generation for commit"
 '
 
 test_expect_success 'detect incorrect commit date' '