]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-graph: verify swapped zero/non-zero generation cases
authorJeff King <peff@peff.net>
Mon, 21 Aug 2023 21:34:37 +0000 (17:34 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Aug 2023 23:07:33 +0000 (16:07 -0700)
In verify_one_commit_graph(), we have code that complains when a commit
is found with a generation number of zero, and then later with a
non-zero number. It works like this:

  1. When we see an entry with generation zero, we set the
     generation_zero flag to GENERATION_ZERO_EXISTS.

  2. When we later see an entry with a non-zero generation, we complain
     if the flag is GENERATION_ZERO_EXISTS.

There's a matching GENERATION_NUMBER_EXISTS value, which in theory would
be used to find the case that we see the entries in the opposite order:

  1. When we see an entry with a non-zero generation, we set the
     generation_zero flag to GENERATION_NUMBER_EXISTS.

  2. When we later see an entry with a zero generation, we complain if
     the flag is GENERATION_NUMBER_EXISTS.

But that doesn't work; step 2 is implemented, but there is no step 1. We
never use NUMBER_EXISTS at all, and Coverity rightly complains that step
2 is dead code.

We can fix that by implementing that step 1.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit-graph.c

index c68f5c6b3ac6ef0e3a924c6dc07f1e13efb1aee2..acca753ce8b953d400f447ca18e642a5dda3064d 100644 (file)
@@ -2686,9 +2686,12 @@ static int verify_one_commit_graph(struct repository *r,
                                graph_report(_("commit-graph has generation number zero for commit %s, but non-zero elsewhere"),
                                             oid_to_hex(&cur_oid));
                        generation_zero = GENERATION_ZERO_EXISTS;
-               } else if (generation_zero == GENERATION_ZERO_EXISTS)
-                       graph_report(_("commit-graph has non-zero generation number for commit %s, but zero elsewhere"),
-                                    oid_to_hex(&cur_oid));
+               } else {
+                       if (generation_zero == GENERATION_ZERO_EXISTS)
+                               graph_report(_("commit-graph has non-zero generation number for commit %s, but zero elsewhere"),
+                                            oid_to_hex(&cur_oid));
+                       generation_zero = GENERATION_NUMBER_EXISTS;
+               }
 
                if (generation_zero == GENERATION_ZERO_EXISTS)
                        continue;