forked from gitster/git
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove uncontested renamed files during merge.
Prior to 65ac6e9 we deleted a file from the working directory during a merge if the file existed before the merge started but was renamed by the branch being merged in. This broke in 65ac6e as git-merge-recursive did not actually update the working directory on an uncontested rename. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
- Loading branch information
Showing
2 changed files
with
98 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
#!/bin/sh | ||
|
||
test_description='Merge-recursive merging renames' | ||
. ./test-lib.sh | ||
|
||
test_expect_success setup \ | ||
' | ||
cat >A <<\EOF && | ||
a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | ||
b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb | ||
c cccccccccccccccccccccccccccccccccccccccccccccccc | ||
d dddddddddddddddddddddddddddddddddddddddddddddddd | ||
e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee | ||
f ffffffffffffffffffffffffffffffffffffffffffffffff | ||
g gggggggggggggggggggggggggggggggggggggggggggggggg | ||
h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh | ||
i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | ||
j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj | ||
k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk | ||
l llllllllllllllllllllllllllllllllllllllllllllllll | ||
m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm | ||
n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn | ||
o oooooooooooooooooooooooooooooooooooooooooooooooo | ||
EOF | ||
cat >M <<\EOF && | ||
A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||
B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||
C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||
D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD | ||
E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE | ||
F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF | ||
G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG | ||
H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH | ||
I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | ||
J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ | ||
K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK | ||
L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL | ||
M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM | ||
N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN | ||
O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | ||
EOF | ||
git add A M && | ||
git commit -m "initial has A and M" && | ||
git branch white && | ||
git branch red && | ||
git checkout white && | ||
sed -e "/^g /s/.*/g : white changes a line/" <A >B && | ||
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N && | ||
rm -f A M && | ||
git update-index --add --remove A B M N && | ||
git commit -m "white renames A->B, M->N" && | ||
git checkout red && | ||
echo created by red >R && | ||
git update-index --add R && | ||
git commit -m "red creates R" && | ||
git checkout master' | ||
|
||
# This test broke in 65ac6e9c3f47807cb603af07a6a9e1a43bc119ae | ||
test_expect_success 'merge white into red (A->B,M->N)' \ | ||
' | ||
git checkout -b red-white red && | ||
git merge white && | ||
git write-tree >/dev/null || { | ||
echo "BAD: merge did not complete" | ||
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 R || { | ||
echo "BAD: R does not exist in working directory" | ||
return 1 | ||
} | ||
test -f A && { | ||
echo "BAD: A still exists in working directory" | ||
return 1 | ||
} | ||
test -f M && { | ||
echo "BAD: M still exists in working directory" | ||
return 1 | ||
} | ||
return 0 | ||
' | ||
|
||
test_done |