summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--merge-recursive.c2
-rwxr-xr-xt/t6023-merge-rename-nocruft.sh42
2 files changed, 43 insertions, 1 deletions
diff --git a/merge-recursive.c b/merge-recursive.c
index a5e6845..a68fcc6 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -891,7 +891,7 @@ static int process_renames(struct path_list *a_renames,
struct diff_filespec src_other, dst_other;
int try_merge, stage = a_renames == renames1 ? 3: 2;
- remove_file(1, ren1_src, index_only);
+ remove_file(1, ren1_src, index_only || stage == 3);
hashcpy(src_other.sha1, ren1->src_entry->stages[stage].sha);
src_other.mode = ren1->src_entry->stages[stage].mode;
diff --git a/t/t6023-merge-rename-nocruft.sh b/t/t6023-merge-rename-nocruft.sh
index 69c66cf..65be95f 100755
--- a/t/t6023-merge-rename-nocruft.sh
+++ b/t/t6023-merge-rename-nocruft.sh
@@ -45,6 +45,7 @@ git add A M &&
git commit -m "initial has A and M" &&
git branch white &&
git branch red &&
+git branch blue &&
git checkout white &&
sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
@@ -58,6 +59,13 @@ echo created by red >R &&
git update-index --add R &&
git commit -m "red creates R" &&
+git checkout blue &&
+sed -e "/^o /s/.*/g : blue changes a line/" <A >B &&
+rm -f A &&
+mv B A &&
+git update-index A &&
+git commit -m "blue modify A" &&
+
git checkout master'
# This test broke in 65ac6e9c3f47807cb603af07a6a9e1a43bc119ae
@@ -94,4 +102,38 @@ test_expect_success 'merge white into red (A->B,M->N)' \
return 0
'
+# This test broke in 8371234ecaaf6e14fe3f2082a855eff1bbd79ae9
+test_expect_success 'merge blue into white (A->B, mod A, A untracked)' \
+'
+ git checkout -b white-blue white &&
+ echo dirty >A &&
+ git merge blue &&
+ git write-tree >/dev/null || {
+ echo "BAD: merge did not complete"
+ return 1
+ }
+
+ test -f A || {
+ echo "BAD: A does not exist in working directory"
+ return 1
+ }
+ test `cat A` = dirty || {
+ echo "BAD: A content is wrong"
+ return 1
+ }
+ test -f B || {
+ echo "BAD: B does not exist in working directory"
+ return 1
+ }
+ test -f N || {
+ echo "BAD: N does not exist in working directory"
+ return 1
+ }
+ test -f M && {
+ echo "BAD: M still exists in working directory"
+ return 1
+ }
+ return 0
+'
+
test_done