Re: [PATCH] stash: do not return before restoring untracked files
From: Junio C Hamano <hidden>
Date: 2022-01-04 23:46:31
"Elijah Newren via GitGitGadget" [off-list ref] writes:
quoted hunk
diff --git a/builtin/stash.c b/builtin/stash.c index 18c812bbe03..397210168da 100644 --- a/builtin/stash.c +++ b/builtin/stash.c@@ -561,18 +561,19 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, if (index) fprintf_ln(stderr, _("Index was not unstashed.")); - return ret; + goto restore_untracked; } if (has_index) { if (reset_tree(&index_tree, 0, 0)) - return -1; + ret = -1; } else { unstage_changes_unless_new(&c_tree); } +restore_untracked: if (info->has_u && restore_untracked(&info->u_tree)) - return error(_("could not restore untracked files from stash")); + ret = error(_("could not restore untracked files from stash"));
In other words, instead of doing an early return, we try to resurrect untracked ones and always show the "git status" before returning. I think that takes us in the right direction. I looked at other early returns in this function, and while there may be a room for improvements when the --index stash does not apply well, I think it can be left outside the topic of this patch. Will queue. Thanks.
quoted hunk
if (!quiet) { struct child_process cp = CHILD_PROCESS_INIT;@@ -592,7 +593,7 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, run_command(&cp); } - return 0; + return ret; } static int apply_stash(int argc, const char **argv, const char *prefix)diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index 2c66cfbc3b7..2a7d8e511db 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh@@ -1376,4 +1376,28 @@ test_expect_success 'git stash can pop directory -> file saved changes' ' ) ' +test_expect_success 'restore untracked files even when we hit conflicts' ' + git init restore_untracked_after_conflict && + ( + cd restore_untracked_after_conflict && + + echo hi >a && + echo there >b && + git add . && + git commit -m first && + echo hello >a && + echo something >c && + + git stash push --include-untracked && + + echo conflict >a && + git add a && + git commit -m second && + + test_must_fail git stash pop && + + test_path_is_file c + ) +' + test_donebase-commit: 2ae0a9cb8298185a94e5998086f380a355dd8907