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' \
99 echo "BAD: should have conflicted"
103 test "$(git ls-files -u B | wc -l)" -eq 3 || {
104 echo "BAD: should have left stages for B"
107 test "$(git ls-files -s N | wc -l)" -eq 1 || {
108 echo "BAD: should have merged N"
114 }" B | grep master || {
115 echo "BAD: should have listed our change first"
118 test "$(git diff white N | wc -l)" -eq 0 || {
119 echo "BAD: should have taken colored branch"
124 test_expect_success 'pull renaming branch into another renaming one' \
129 git pull . white && {
130 echo "BAD: should have conflicted"
133 test "$(git ls-files -u B | wc -l)" -eq 3 || {
134 echo "BAD: should have left stages"
137 test "$(git ls-files -s N | wc -l)" -eq 1 || {
138 echo "BAD: should have merged N"
145 echo "BAD: should have listed our change first"
148 test "$(git diff white N | wc -l)" -eq 0 || {
149 echo "BAD: should have taken colored branch"
154 test_expect_success 'pull unrenaming branch into renaming one' \
158 git pull . master && {
159 echo "BAD: should have conflicted"
162 test "$(git ls-files -u B | wc -l)" -eq 3 || {
163 echo "BAD: should have left stages"
166 test "$(git ls-files -s N | wc -l)" -eq 1 || {
167 echo "BAD: should have merged N"
174 echo "BAD: should have listed our change first"
177 test "$(git diff white N | wc -l)" -eq 0 || {
178 echo "BAD: should have taken colored branch"
183 test_expect_success 'pull conflicting renames' \
188 echo "BAD: should have conflicted"
191 test "$(git ls-files -u A | wc -l)" -eq 1 || {
192 echo "BAD: should have left a stage"
195 test "$(git ls-files -u B | wc -l)" -eq 1 || {
196 echo "BAD: should have left a stage"
199 test "$(git ls-files -u C | wc -l)" -eq 1 || {
200 echo "BAD: should have left a stage"
203 test "$(git ls-files -s N | wc -l)" -eq 1 || {
204 echo "BAD: should have merged N"
211 echo "BAD: should have listed our change first"
214 test "$(git diff white N | wc -l)" -eq 0 || {
215 echo "BAD: should have taken colored branch"
220 test_expect_success 'interference with untracked working tree file' '
224 echo >A this file should not matter
225 git pull . white && {
226 echo "BAD: should have conflicted"
230 echo "BAD: should have left A intact"
235 test_expect_success 'interference with untracked working tree file' '
241 echo >A this file should not matter
243 echo "BAD: should have conflicted"
247 echo "BAD: should have left A intact"
252 test_expect_success 'interference with untracked working tree file' '
256 git checkout -f master
259 git pull . yellow || {
260 echo "BAD: should have cleanly merged"
264 echo "BAD: should have removed M"
267 git reset --hard anchor
270 test_expect_success 'updated working tree file should prevent the merge' '
274 git checkout -f master
277 echo >>M one line addition
279 git pull . yellow && {
280 echo "BAD: should have complained"
283 test_cmp M M.saved || {
284 echo "BAD: should have left M intact"
290 test_expect_success 'updated working tree file should prevent the merge' '
294 git checkout -f master
297 echo >>M one line addition
300 git pull . yellow && {
301 echo "BAD: should have complained"
304 test_cmp M M.saved || {
305 echo "BAD: should have left M intact"
311 test_expect_success 'interference with untracked working tree file' '
315 git checkout -f yellow
318 echo >M this file should not matter
319 git pull . master || {
320 echo "BAD: should have cleanly merged"
324 echo "BAD: should have left M intact"
327 git ls-files -s | grep M && {
328 echo "BAD: M must be untracked in the result"
331 git reset --hard anchor
334 test_expect_success 'merge of identical changes in a renamed file' '
337 git checkout change+rename &&
338 GIT_MERGE_VERBOSITY=3 git merge change | grep "^Skipped B" &&
339 git reset --hard HEAD^ &&
340 git checkout change &&
341 GIT_MERGE_VERBOSITY=3 git merge change+rename | grep "^Skipped B"