summaryrefslogtreecommitdiff
path: root/builtin/sparse-checkout.c
diff options
context:
space:
mode:
authorDerrick Stolee <dstolee@microsoft.com>2020-01-24 21:19:33 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-01-24 21:26:54 (GMT)
commit3c754067a1164ffafd965dcd44a9f004e6100e42 (patch)
tree619430fbdc567577d6d95fc382382bbf83d1ba89 /builtin/sparse-checkout.c
parentd622c34396b3ea1a81f07d951ee1112f83d9330c (diff)
downloadgit-3c754067a1164ffafd965dcd44a9f004e6100e42.zip
git-3c754067a1164ffafd965dcd44a9f004e6100e42.tar.gz
git-3c754067a1164ffafd965dcd44a9f004e6100e42.tar.bz2
sparse-checkout: create leading directories
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>
Diffstat (limited to 'builtin/sparse-checkout.c')
-rw-r--r--builtin/sparse-checkout.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index b3bed89..3cee8ab 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -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);