git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/3] stash: restore untracked files AFTER restoring tracked files

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Sep 8, 2021, 01:43 UTC
Message-ID
<ac8ca07481d2ed4156036c2441d10712a1b92b0e.1631065427.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1086.git.git.1631065426.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

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 similar problem to worry about in the opposite directory, because untracked files are always additive. Said another way, there's no way to "stash a removal of an untracked file" because if an untracked file is removed, git simply doesn't know about it.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 builtin/stash.c  | 6 +++---
 t/t3903-stash.sh | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/builtin/stash.c b/builtin/stash.c
index b85cf9d267e..9a1f6a5a854 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -530,9 +530,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";
@@ -567,6 +564,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 fc74918ccc0..bfd3158a502 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1325,7 +1325,7 @@ test_expect_success 'git stash succeeds despite directory/file change' '
 	)
 '
 
-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_v2 &&
 	(
 		cd directory_file_switch_v2 &&
-- 
gitgitgadget
Previous: Johannes SchindelinNext: Derrick Stolee
Message 6 of 14 in “Fix D/F issues in stash”
  1. 0/3 Fix D/F issues in stashElijah Newren via GitGitGadget, Sep 8, 2021
  2. 1/3 t3903: document a pair of directory/file bugsElijah Newren via GitGitGadget, Sep 8, 2021
  3. Junio C HamanoSep 8, 2021
  4. 2/3 stash: avoid feeding directories to update-indexElijah Newren via GitGitGadget, Sep 8, 2021
  5. Johannes SchindelinSep 8, 2021
  6. 3/3 stash: restore untracked files AFTER restoring tracked filesElijah Newren via GitGitGadget, Sep 8, 2021
  7. Derrick StoleeSep 8, 2021
  8. Junio C HamanoSep 8, 2021
  9. Johannes SchindelinSep 8, 2021
  10. Derrick StoleeSep 8, 2021
  11. 0/3 Fix D/F issues in stashElijah Newren via GitGitGadget, Sep 10, 2021
  12. 1/3 t3903: document a pair of directory/file bugsElijah Newren via GitGitGadget, Sep 10, 2021
  13. 2/3 stash: avoid feeding directories to update-indexElijah Newren via GitGitGadget, Sep 10, 2021
  14. 3/3 stash: restore untracked files AFTER restoring tracked filesElijah Newren via GitGitGadget, Sep 10, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.