]> asedeno.scripts.mit.edu Git - git.git/blob - t/t6022-merge-rename.sh
Merge branch 'mm/phrase-remote-tracking'
[git.git] / t / t6022-merge-rename.sh
1 #!/bin/sh
2
3 test_description='Merge-recursive merging renames'
4 . ./test-lib.sh
5
6 test_expect_success setup \
7 '
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
25
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
43
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 &&
52
53 sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
54 mv A+ A &&
55 git commit -a -m "master updates A" &&
56
57 git checkout yellow &&
58 rm -f M &&
59 git commit -a -m "yellow removes M" &&
60
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" &&
67
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" &&
74
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" &&
81
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" &&
86
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" &&
92
93 git checkout master'
94
95 test_expect_success 'pull renaming branch into unrenaming one' \
96 '
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/{
105         p
106         q
107         }" B | grep master &&
108         git diff --exit-code white N
109 '
110
111 test_expect_success 'pull renaming branch into another renaming one' \
112 '
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/{
122         p
123         q
124         }" B | grep red &&
125         git diff --exit-code white N
126 '
127
128 test_expect_success 'pull unrenaming branch into renaming one' \
129 '
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/{
138         p
139         q
140         }" B | grep red &&
141         git diff --exit-code white N
142 '
143
144 test_expect_success 'pull conflicting renames' \
145 '
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/{
158         p
159         q
160         }" B | grep red &&
161         git diff --exit-code white N
162 '
163
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
170 '
171
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
180 '
181
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
191 '
192
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
204 '
205
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
218 '
219
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 &&
229         ! {
230                 git ls-files -s |
231                 grep M
232         } &&
233         git reset --hard anchor
234 '
235
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"
244 '
245
246 test_done