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

Re: [PATCH] sparse-checkout: create leading directory

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Jan 20, 2022, 21:30 UTC
Message-ID
<220120.86mtjqks1b.gmgdl@evledraar.gmail.com>
In-Reply-To
<20220120185548.3648549-1-jonathantanmy@google.com>
On Thu, Jan 20 2022, Jonathan Tan wrote:
Show 19 quoted lines
> When creating the sparse-checkout file, Git does not create the leading
> directory, "$GIT_DIR/info", if it does not exist. This causes problems
> if the repository does not have that directory. Therefore, ensure that
> the leading directory is created.
>
> This is the only "open" in builtin/sparse-checkout.c that does not have
> a leading directory check. (The other one in write_patterns_and_update()
> does.)
>
> Note that the test needs to explicitly specify a template when running
> "git init" because the default template used in the tests has the
> "info/" directory included.
>
> Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
> ---
> This problem is being discussed in [1], and we also noticed this problem
> internally at $DAYJOB. Here's a fix.
>
> [1] https://lore.kernel.org/git/db6f47a3-0df3-505b-b391-6ca289fd61b5@gmail.com/
Thanks. This fix looks good to me.

Looking at my [1] my preliminary analysis there wasn't correct, i.e. there are other cases where we get the "sparse_filename" that you don't cover here, but e.g. if you do:

    <your test> &&
    rm -rf .git/info &&
    git sparse-checkout add foo

It looks like it will fail either way, so for those other codepaths we didn't need to ensure the .git/info.

Still, it would be nice to have the fix test for those cases too, i.e. how various operations are expected to behave if the user were to rm -rf .git/info. That'll obviously yield a broken repo, but we should still try to handle it gracefully.

1. https://lore.kernel.org/git/211220.86zgovt9bi.gmgdl@evledraar.gmail.com/
Show 37 quoted lines
> ---
>  builtin/sparse-checkout.c          | 3 +++
>  t/t1091-sparse-checkout-builtin.sh | 7 +++++++
>  2 files changed, 10 insertions(+)
>
> diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
> index 679c107036..2b0e1db2d2 100644
> --- a/builtin/sparse-checkout.c
> +++ b/builtin/sparse-checkout.c
> @@ -471,6 +471,9 @@ static int sparse_checkout_init(int argc, const char **argv)
>  		FILE *fp;
>  
>  		/* assume we are in a fresh repo, but update the sparse-checkout file */
> +		if (safe_create_leading_directories(sparse_filename))
> +			die(_("unable to create leading directories of %s"),
> +			    sparse_filename);
>  		fp = xfopen(sparse_filename, "w");
>  		if (!fp)
>  			die(_("failed to open '%s'"), sparse_filename);
> diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
> index 42776984fe..dba0737599 100755
> --- a/t/t1091-sparse-checkout-builtin.sh
> +++ b/t/t1091-sparse-checkout-builtin.sh
> @@ -79,6 +79,13 @@ test_expect_success 'git sparse-checkout init' '
>  	check_files repo a
>  '
>  
> +test_expect_success 'git sparse-checkout init in empty repo' '
> +	test_when_finished rm -rf empty-repo blank-template &&
> +	mkdir blank-template &&
> +	git init --template=blank-template empty-repo &&
> +	git -C empty-repo sparse-checkout init
> +'
> +
>  test_expect_success 'git sparse-checkout list after init' '
>  	git -C repo sparse-checkout list >actual &&
>  	cat >expect <<-\EOF &&

You're using an overly verbose way to say "no templates, please". You can squash this in, i.e. --template= is an explicitly supported way to do that.

diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
index dba07375993..1fe741d9cd5 100755
--- a/t/t1091-sparse-checkout-builtin.sh
+++ b/t/t1091-sparse-checkout-builtin.sh
@@ -80,9 +80,8 @@ test_expect_success 'git sparse-checkout init' '
 '
 
 test_expect_success 'git sparse-checkout init in empty repo' '
-	test_when_finished rm -rf empty-repo blank-template &&
-	mkdir blank-template &&
-	git init --template=blank-template empty-repo &&
+	test_when_finished rm -rf empty-repo &&
+	git init --template= empty-repo &&
 	git -C empty-repo sparse-checkout init
 '
 
Previous: Junio C HamanoNext: SZEDER Gábor
Message 3 of 14 in “sparse-checkout: create leading directory”
  1. sparse-checkout: create leading directoryJonathan Tan, Jan 20, 2022
  2. Junio C HamanoJan 20, 2022
  3. Ævar Arnfjörð BjarmasonJan 20, 2022
  4. SZEDER GáborJan 22, 2022
  5. sparse-checkout: create leading directoryJonathan Tan, Jan 21, 2022
  6. Ævar Arnfjörð BjarmasonJan 21, 2022
  7. Elijah NewrenJan 22, 2022
  8. Ævar Arnfjörð BjarmasonJan 22, 2022
  9. Elijah NewrenJan 22, 2022
  10. Ævar Arnfjörð BjarmasonJan 24, 2022
  11. Jonathan TanJan 24, 2022
  12. Elijah NewrenJan 25, 2022
  13. Elijah NewrenJan 22, 2022
  14. Jonathan TanJan 24, 2022

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.