diff options
-rw-r--r-- | dir.c | 3 | ||||
-rw-r--r-- | dir.h | 6 | ||||
-rwxr-xr-x | t/t2501-cwd-empty.sh | 12 |
3 files changed, 12 insertions, 9 deletions
@@ -3327,6 +3327,9 @@ int remove_path(const char *name) slash = dirs + (slash - name); do { *slash = '\0'; + if (startup_info->original_cwd && + !strcmp(startup_info->original_cwd, dirs)) + break; } while (rmdir(dirs) == 0 && (slash = strrchr(dirs, '/'))); free(dirs); } @@ -504,7 +504,11 @@ int get_sparse_checkout_patterns(struct pattern_list *pl); */ int remove_dir_recursively(struct strbuf *path, int flag); -/* tries to remove the path with empty directories along it, ignores ENOENT */ +/* + * Tries to remove the path, along with leading empty directories so long as + * those empty directories are not startup_info->original_cwd. Ignores + * ENOENT. + */ int remove_path(const char *path); int fspathcmp(const char *a, const char *b); diff --git a/t/t2501-cwd-empty.sh b/t/t2501-cwd-empty.sh index be9ef903bd..ce2efb9d30 100755 --- a/t/t2501-cwd-empty.sh +++ b/t/t2501-cwd-empty.sh @@ -182,12 +182,12 @@ test_expect_success 'revert fails if cwd needs to be removed' ' ' test_expect_success 'rm does not clean cwd incidentally' ' - test_incidental_dir_removal failure git rm bar/baz.t + test_incidental_dir_removal success git rm bar/baz.t ' test_expect_success 'apply does not remove cwd incidentally' ' git diff HEAD HEAD~1 >patch && - test_incidental_dir_removal failure git apply ../patch + test_incidental_dir_removal success git apply ../patch ' test_incidental_untracked_dir_removal () { @@ -271,12 +271,8 @@ test_expect_success '`rm -rf dir` even with only tracked files will remove somet ) && test_path_is_missing a/b/c/tracked && - ## We would prefer if a/b was still present, though empty, since it - ## was the current working directory - #test_path_is_dir a/b - ## But the current behavior is that it not only deletes the directory - ## a/b as requested, but also goes and deletes a - test_path_is_missing a + test_path_is_missing a/b/c && + test_path_is_dir a/b ' test_expect_success 'git version continues working from a deleted dir' ' |