Merge branch 'rs/opt-help-text'
[git/jnareb-git.git] / t / t6022-merge-rename.sh
blob83efc7abf5f15c9a5603107f2223454cd32f9abc
1 #!/bin/sh
3 test_description='Merge-recursive merging renames'
4 . ./test-lib.sh
6 test_expect_success setup \
8 cat >A <<\EOF &&
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
24 EOF
26 cat >M <<\EOF &&
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
42 EOF
44 git add A M &&
45 git commit -m "initial has A and M" &&
46 git branch white &&
47 git branch red &&
48 git branch blue &&
49 git branch yellow &&
50 git branch change &&
51 git branch change+rename &&
53 sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
54 mv A+ A &&
55 git commit -a -m "master updates A" &&
57 git checkout yellow &&
58 rm -f M &&
59 git commit -a -m "yellow removes M" &&
61 git checkout white &&
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 &&
64 rm -f A M &&
65 git update-index --add --remove A B M N &&
66 git commit -m "white renames A->B, M->N" &&
68 git checkout red &&
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 &&
71 rm -f A M &&
72 git update-index --add --remove A B M N &&
73 git commit -m "red renames A->B, M->N" &&
75 git checkout blue &&
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 &&
78 rm -f A M &&
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+ &&
84 mv A+ A &&
85 git commit -q -a -m "changed" &&
87 git checkout change+rename &&
88 sed -e "/^g /s/.*/g : changed line/" <A >B &&
89 rm A &&
90 git update-index --add B &&
91 git commit -q -a -m "changed and renamed" &&
93 git checkout master'
95 test_expect_success 'pull renaming branch into unrenaming one' \
97 git show-branch &&
98 test_expect_code 1 git pull . white &&
99 git ls-files -s &&
100 git ls-files -u B >b.stages &&
101 test_line_count = 3 b.stages &&
102 git ls-files -s N >n.stages &&
103 test_line_count = 1 n.stages &&
104 sed -ne "/^g/{
107 }" B | grep master &&
108 git diff --exit-code white N
111 test_expect_success 'pull renaming branch into another renaming one' \
113 rm -f B &&
114 git reset --hard &&
115 git checkout red &&
116 test_expect_code 1 git pull . white &&
117 git ls-files -u B >b.stages &&
118 test_line_count = 3 b.stages &&
119 git ls-files -s N >n.stages &&
120 test_line_count = 1 n.stages &&
121 sed -ne "/^g/{
124 }" B | grep red &&
125 git diff --exit-code white N
128 test_expect_success 'pull unrenaming branch into renaming one' \
130 git reset --hard &&
131 git show-branch &&
132 test_expect_code 1 git pull . master &&
133 git ls-files -u B >b.stages &&
134 test_line_count = 3 b.stages &&
135 git ls-files -s N >n.stages &&
136 test_line_count = 1 n.stages &&
137 sed -ne "/^g/{
140 }" B | grep red &&
141 git diff --exit-code white N
144 test_expect_success 'pull conflicting renames' \
146 git reset --hard &&
147 git show-branch &&
148 test_expect_code 1 git pull . blue &&
149 git ls-files -u A >a.stages &&
150 test_line_count = 1 a.stages &&
151 git ls-files -u B >b.stages &&
152 test_line_count = 1 b.stages &&
153 git ls-files -u C >c.stages &&
154 test_line_count = 1 c.stages &&
155 git ls-files -s N >n.stages &&
156 test_line_count = 1 n.stages &&
157 sed -ne "/^g/{
160 }" B | grep red &&
161 git diff --exit-code white N
164 test_expect_success 'interference with untracked working tree file' '
165 git reset --hard &&
166 git show-branch &&
167 echo >A this file should not matter &&
168 test_expect_code 1 git pull . white &&
169 test_path_is_file A
172 test_expect_success 'interference with untracked working tree file' '
173 git reset --hard &&
174 git checkout white &&
175 git show-branch &&
176 rm -f A &&
177 echo >A this file should not matter &&
178 test_expect_code 1 git pull . red &&
179 test_path_is_file A
182 test_expect_success 'interference with untracked working tree file' '
183 git reset --hard &&
184 rm -f A M &&
185 git checkout -f master &&
186 git tag -f anchor &&
187 git show-branch &&
188 git pull . yellow &&
189 test_path_is_missing M &&
190 git reset --hard anchor
193 test_expect_success 'updated working tree file should prevent the merge' '
194 git reset --hard &&
195 rm -f A M &&
196 git checkout -f master &&
197 git tag -f anchor &&
198 git show-branch &&
199 echo >>M one line addition &&
200 cat M >M.saved &&
201 test_expect_code 128 git pull . yellow &&
202 test_cmp M M.saved &&
203 rm -f M.saved
206 test_expect_success 'updated working tree file should prevent the merge' '
207 git reset --hard &&
208 rm -f A M &&
209 git checkout -f master &&
210 git tag -f anchor &&
211 git show-branch &&
212 echo >>M one line addition &&
213 cat M >M.saved &&
214 git update-index M &&
215 test_expect_code 128 git pull . yellow &&
216 test_cmp M M.saved &&
217 rm -f M.saved
220 test_expect_success 'interference with untracked working tree file' '
221 git reset --hard &&
222 rm -f A M &&
223 git checkout -f yellow &&
224 git tag -f anchor &&
225 git show-branch &&
226 echo >M this file should not matter &&
227 git pull . master &&
228 test_path_is_file M &&
230 git ls-files -s |
231 grep M
232 } &&
233 git reset --hard anchor
236 test_expect_success 'merge of identical changes in a renamed file' '
237 rm -f A M N &&
238 git reset --hard &&
239 git checkout change+rename &&
240 GIT_MERGE_VERBOSITY=3 git merge change | grep "^Skipped B" &&
241 git reset --hard HEAD^ &&
242 git checkout change &&
243 GIT_MERGE_VERBOSITY=3 git merge change+rename | grep "^Skipped B"
246 test_done