mirror of
https://github.com/git/git.git
synced 2024-11-27 20:14:30 +08:00
fsck --name-objects: be more careful parsing generation numbers
In 7b35efd734
(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>
This commit is contained in:
parent
8c891eed3a
commit
e89f89361c
5
fsck.c
5
fsck.c
@ -461,6 +461,11 @@ static int fsck_walk_commit(struct commit *commit, void *data, struct fsck_optio
|
|||||||
generation += power * (name[--len] - '0');
|
generation += power * (name[--len] - '0');
|
||||||
if (power > 1 && len && name[len - 1] == '~')
|
if (power > 1 && len && name[len - 1] == '~')
|
||||||
name_prefix_len = len - 1;
|
name_prefix_len = len - 1;
|
||||||
|
else {
|
||||||
|
/* Maybe a non-first parent, e.g. HEAD^2 */
|
||||||
|
generation = 0;
|
||||||
|
name_prefix_len = len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -658,13 +658,15 @@ test_expect_success 'fsck --name-objects' '
|
|||||||
git init name-objects &&
|
git init name-objects &&
|
||||||
(
|
(
|
||||||
cd name-objects &&
|
cd name-objects &&
|
||||||
|
git config core.logAllRefUpdates false &&
|
||||||
test_commit julius caesar.t &&
|
test_commit julius caesar.t &&
|
||||||
test_commit augustus &&
|
test_commit augustus44 &&
|
||||||
test_commit caesar &&
|
test_commit caesar &&
|
||||||
remove_object $(git rev-parse julius:caesar.t) &&
|
remove_object $(git rev-parse julius:caesar.t) &&
|
||||||
test_must_fail git fsck --name-objects >out &&
|
|
||||||
tree=$(git rev-parse --verify julius:) &&
|
tree=$(git rev-parse --verify julius:) &&
|
||||||
test_i18ngrep "$tree (refs/tags/julius:" out
|
git tag -d julius &&
|
||||||
|
test_must_fail git fsck --name-objects >out &&
|
||||||
|
test_i18ngrep "$tree (refs/tags/augustus44\\^:" out
|
||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user