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