]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-checkout: create leading directories
authorDerrick Stolee <dstolee@microsoft.com>
Fri, 24 Jan 2020 21:19:33 +0000 (21:19 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 24 Jan 2020 21:26:54 +0000 (13:26 -0800)
The 'git init' command creates the ".git/info" directory and fills it
with some default files. However, 'git worktree add' does not create
the info directory for that worktree. This causes a problem when running
"git sparse-checkout init" inside a worktree. While care was taken to
allow the sparse-checkout config to be specific to a worktree, this
initialization was untested.

Safely create the leading directories for the sparse-checkout file. This
is the safest thing to do even without worktrees, as a user could delete
their ".git/info" directory and expect Git to recover safely.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/sparse-checkout.c
t/t1091-sparse-checkout-builtin.sh

index b3bed891cb15e9a97a587cf2a6dab49f309578d2..3cee8ab46e548f0a93216f6b03eb875530f0c627 100644 (file)
@@ -199,6 +199,10 @@ static int write_patterns_and_update(struct pattern_list *pl)
        int result;
 
        sparse_filename = get_sparse_checkout_filename();
+
+       if (safe_create_leading_directories(sparse_filename))
+               die(_("failed to create directory for sparse-checkout file"));
+
        fd = hold_lock_file_for_update(&lk, sparse_filename,
                                      LOCK_DIE_ON_ERROR);
 
index e28e1c797f943296b63dfd5ffe3b6c311bb74a21..43d1f7520ce4263afafbf5f20ecdea392a06cb03 100755 (executable)
@@ -295,4 +295,14 @@ test_expect_success 'interaction with submodules' '
        check_files super/modules/child a deep folder1 folder2
 '
 
+test_expect_success 'different sparse-checkouts with worktrees' '
+       git -C repo worktree add --detach ../worktree &&
+       check_files worktree "a deep folder1 folder2" &&
+       git -C worktree sparse-checkout init --cone &&
+       git -C repo sparse-checkout set folder1 &&
+       git -C worktree sparse-checkout set deep/deeper1 &&
+       check_files repo a folder1 &&
+       check_files worktree a deep
+'
+
 test_done