git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / 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 2/3] stash: avoid feeding directories to update-index
Date: Wed, 08 Sep 2021 01:43:45 +0000	[thread overview]
Message-ID: <c7f5ae66a9204a4190b21bcb1338fd80fb907f33.1631065427.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1086.git.git.1631065426.gitgitgadget@gmail.com>

From: Elijah Newren <newren@gmail.com>

When a file is removed from the cache, but there is a file of the same
name present in the working directory, we would normally treat that file
in the working directory as untracked.  However, in the case of stash,
doing that would prevent a simple 'git stash push', because the untracked
file would be in the way of restoring the deleted file.

git stash, however, blindly assumes that whatever is in the working
directory for a deleted file is wanted and passes that path along to
update-index.  That causes problems when the working directory contains
a directory with the same name as the deleted file.  Add some code for
this special case that will avoid passing directory names to
update-index.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 builtin/stash.c  | 9 +++++++++
 t/t3903-stash.sh | 2 +-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/builtin/stash.c b/builtin/stash.c
index 8f42360ca91..b85cf9d267e 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -313,6 +313,12 @@ static int reset_head(void)
 	return run_command(&cp);
 }
 
+static int is_path_a_directory(const char *path)
+{
+	struct stat st;
+	return (!lstat(path, &st) && S_ISDIR(st.st_mode));
+}
+
 static void add_diff_to_buf(struct diff_queue_struct *q,
 			    struct diff_options *options,
 			    void *data)
@@ -320,6 +326,9 @@ static void add_diff_to_buf(struct diff_queue_struct *q,
 	int i;
 
 	for (i = 0; i < q->nr; i++) {
+		if (is_path_a_directory(q->queue[i]->one->path))
+			continue;
+
 		strbuf_addstr(data, q->queue[i]->one->path);
 
 		/* NUL-terminate: will be fed to update-index -z */
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 0727a494aa4..fc74918ccc0 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1307,7 +1307,7 @@ test_expect_success 'stash -c stash.useBuiltin=false warning ' '
 	test_must_be_empty err
 '
 
-test_expect_failure 'git stash succeeds despite directory/file change' '
+test_expect_success 'git stash succeeds despite directory/file change' '
 	test_create_repo directory_file_switch_v1 &&
 	(
 		cd directory_file_switch_v1 &&
-- 
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 ` Elijah Newren via GitGitGadget [this message]
2021-09-08  8:02   ` [PATCH 2/3] stash: avoid feeding directories to update-index Johannes Schindelin
2021-09-08  1:43 ` [PATCH 3/3] stash: restore untracked files AFTER restoring tracked files Elijah Newren via GitGitGadget
2021-09-08 13:15   ` 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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=c7f5ae66a9204a4190b21bcb1338fd80fb907f33.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).