1#!/bin/sh
2
3test_description='Merge-recursive merging renames'
4. ./test-lib.sh
5
6if test "$no_python"; then
7 echo "Skipping: no python => no recursive merge"
8 test_done
9 exit 0
10fi
11
12test_expect_success setup \
13'
14cat >A <<\EOF &&
15a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
16b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
17c cccccccccccccccccccccccccccccccccccccccccccccccc
18d dddddddddddddddddddddddddddddddddddddddddddddddd
19e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
20f ffffffffffffffffffffffffffffffffffffffffffffffff
21g gggggggggggggggggggggggggggggggggggggggggggggggg
22h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
23i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
24j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
25k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
26l llllllllllllllllllllllllllllllllllllllllllllllll
27m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
28n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
29o oooooooooooooooooooooooooooooooooooooooooooooooo
30EOF
31
32cat >M <<\EOF &&
33A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
34B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
35C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
36D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
37E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
38F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
39G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
40H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
41I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
42J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
43K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
44L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
45M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
46N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
47O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
48EOF
49
50git add A M &&
51git commit -m initial &&
52git branch white &&
53git branch red &&
54git branch blue &&
55
56sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
57mv A+ A &&
58git commit -a -m "master updates A" &&
59
60git checkout white &&
61sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
62sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
63rm -f A M &&
64git update-index --add --remove A B M N &&
65git commit -m "white renames A->B, M->N" &&
66
67git checkout red &&
68sed -e "/^g /s/.*/g : red changes a line/" <A >B &&
69sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
70rm -f A M &&
71git update-index --add --remove A B M N &&
72git commit -m "red renames A->B, M->N" &&
73
74git checkout blue &&
75sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&
76sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
77rm -f A M &&
78git update-index --add --remove A C M N &&
79git commit -m "blue renames A->C, M->N" &&
80
81git checkout master'
82
83test_expect_success 'pull renaming branch into unrenaming one' \
84'
85 git show-branch
86 git pull . white && {
87 echo "BAD: should have conflicted"
88 exit 1
89 }
90 git ls-files -s
91 test "$(git ls-files -u B | wc -l)" -eq 3 || {
92 echo "BAD: should have left stages for B"
93 exit 1
94 }
95 test "$(git ls-files -s N | wc -l)" -eq 1 || {
96 echo "BAD: should have merged N"
97 exit 1
98 }
99 sed -ne "/^g/{
100 p
101 q
102 }" B | grep master || {
103 echo "BAD: should have listed our change first"
104 exit 1
105 }
106 test "$(git diff white N | wc -l)" -eq 0 || {
107 echo "BAD: should have taken colored branch"
108 exit 1
109 }
110'
111
112test_expect_success 'pull renaming branch into another renaming one' \
113'
114 rm -f B
115 git reset --hard
116 git checkout red
117 git pull . white && {
118 echo "BAD: should have conflicted"
119 exit 1
120 }
121 test "$(git ls-files -u B | wc -l)" -eq 3 || {
122 echo "BAD: should have left stages"
123 exit 1
124 }
125 test "$(git ls-files -s N | wc -l)" -eq 1 || {
126 echo "BAD: should have merged N"
127 exit 1
128 }
129 sed -ne "/^g/{
130 p
131 q
132 }" B | grep red || {
133 echo "BAD: should have listed our change first"
134 exit 1
135 }
136 test "$(git diff white N | wc -l)" -eq 0 || {
137 echo "BAD: should have taken colored branch"
138 exit 1
139 }
140'
141
142test_expect_success 'pull unrenaming branch into renaming one' \
143'
144 git reset --hard
145 git show-branch
146 git pull . master && {
147 echo "BAD: should have conflicted"
148 exit 1
149 }
150 test "$(git ls-files -u B | wc -l)" -eq 3 || {
151 echo "BAD: should have left stages"
152 exit 1
153 }
154 test "$(git ls-files -s N | wc -l)" -eq 1 || {
155 echo "BAD: should have merged N"
156 exit 1
157 }
158 sed -ne "/^g/{
159 p
160 q
161 }" B | grep red || {
162 echo "BAD: should have listed our change first"
163 exit 1
164 }
165 test "$(git diff white N | wc -l)" -eq 0 || {
166 echo "BAD: should have taken colored branch"
167 exit 1
168 }
169'
170
171test_expect_success 'pull conflicting renames' \
172'
173 git reset --hard
174 git show-branch
175 git pull . blue && {
176 echo "BAD: should have conflicted"
177 exit 1
178 }
179 test "$(git ls-files -u A | wc -l)" -eq 1 || {
180 echo "BAD: should have left a stage"
181 exit 1
182 }
183 test "$(git ls-files -u B | wc -l)" -eq 1 || {
184 echo "BAD: should have left a stage"
185 exit 1
186 }
187 test "$(git ls-files -u C | wc -l)" -eq 1 || {
188 echo "BAD: should have left a stage"
189 exit 1
190 }
191 test "$(git ls-files -s N | wc -l)" -eq 1 || {
192 echo "BAD: should have merged N"
193 exit 1
194 }
195 sed -ne "/^g/{
196 p
197 q
198 }" B | grep red || {
199 echo "BAD: should have listed our change first"
200 exit 1
201 }
202 test "$(git diff white N | wc -l)" -eq 0 || {
203 echo "BAD: should have taken colored branch"
204 exit 1
205 }
206'
207
208test_done