aboutsummaryrefslogtreecommitdiffstats
path: root/fsck.c
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2021-02-10 18:01:30 +0000
committerJunio C Hamano <gitster@pobox.com>2021-02-10 12:38:05 -0800
commite89f89361cd7b706858eb22a6cf3d59d31a00acf (patch)
treec858a9415a6819491113dac575ecd10562607f8c /fsck.c
parent8c891eed3a89ff945b7957cdf62037b2e2b6eca7 (diff)
downloadgit-e89f89361cd7b706858eb22a6cf3d59d31a00acf.tar.gz
fsck --name-objects: be more careful parsing generation numbers
In 7b35efd734e (fsck_walk(): optionally name objects on the go, 2016-07-17), the `fsck` machinery learned to optionally name the objects, so that it is easier to see what part of the repository is in a bad shape, say, when objects are missing. To save on complexity, this machinery uses a parser to determine the name of a parent given a commit's name: any `~<n>` suffix is parsed and the parent's name is formed from the prefix together with `~<n+1>`. However, this parser has a bug: if it finds a suffix `<n>` that is _not_ `~<n>`, it will mistake the empty string for the prefix and `<n>` for the generation number. In other words, it will generate a name of the form `~<bogus-number>`. Let's fix this. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'fsck.c')
-rw-r--r--fsck.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fsck.c b/fsck.c
index 5e282b3b6b..293c1a2ef5 100644
--- a/fsck.c
+++ b/fsck.c
@@ -461,6 +461,11 @@ static int fsck_walk_commit(struct commit *commit, void *data, struct fsck_optio
generation += power * (name[--len] - '0');
if (power > 1 && len && name[len - 1] == '~')
name_prefix_len = len - 1;
+ else {
+ /* Maybe a non-first parent, e.g. HEAD^2 */
+ generation = 0;
+ name_prefix_len = len;
+ }
}
}