All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>, Elijah Newren <newren@gmail.com>
Subject: [PATCH 3/3] stash: restore untracked files AFTER restoring tracked files
Date: Wed, 08 Sep 2021 01:43:46 +0000	[thread overview]
Message-ID: <ac8ca07481d2ed4156036c2441d10712a1b92b0e.1631065427.git.gitgitgadget@gmail.com> (raw)
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

  parent reply	other threads:[~2021-09-08  1:43 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-08  1:43 [PATCH 0/3] Fix D/F issues in stash Elijah Newren via GitGitGadget
2021-09-08  1:43 ` [PATCH 1/3] t3903: document a pair of directory/file bugs Elijah Newren via GitGitGadget
2021-09-08 16:19   ` Junio C Hamano
2021-09-08  1:43 ` [PATCH 2/3] stash: avoid feeding directories to update-index Elijah Newren via GitGitGadget
2021-09-08  8:02   ` Johannes Schindelin
2021-09-08  1:43 ` Elijah Newren via GitGitGadget [this message]
2021-09-08 13:15   ` [PATCH 3/3] stash: restore untracked files AFTER restoring tracked files Derrick Stolee
2021-09-08 16:30   ` Junio C Hamano
2021-09-08  8:04 ` [PATCH 0/3] Fix D/F issues in stash Johannes Schindelin
2021-09-08 13:15   ` Derrick Stolee
2021-09-10 10:29 ` [PATCH v2 " Elijah Newren via GitGitGadget
2021-09-10 10:29   ` [PATCH v2 1/3] t3903: document a pair of directory/file bugs Elijah Newren via GitGitGadget
2021-09-10 10:29   ` [PATCH v2 2/3] stash: avoid feeding directories to update-index Elijah Newren via GitGitGadget
2021-09-10 10:29   ` [PATCH v2 3/3] stash: restore untracked files AFTER restoring tracked files Elijah Newren via GitGitGadget

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ac8ca07481d2ed4156036c2441d10712a1b92b0e.1631065427.git.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=newren@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.