summaryrefslogtreecommitdiff
path: root/builtin/stash.c
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2021-09-10 10:29:55 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-09-10 22:46:34 (GMT)
commit3d40e3723b1bc86d22136ff01b0787809a3267a4 (patch)
tree23fd8b711d79e7598525e2f5ce8f9fc49b6c629e /builtin/stash.c
parent4dbf7f30b1d6469474d6a7e6759c9f84d305b95c (diff)
downloadgit-3d40e3723b1bc86d22136ff01b0787809a3267a4.zip
git-3d40e3723b1bc86d22136ff01b0787809a3267a4.tar.gz
git-3d40e3723b1bc86d22136ff01b0787809a3267a4.tar.bz2
stash: avoid feeding directories to update-index
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> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/stash.c')
-rw-r--r--builtin/stash.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/builtin/stash.c b/builtin/stash.c
index 8f42360..9ad2940 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -313,6 +313,17 @@ static int reset_head(void)
return run_command(&cp);
}
+static int is_path_a_directory(const char *path)
+{
+ /*
+ * This function differs from abspath.c:is_directory() in that
+ * here we use lstat() instead of stat(); we do not want to
+ * follow symbolic links here.
+ */
+ 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 +331,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 */