3 test_description
='Merge-recursive merging renames'
6 test_expect_success setup \
9 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
10 b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
11 c cccccccccccccccccccccccccccccccccccccccccccccccc
12 d dddddddddddddddddddddddddddddddddddddddddddddddd
13 e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
14 f ffffffffffffffffffffffffffffffffffffffffffffffff
15 g gggggggggggggggggggggggggggggggggggggggggggggggg
16 h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
17 i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
18 j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
19 k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
20 l llllllllllllllllllllllllllllllllllllllllllllllll
21 m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
22 n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
23 o oooooooooooooooooooooooooooooooooooooooooooooooo
27 A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
28 B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
29 C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
30 D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
31 E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
32 F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
33 G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
34 H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
35 I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
36 J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
37 K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
38 L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
39 M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
40 N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
41 O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
45 git commit -m "initial has A and M" &&
51 git branch change+rename &&
53 sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
55 git commit -a -m "master updates A" &&
57 git checkout yellow &&
59 git commit -a -m "yellow removes M" &&
62 sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
63 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
65 git update-index --add --remove A B M N &&
66 git commit -m "white renames A->B, M->N" &&
69 sed -e "/^g /s/.*/g : red changes a line/" <A >B &&
70 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
72 git update-index --add --remove A B M N &&
73 git commit -m "red renames A->B, M->N" &&
76 sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&
77 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
79 git update-index --add --remove A C M N &&
80 git commit -m "blue renames A->C, M->N" &&
82 git checkout change &&
83 sed -e "/^g /s/.*/g : changed line/" <A >A+ &&
85 git commit -q -a -m "changed" &&
87 git checkout change+rename &&
88 sed -e "/^g /s/.*/g : changed line/" <A >B &&
90 git update-index --add B &&
91 git commit -q -a -m "changed and renamed" &&
95 test_expect_success
'pull renaming branch into unrenaming one' \
98 test_must_fail git pull . white &&
100 test "$(git ls-files -u B | wc -l)" -eq 3 &&
101 test "$(git ls-files -s N | wc -l)" -eq 1 &&
105 }" B | grep master &&
106 test "$(git diff white N | wc -l)" -eq 0
109 test_expect_success
'pull renaming branch into another renaming one' \
114 test_must_fail git pull . white &&
115 test "$(git ls-files -u B | wc -l)" -eq 3 &&
116 test "$(git ls-files -s N | wc -l)" -eq 1 &&
121 test "$(git diff white N | wc -l)" -eq 0
124 test_expect_success
'pull unrenaming branch into renaming one' \
128 test_must_fail git pull . master &&
129 test "$(git ls-files -u B | wc -l)" -eq 3 &&
130 test "$(git ls-files -s N | wc -l)" -eq 1 &&
135 test "$(git diff white N | wc -l)" -eq 0
138 test_expect_success
'pull conflicting renames' \
142 test_must_fail git pull . blue &&
143 test "$(git ls-files -u A | wc -l)" -eq 1 &&
144 test "$(git ls-files -u B | wc -l)" -eq 1 &&
145 test "$(git ls-files -u C | wc -l)" -eq 1 &&
146 test "$(git ls-files -s N | wc -l)" -eq 1 &&
151 test "$(git diff white N | wc -l)" -eq 0
154 test_expect_success
'interference with untracked working tree file' '
158 echo >A this file should not matter
159 test_must_fail git pull . white &&
163 test_expect_success
'interference with untracked working tree file' '
169 echo >A this file should not matter
170 test_must_fail git pull . red &&
174 test_expect_success
'interference with untracked working tree file' '
178 git checkout -f master
183 git reset --hard anchor
186 test_expect_success
'updated working tree file should prevent the merge' '
190 git checkout -f master
193 echo >>M one line addition
195 test_must_fail git pull . yellow &&
200 test_expect_success
'updated working tree file should prevent the merge' '
204 git checkout -f master
207 echo >>M one line addition
210 test_must_fail git pull . yellow &&
215 test_expect_success
'interference with untracked working tree file' '
219 git checkout -f yellow
222 echo >M this file should not matter
225 ! (git ls-files -s | grep M) &&
226 git reset --hard anchor
229 test_expect_success
'merge of identical changes in a renamed file' '
232 git checkout change+rename &&
233 GIT_MERGE_VERBOSITY=3 git merge change | grep "^Skipped B" &&
234 git reset --hard HEAD^ &&
235 git checkout change &&
236 GIT_MERGE_VERBOSITY=3 git merge change+rename | grep "^Skipped B"