]> git.ipfire.org Git - thirdparty/git.git/commitdiff
symlinks: do not include startup_info->original_cwd in dir removal
authorElijah Newren <newren@gmail.com>
Thu, 9 Dec 2021 05:08:29 +0000 (05:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 9 Dec 2021 21:33:13 +0000 (13:33 -0800)
symlinks has a pair of schedule_dir_for_removal() and
remove_scheduled_dirs() functions that ensure that directories made
empty by removing other files also themselves get removed.  However, we
want to exclude startup_info->original_cwd and leave it around.  This
avoids the user getting confused by subsequent git commands (and non-git
commands) that would otherwise report confusing messages about being
unable to read the current working directory.

Acked-by: Derrick Stolee <stolee@gmail.com>
Acked-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
symlinks.c
t/t2501-cwd-empty.sh

index 5232d02020c725abdf0b486843c703403dcfc012..c667baa949b685c6c78c41eb8d272410c7574fe4 100644 (file)
@@ -279,7 +279,9 @@ static void do_remove_scheduled_dirs(int new_len)
 {
        while (removal.len > new_len) {
                removal.buf[removal.len] = '\0';
-               if (rmdir(removal.buf))
+               if ((startup_info->original_cwd &&
+                    !strcmp(removal.buf, startup_info->original_cwd)) ||
+                   rmdir(removal.buf))
                        break;
                do {
                        removal.len--;
@@ -293,6 +295,10 @@ void schedule_dir_for_removal(const char *name, int len)
 {
        int match_len, last_slash, i, previous_slash;
 
+       if (startup_info->original_cwd &&
+           !strcmp(name, startup_info->original_cwd))
+               return; /* Do not remove the current working directory */
+
        match_len = last_slash = i =
                longest_path_match(name, len, removal.buf, removal.len,
                                   &previous_slash);
index 5af1fec6fec2f63207046372e0d6ca6978e7fa66..e4502d24d57f7726d5dc75fbb30f6e190c7fb41e 100755 (executable)
@@ -109,7 +109,7 @@ test_required_dir_removal () {
 }
 
 test_expect_success 'checkout does not clean cwd incidentally' '
-       test_incidental_dir_removal failure git checkout init
+       test_incidental_dir_removal success git checkout init
 '
 
 test_expect_success 'checkout fails if cwd needs to be removed' '
@@ -117,7 +117,7 @@ test_expect_success 'checkout fails if cwd needs to be removed' '
 '
 
 test_expect_success 'reset --hard does not clean cwd incidentally' '
-       test_incidental_dir_removal failure git reset --hard init
+       test_incidental_dir_removal success git reset --hard init
 '
 
 test_expect_success 'reset --hard fails if cwd needs to be removed' '
@@ -125,7 +125,7 @@ test_expect_success 'reset --hard fails if cwd needs to be removed' '
 '
 
 test_expect_success 'merge does not clean cwd incidentally' '
-       test_incidental_dir_removal failure git merge reverted
+       test_incidental_dir_removal success git merge reverted
 '
 
 # This file uses some simple merges where
@@ -158,7 +158,7 @@ test_expect_success 'merge fails if cwd needs to be removed' '
 '
 
 test_expect_success 'cherry-pick does not clean cwd incidentally' '
-       test_incidental_dir_removal failure git cherry-pick reverted
+       test_incidental_dir_removal success git cherry-pick reverted
 '
 
 test_expect_success 'cherry-pick fails if cwd needs to be removed' '
@@ -174,7 +174,7 @@ test_expect_success 'rebase fails if cwd needs to be removed' '
 '
 
 test_expect_success 'revert does not clean cwd incidentally' '
-       test_incidental_dir_removal failure git revert HEAD
+       test_incidental_dir_removal success git revert HEAD
 '
 
 test_expect_success 'revert fails if cwd needs to be removed' '