summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2021-09-10 10:29:56 +0000
committerJunio C Hamano <gitster@pobox.com>2021-09-10 15:46:34 -0700
commitbee8691f197ae6b74ca26081c1a3fa218e2b9db7 (patch)
treef486e82d5bdbe825cdc62929289d76a682ca4024
parent3d40e3723b1bc86d22136ff01b0787809a3267a4 (diff)
stash: restore untracked files AFTER restoring tracked files
If a user deletes a file and places a directory of untracked files there, then stashes all these changes, the untracked directory of files cannot be restored until after the corresponding file in the way is removed. So, restore changes to tracked files before restoring untracked files. There is no counterpart problem to worry about with the user deleting an untracked file and then add a tracked one in its place. Git does not track untracked files, and so will not know the untracked file was deleted, and thus won't be able to stash the removal of that file. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/stash.c6
-rwxr-xr-xt/t3903-stash.sh4
2 files changed, 5 insertions, 5 deletions
diff --git a/builtin/stash.c b/builtin/stash.c
index 9ad2940f87..5512f4942c 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -535,9 +535,6 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
}
}
- if (info->has_u && restore_untracked(&info->u_tree))
- return error(_("could not restore untracked files from stash"));
-
init_merge_options(&o, the_repository);
o.branch1 = "Updated upstream";
@@ -572,6 +569,9 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
unstage_changes_unless_new(&c_tree);
}
+ if (info->has_u && restore_untracked(&info->u_tree))
+ return error(_("could not restore untracked files from stash"));
+
if (!quiet) {
struct child_process cp = CHILD_PROCESS_INIT;
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 34d1ad9837..f0a82be9de 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1324,7 +1324,7 @@ test_expect_success 'git stash succeeds despite directory/file change' '
)
'
-test_expect_failure 'git stash can pop file -> directory saved changes' '
+test_expect_success 'git stash can pop file -> directory saved changes' '
test_create_repo directory_file_switch_v2 &&
(
cd directory_file_switch_v2 &&
@@ -1344,7 +1344,7 @@ test_expect_failure 'git stash can pop file -> directory saved changes' '
)
'
-test_expect_failure 'git stash can pop directory -> file saved changes' '
+test_expect_success 'git stash can pop directory -> file saved changes' '
test_create_repo directory_file_switch_v3 &&
(
cd directory_file_switch_v3 &&