summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dir.c3
-rw-r--r--dir.h6
-rwxr-xr-xt/t2501-cwd-empty.sh12
3 files changed, 12 insertions, 9 deletions
diff --git a/dir.c b/dir.c
index 94489298f4..97d6b71c87 100644
--- a/dir.c
+++ b/dir.c
@@ -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);
}
diff --git a/dir.h b/dir.h
index 83f46c0fb4..d6a5d03bec 100644
--- a/dir.h
+++ b/dir.h
@@ -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' '