]> git.ipfire.org Git - thirdparty/git.git/commitdiff
stash: restore untracked files AFTER restoring tracked files
authorElijah Newren <newren@gmail.com>
Fri, 10 Sep 2021 10:29:56 +0000 (10:29 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 10 Sep 2021 22:46:34 +0000 (15:46 -0700)
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>
builtin/stash.c
t/t3903-stash.sh

index 9ad2940f87af2c7d53fe97c44c5390c32d51d227..5512f4942cd67bbe3aaecef8ccc05af19be2da7a 100644 (file)
@@ -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;
 
index 34d1ad9837f7466a1fd95776e4db1a60e19fdb34..f0a82be9de7654a0956b1d9a4f24e161869e021e 100755 (executable)
@@ -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 &&