Make 'git submodule update --force' always check out submodules.
[git.git] / t / t7406-submodule-update.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2009 Red Hat, Inc.
4 #
5
6 test_description='Test updating submodules
7
8 This test verifies that "git submodule update" detaches the HEAD of the
9 submodule and "git submodule update --rebase/--merge" does not detach the HEAD.
10 '
11
12 . ./test-lib.sh
13
14
15 compare_head()
16 {
17     sha_master=`git rev-list --max-count=1 master`
18     sha_head=`git rev-list --max-count=1 HEAD`
19
20     test "$sha_master" = "$sha_head"
21 }
22
23
24 test_expect_success 'setup a submodule tree' '
25         echo file > file &&
26         git add file &&
27         test_tick &&
28         git commit -m upstream &&
29         git clone . super &&
30         git clone super submodule &&
31         git clone super rebasing &&
32         git clone super merging &&
33         git clone super none &&
34         (cd super &&
35          git submodule add ../submodule submodule &&
36          test_tick &&
37          git commit -m "submodule" &&
38          git submodule init submodule
39         ) &&
40         (cd submodule &&
41         echo "line2" > file &&
42         git add file &&
43         git commit -m "Commit 2"
44         ) &&
45         (cd super &&
46          (cd submodule &&
47           git pull --rebase origin
48          ) &&
49          git add submodule &&
50          git commit -m "submodule update"
51         ) &&
52         (cd super &&
53          git submodule add ../rebasing rebasing &&
54          test_tick &&
55          git commit -m "rebasing"
56         ) &&
57         (cd super &&
58          git submodule add ../merging merging &&
59          test_tick &&
60          git commit -m "rebasing"
61         )
62         (cd super &&
63          git submodule add ../none none &&
64          test_tick &&
65          git commit -m "none"
66         )
67 '
68
69 test_expect_success 'submodule update detaching the HEAD ' '
70         (cd super/submodule &&
71          git reset --hard HEAD~1
72         ) &&
73         (cd super &&
74          (cd submodule &&
75           compare_head
76          ) &&
77          git submodule update submodule &&
78          cd submodule &&
79          ! compare_head
80         )
81 '
82
83 apos="'";
84 test_expect_success 'submodule update does not fetch already present commits' '
85         (cd submodule &&
86           echo line3 >> file &&
87           git add file &&
88           test_tick &&
89           git commit -m "upstream line3"
90         ) &&
91         (cd super/submodule &&
92           head=$(git rev-parse --verify HEAD) &&
93           echo "Submodule path ${apos}submodule$apos: checked out $apos$head$apos" > ../../expected &&
94           git reset --hard HEAD~1
95         ) &&
96         (cd super &&
97           git submodule update > ../actual 2> ../actual.err
98         ) &&
99         test_i18ncmp expected actual &&
100         ! test -s actual.err
101 '
102
103 test_expect_success 'submodule update should fail due to local changes' '
104         (cd super/submodule &&
105          git reset --hard HEAD~1 &&
106          echo "local change" > file
107         ) &&
108         (cd super &&
109          (cd submodule &&
110           compare_head
111          ) &&
112          test_must_fail git submodule update submodule
113         )
114 '
115 test_expect_success 'submodule update should throw away changes with --force ' '
116         (cd super &&
117          (cd submodule &&
118           compare_head
119          ) &&
120          git submodule update --force submodule &&
121          cd submodule &&
122          ! compare_head
123         )
124 '
125
126 test_expect_success 'submodule update --force forcibly checks out submodules' '
127         (cd super &&
128          (cd submodule &&
129           rm -f file
130          ) &&
131          git submodule update --force submodule &&
132          (cd submodule &&
133           test "$(git status -s file)" = ""
134          )
135         )
136 '
137
138 test_expect_success 'submodule update --rebase staying on master' '
139         (cd super/submodule &&
140           git checkout master
141         ) &&
142         (cd super &&
143          (cd submodule &&
144           compare_head
145          ) &&
146          git submodule update --rebase submodule &&
147          cd submodule &&
148          compare_head
149         )
150 '
151
152 test_expect_success 'submodule update --merge staying on master' '
153         (cd super/submodule &&
154           git reset --hard HEAD~1
155         ) &&
156         (cd super &&
157          (cd submodule &&
158           compare_head
159          ) &&
160          git submodule update --merge submodule &&
161          cd submodule &&
162          compare_head
163         )
164 '
165
166 test_expect_success 'submodule update - rebase in .git/config' '
167         (cd super &&
168          git config submodule.submodule.update rebase
169         ) &&
170         (cd super/submodule &&
171           git reset --hard HEAD~1
172         ) &&
173         (cd super &&
174          (cd submodule &&
175           compare_head
176          ) &&
177          git submodule update submodule &&
178          cd submodule &&
179          compare_head
180         )
181 '
182
183 test_expect_success 'submodule update - checkout in .git/config but --rebase given' '
184         (cd super &&
185          git config submodule.submodule.update checkout
186         ) &&
187         (cd super/submodule &&
188           git reset --hard HEAD~1
189         ) &&
190         (cd super &&
191          (cd submodule &&
192           compare_head
193          ) &&
194          git submodule update --rebase submodule &&
195          cd submodule &&
196          compare_head
197         )
198 '
199
200 test_expect_success 'submodule update - merge in .git/config' '
201         (cd super &&
202          git config submodule.submodule.update merge
203         ) &&
204         (cd super/submodule &&
205           git reset --hard HEAD~1
206         ) &&
207         (cd super &&
208          (cd submodule &&
209           compare_head
210          ) &&
211          git submodule update submodule &&
212          cd submodule &&
213          compare_head
214         )
215 '
216
217 test_expect_success 'submodule update - checkout in .git/config but --merge given' '
218         (cd super &&
219          git config submodule.submodule.update checkout
220         ) &&
221         (cd super/submodule &&
222           git reset --hard HEAD~1
223         ) &&
224         (cd super &&
225          (cd submodule &&
226           compare_head
227          ) &&
228          git submodule update --merge submodule &&
229          cd submodule &&
230          compare_head
231         )
232 '
233
234 test_expect_success 'submodule update - checkout in .git/config' '
235         (cd super &&
236          git config submodule.submodule.update checkout
237         ) &&
238         (cd super/submodule &&
239           git reset --hard HEAD^
240         ) &&
241         (cd super &&
242          (cd submodule &&
243           compare_head
244          ) &&
245          git submodule update submodule &&
246          cd submodule &&
247          ! compare_head
248         )
249 '
250
251 test_expect_success 'submodule init picks up rebase' '
252         (cd super &&
253          git config -f .gitmodules submodule.rebasing.update rebase &&
254          git submodule init rebasing &&
255          test "rebase" = "$(git config submodule.rebasing.update)"
256         )
257 '
258
259 test_expect_success 'submodule init picks up merge' '
260         (cd super &&
261          git config -f .gitmodules submodule.merging.update merge &&
262          git submodule init merging &&
263          test "merge" = "$(git config submodule.merging.update)"
264         )
265 '
266
267 test_expect_success 'submodule update --merge  - ignores --merge  for new submodules' '
268         (cd super &&
269          rm -rf submodule &&
270          git submodule update submodule &&
271          git status -s submodule >expect &&
272          rm -rf submodule &&
273          git submodule update --merge submodule &&
274          git status -s submodule >actual &&
275          test_cmp expect actual
276         )
277 '
278
279 test_expect_success 'submodule update --rebase - ignores --rebase for new submodules' '
280         (cd super &&
281          rm -rf submodule &&
282          git submodule update submodule &&
283          git status -s submodule >expect &&
284          rm -rf submodule &&
285          git submodule update --rebase submodule &&
286          git status -s submodule >actual &&
287          test_cmp expect actual
288         )
289 '
290
291 test_expect_success 'submodule update ignores update=merge config for new submodules' '
292         (cd super &&
293          rm -rf submodule &&
294          git submodule update submodule &&
295          git status -s submodule >expect &&
296          rm -rf submodule &&
297          git config submodule.submodule.update merge &&
298          git submodule update submodule &&
299          git status -s submodule >actual &&
300          git config --unset submodule.submodule.update &&
301          test_cmp expect actual
302         )
303 '
304
305 test_expect_success 'submodule update ignores update=rebase config for new submodules' '
306         (cd super &&
307          rm -rf submodule &&
308          git submodule update submodule &&
309          git status -s submodule >expect &&
310          rm -rf submodule &&
311          git config submodule.submodule.update rebase &&
312          git submodule update submodule &&
313          git status -s submodule >actual &&
314          git config --unset submodule.submodule.update &&
315          test_cmp expect actual
316         )
317 '
318
319 test_expect_success 'submodule init picks up update=none' '
320         (cd super &&
321          git config -f .gitmodules submodule.none.update none &&
322          git submodule init none &&
323          test "none" = "$(git config submodule.none.update)"
324         )
325 '
326
327 test_expect_success 'submodule update - update=none in .git/config' '
328         (cd super &&
329          git config submodule.submodule.update none &&
330          (cd submodule &&
331           git checkout master &&
332           compare_head
333          ) &&
334          git diff --raw | grep "        submodule" &&
335          git submodule update &&
336          git diff --raw | grep "        submodule" &&
337          (cd submodule &&
338           compare_head
339          ) &&
340          git config --unset submodule.submodule.update &&
341          git submodule update submodule
342         )
343 '
344
345 test_expect_success 'submodule update - update=none in .git/config but --checkout given' '
346         (cd super &&
347          git config submodule.submodule.update none &&
348          (cd submodule &&
349           git checkout master &&
350           compare_head
351          ) &&
352          git diff --raw | grep "        submodule" &&
353          git submodule update --checkout &&
354          test_must_fail git diff --raw \| grep "        submodule" &&
355          (cd submodule &&
356           test_must_fail compare_head
357          ) &&
358          git config --unset submodule.submodule.update
359         )
360 '
361
362 test_expect_success 'submodule update --init skips submodule with update=none' '
363         (cd super &&
364          git add .gitmodules &&
365          git commit -m ".gitmodules"
366         ) &&
367         git clone super cloned &&
368         (cd cloned &&
369          git submodule update --init &&
370          test -e submodule/.git &&
371          test_must_fail test -e none/.git
372         )
373 '
374
375 test_expect_success 'submodule update continues after checkout error' '
376         (cd super &&
377          git reset --hard HEAD &&
378          git submodule add ../submodule submodule2 &&
379          git submodule init &&
380          git commit -am "new_submodule" &&
381          (cd submodule2 &&
382           git rev-parse --max-count=1 HEAD > ../expect
383          ) &&
384          (cd submodule &&
385           test_commit "update_submodule" file
386          ) &&
387          (cd submodule2 &&
388           test_commit "update_submodule2" file
389          ) &&
390          git add submodule &&
391          git add submodule2 &&
392          git commit -m "two_new_submodule_commits" &&
393          (cd submodule &&
394           echo "" > file
395          ) &&
396          git checkout HEAD^ &&
397          test_must_fail git submodule update &&
398          (cd submodule2 &&
399           git rev-parse --max-count=1 HEAD > ../actual
400          ) &&
401          test_cmp expect actual
402         )
403 '
404 test_expect_success 'submodule update continues after recursive checkout error' '
405         (cd super &&
406          git reset --hard HEAD &&
407          git checkout master &&
408          git submodule update &&
409          (cd submodule &&
410           git submodule add ../submodule subsubmodule &&
411           git submodule init &&
412           git commit -m "new_subsubmodule"
413          ) &&
414          git add submodule &&
415          git commit -m "update_submodule" &&
416          (cd submodule &&
417           (cd subsubmodule &&
418            test_commit "update_subsubmodule" file
419           ) &&
420           git add subsubmodule &&
421           test_commit "update_submodule_again" file &&
422           (cd subsubmodule &&
423            test_commit "update_subsubmodule_again" file
424           ) &&
425           test_commit "update_submodule_again_again" file
426          ) &&
427          (cd submodule2 &&
428           git rev-parse --max-count=1 HEAD > ../expect &&
429           test_commit "update_submodule2_again" file
430          ) &&
431          git add submodule &&
432          git add submodule2 &&
433          git commit -m "new_commits" &&
434          git checkout HEAD^ &&
435          (cd submodule &&
436           git checkout HEAD^ &&
437           (cd subsubmodule &&
438            echo "" > file
439           )
440          ) &&
441          test_must_fail git submodule update --recursive &&
442          (cd submodule2 &&
443           git rev-parse --max-count=1 HEAD > ../actual
444          ) &&
445          test_cmp expect actual
446         )
447 '
448
449 test_expect_success 'submodule update exit immediately in case of merge conflict' '
450         (cd super &&
451          git checkout master &&
452          git reset --hard HEAD &&
453          (cd submodule &&
454           (cd subsubmodule &&
455            git reset --hard HEAD
456           )
457          ) &&
458          git submodule update --recursive &&
459          (cd submodule &&
460           test_commit "update_submodule_2" file
461          ) &&
462          (cd submodule2 &&
463           test_commit "update_submodule2_2" file
464          ) &&
465          git add submodule &&
466          git add submodule2 &&
467          git commit -m "two_new_submodule_commits" &&
468          (cd submodule &&
469           git checkout master &&
470           test_commit "conflict" file &&
471           echo "conflict" > file
472          ) &&
473          git checkout HEAD^ &&
474          (cd submodule2 &&
475           git rev-parse --max-count=1 HEAD > ../expect
476          ) &&
477          git config submodule.submodule.update merge &&
478          test_must_fail git submodule update &&
479          (cd submodule2 &&
480           git rev-parse --max-count=1 HEAD > ../actual
481          ) &&
482          test_cmp expect actual
483         )
484 '
485
486 test_expect_success 'submodule update exit immediately after recursive rebase error' '
487         (cd super &&
488          git checkout master &&
489          git reset --hard HEAD &&
490          (cd submodule &&
491           git reset --hard HEAD &&
492           git submodule update --recursive
493          ) &&
494          (cd submodule &&
495           test_commit "update_submodule_3" file
496          ) &&
497          (cd submodule2 &&
498           test_commit "update_submodule2_3" file
499          ) &&
500          git add submodule &&
501          git add submodule2 &&
502          git commit -m "two_new_submodule_commits" &&
503          (cd submodule &&
504           git checkout master &&
505           test_commit "conflict2" file &&
506           echo "conflict" > file
507          ) &&
508          git checkout HEAD^ &&
509          (cd submodule2 &&
510           git rev-parse --max-count=1 HEAD > ../expect
511          ) &&
512          git config submodule.submodule.update rebase &&
513          test_must_fail git submodule update &&
514          (cd submodule2 &&
515           git rev-parse --max-count=1 HEAD > ../actual
516          ) &&
517          test_cmp expect actual
518         )
519 '
520
521 test_expect_success 'add different submodules to the same path' '
522         (cd super &&
523          git submodule add ../submodule s1 &&
524          test_must_fail git submodule add ../merging s1
525         )
526 '
527
528 test_expect_success 'submodule add places git-dir in superprojects git-dir' '
529         (cd super &&
530          mkdir deeper &&
531          git submodule add ../submodule deeper/submodule &&
532          (cd deeper/submodule &&
533           git log > ../../expected
534          ) &&
535          (cd .git/modules/deeper/submodule &&
536           git log > ../../../../actual
537          ) &&
538          test_cmp actual expected
539         )
540 '
541
542 test_expect_success 'submodule update places git-dir in superprojects git-dir' '
543         (cd super &&
544          git commit -m "added submodule"
545         ) &&
546         git clone super super2 &&
547         (cd super2 &&
548          git submodule init deeper/submodule &&
549          git submodule update &&
550          (cd deeper/submodule &&
551           git log > ../../expected
552          ) &&
553          (cd .git/modules/deeper/submodule &&
554           git log > ../../../../actual
555          ) &&
556          test_cmp actual expected
557         )
558 '
559
560 test_expect_success 'submodule add places git-dir in superprojects git-dir recursive' '
561         (cd super2 &&
562          (cd deeper/submodule &&
563           git submodule add ../submodule subsubmodule &&
564           (cd subsubmodule &&
565            git log > ../../../expected
566           ) &&
567           git commit -m "added subsubmodule" &&
568           git push
569          ) &&
570          (cd .git/modules/deeper/submodule/modules/subsubmodule &&
571           git log > ../../../../../actual
572          ) &&
573          git add deeper/submodule &&
574          git commit -m "update submodule" &&
575          git push &&
576          test_cmp actual expected
577         )
578 '
579
580 test_expect_success 'submodule update places git-dir in superprojects git-dir recursive' '
581         mkdir super_update_r &&
582         (cd super_update_r &&
583          git init --bare
584         ) &&
585         mkdir subsuper_update_r &&
586         (cd subsuper_update_r &&
587          git init --bare
588         ) &&
589         mkdir subsubsuper_update_r &&
590         (cd subsubsuper_update_r &&
591          git init --bare
592         ) &&
593         git clone subsubsuper_update_r subsubsuper_update_r2 &&
594         (cd subsubsuper_update_r2 &&
595          test_commit "update_subsubsuper" file &&
596          git push origin master
597         ) &&
598         git clone subsuper_update_r subsuper_update_r2 &&
599         (cd subsuper_update_r2 &&
600          test_commit "update_subsuper" file &&
601          git submodule add ../subsubsuper_update_r subsubmodule &&
602          git commit -am "subsubmodule" &&
603          git push origin master
604         ) &&
605         git clone super_update_r super_update_r2 &&
606         (cd super_update_r2 &&
607          test_commit "update_super" file &&
608          git submodule add ../subsuper_update_r submodule &&
609          git commit -am "submodule" &&
610          git push origin master
611         ) &&
612         rm -rf super_update_r2 &&
613         git clone super_update_r super_update_r2 &&
614         (cd super_update_r2 &&
615          git submodule update --init --recursive &&
616          (cd submodule/subsubmodule &&
617           git log > ../../expected
618          ) &&
619          (cd .git/modules/submodule/modules/subsubmodule
620           git log > ../../../../../actual
621          )
622          test_cmp actual expected
623         )
624 '
625
626 test_expect_success 'submodule add properly re-creates deeper level submodules' '
627         (cd super &&
628          git reset --hard master &&
629          rm -rf deeper/ &&
630          git submodule add ../submodule deeper/submodule
631         )
632 '
633
634 test_expect_success 'submodule update properly revives a moved submodule' '
635         (cd super &&
636          git commit -am "pre move" &&
637          git status >expect&&
638          H=$(cd submodule2; git rev-parse HEAD) &&
639          git rm --cached submodule2 &&
640          rm -rf submodule2 &&
641          mkdir -p "moved/sub module" &&
642          git update-index --add --cacheinfo 160000 $H "moved/sub module" &&
643          git config -f .gitmodules submodule.submodule2.path "moved/sub module"
644          git commit -am "post move" &&
645          git submodule update &&
646          git status >actual &&
647          test_cmp expect actual
648         )
649 '
650
651 test_done