git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/2] fsck --name-objects: be more careful parsing generation numbers

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 10, 2021, 20:38 UTC
Message-ID
<xmqqpn171ww7.fsf@gitster.c.googlers.com>
In-Reply-To
<03efb76b31e46ffe340fe0c6ab5fc4d804b2c273.1612980090.git.gitgitgadget@gmail.com>

"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> writes:

Show 17 quoted lines
> From: Johannes Schindelin <johannes.schindelin@gmx.de>
>
> 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.
Thanks; will queue.
Show 46 quoted lines
>
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>  fsck.c          |  5 +++++
>  t/t1450-fsck.sh | 10 ++++++----
>  2 files changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/fsck.c b/fsck.c
> index 73f30773f28a..83d727c6fe33 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;
> +			}
>  		}
>  	}
>  
> diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
> index 779f700ac4a0..bfa3588f37ab 100755
> --- a/t/t1450-fsck.sh
> +++ b/t/t1450-fsck.sh
> @@ -607,13 +607,15 @@ test_expect_success 'fsck --name-objects' '
>  	git init name-objects &&
>  	(
>  		cd name-objects &&
> +		git config core.logAllRefUpdates false &&
>  		test_commit julius caesar.t &&
> -		test_commit augustus &&
> -		test_commit caesar &&
> +		test_commit augustus44 &&
> +		test_commit caesar  &&
>  		remove_object $(git rev-parse julius:caesar.t) &&
> -		test_must_fail git fsck --name-objects >out &&
>  		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
>  	)
>  '
Previous: Johannes Schindelin via GitGitGadget
Message 7 of 7 in “Fix fsck --name-objects bug”
  1. 0/2 Fix fsck --name-objects bugJohannes Schindelin via GitGitGadget, Feb 10, 2021
  2. 1/2 t1450: robustify `remove_object()`Johannes Schindelin via GitGitGadget, Feb 10, 2021
  3. Junio C HamanoFeb 10, 2021
  4. Taylor BlauFeb 10, 2021
  5. Junio C HamanoFeb 11, 2021
  6. 2/2 fsck --name-objects: be more careful parsing generation numbersJohannes Schindelin via GitGitGadget, Feb 10, 2021
  7. Junio C HamanoFeb 10, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.