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 rm -f B
109 git reset --hard
110 git checkout red
111 git pull . white && {
112 echo "BAD: should have conflicted"
113 exit 1
114 }
115 test "$(git ls-files -u B | wc -l)" -eq 3 || {
116 echo "BAD: should have left stages"
117 exit 1
118 }
119 test "$(git ls-files -s N | wc -l)" -eq 1 || {
120 echo "BAD: should have merged N"
121 exit 1
122 }
123 sed -ne "/^g/{
124 p
125 q
126 }" B | grep red || {
127 echo "BAD: should have listed our change first"
128 exit 1
129 }
130 test "$(git diff white N | wc -l)" -eq 0 || {
131 echo "BAD: should have taken colored branch"
132 exit 1
133 }
134'
135
136test_expect_success 'pull unrenaming branch into renaming one' \
137'
138 git reset --hard
139 git show-branch
140 git pull . master && {
141 echo "BAD: should have conflicted"
142 exit 1
143 }
144 test "$(git ls-files -u B | wc -l)" -eq 3 || {
145 echo "BAD: should have left stages"
146 exit 1
147 }
148 test "$(git ls-files -s N | wc -l)" -eq 1 || {
149 echo "BAD: should have merged N"
150 exit 1
151 }
152 sed -ne "/^g/{
153 p
154 q
155 }" B | grep red || {
156 echo "BAD: should have listed our change first"
157 exit 1
158 }
159 test "$(git diff white N | wc -l)" -eq 0 || {
160 echo "BAD: should have taken colored branch"
161 exit 1
162 }
163'
164
165test_expect_success 'pull conflicting renames' \
166'
167 git reset --hard
168 git show-branch
169 git pull . blue && {
170 echo "BAD: should have conflicted"
171 exit 1
172 }
173 test "$(git ls-files -u A | wc -l)" -eq 1 || {
174 echo "BAD: should have left a stage"
175 exit 1
176 }
177 test "$(git ls-files -u B | wc -l)" -eq 1 || {
178 echo "BAD: should have left a stage"
179 exit 1
180 }
181 test "$(git ls-files -u C | wc -l)" -eq 1 || {
182 echo "BAD: should have left a stage"
183 exit 1
184 }
185 test "$(git ls-files -s N | wc -l)" -eq 1 || {
186 echo "BAD: should have merged N"
187 exit 1
188 }
189 sed -ne "/^g/{
190 p
191 q
192 }" B | grep red || {
193 echo "BAD: should have listed our change first"
194 exit 1
195 }
196 test "$(git diff white N | wc -l)" -eq 0 || {
197 echo "BAD: should have taken colored branch"
198 exit 1
199 }
200'
201
202test_done