Skip to content

Commit

Permalink
symlinks: do not include startup_info->original_cwd in dir removal
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Ævar Arnfjörð Bjarmason <[email protected]>
Signed-off-by: Elijah Newren <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
newren authored and gitster committed Dec 9, 2021
1 parent 0b0ee33 commit 00fcce2
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 6 deletions.
8 changes: 7 additions & 1 deletion symlinks.c
Original file line number Diff line number Diff line change
Expand Up @@ -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--;
Expand All @@ -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);
Expand Down
10 changes: 5 additions & 5 deletions t/t2501-cwd-empty.sh
Original file line number Diff line number Diff line change
Expand Up @@ -109,23 +109,23 @@ 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' '
test_required_dir_removal success git checkout fd_conflict
'

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' '
test_required_dir_removal success git reset --hard fd_conflict
'

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
Expand Down Expand Up @@ -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' '
Expand All @@ -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' '
Expand Down

0 comments on commit 00fcce2

Please sign in to comment.