summaryrefslogtreecommitdiff
path: root/merge-recursive.c
diff options
context:
space:
mode:
authorDavid Turner <dturner@twopensource.com>2014-05-01 20:21:09 -0400
committerJunio C Hamano <gitster@pobox.com>2014-05-07 13:53:10 -0700
commitae352c7f37ef2098e03ee86bc7fd75b210b17683 (patch)
treedaec7c4bdaadb3f2f82a3cdfaa5189e6f5142788 /merge-recursive.c
parent0bc85abb7aa9b24b093253018801a0fb43d01122 (diff)
downloadgit-ae352c7f37ef2098e03ee86bc7fd75b210b17683.tar.gz
merge-recursive.c: fix case-changing merge bug
On a case-insensitive filesystem, when merging, a file would be wrongly deleted from the working tree if an incoming commit had renamed it changing only its case. When merging a rename, the file with the old name would be deleted -- but since the filesystem considers the old name to be the same as the new name, the new file would in fact be deleted. We avoid this by not deleting files that have a case-clone in the index at stage 0. Signed-off-by: David Turner <dturner@twitter.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'merge-recursive.c')
-rw-r--r--merge-recursive.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/merge-recursive.c b/merge-recursive.c
index 4177092942..cab16fafb5 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -589,6 +589,12 @@ static int remove_file(struct merge_options *o, int clean,
return -1;
}
if (update_working_directory) {
+ if (ignore_case) {
+ struct cache_entry *ce;
+ ce = cache_file_exists(path, strlen(path), ignore_case);
+ if (ce && ce_stage(ce) == 0)
+ return 0;
+ }
if (remove_path(path))
return -1;
}