Merge branch 'tr/packed-object-info-wo-recursion'
[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 --remote should fetch upstream changes' '
139         (cd submodule &&
140          echo line4 >> file &&
141          git add file &&
142          test_tick &&
143          git commit -m "upstream line4"
144         ) &&
145         (cd super &&
146          git submodule update --remote --force submodule &&
147          cd submodule &&
148          test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline)"
149         )
150 '
151
152 test_expect_success 'local config should override .gitmodules branch' '
153         (cd submodule &&
154          git checkout -b test-branch &&
155          echo line5 >> file &&
156          git add file &&
157          test_tick &&
158          git commit -m "upstream line5" &&
159          git checkout master
160         ) &&
161         (cd super &&
162          git config submodule.submodule.branch test-branch &&
163          git submodule update --remote --force submodule &&
164          cd submodule &&
165          test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline test-branch)"
166         )
167 '
168
169 test_expect_success 'submodule update --rebase staying on master' '
170         (cd super/submodule &&
171           git checkout master
172         ) &&
173         (cd super &&
174          (cd submodule &&
175           compare_head
176          ) &&
177          git submodule update --rebase submodule &&
178          cd submodule &&
179          compare_head
180         )
181 '
182
183 test_expect_success 'submodule update --merge staying on master' '
184         (cd super/submodule &&
185           git reset --hard HEAD~1
186         ) &&
187         (cd super &&
188          (cd submodule &&
189           compare_head
190          ) &&
191          git submodule update --merge submodule &&
192          cd submodule &&
193          compare_head
194         )
195 '
196
197 test_expect_success 'submodule update - rebase in .git/config' '
198         (cd super &&
199          git config submodule.submodule.update rebase
200         ) &&
201         (cd super/submodule &&
202           git reset --hard HEAD~1
203         ) &&
204         (cd super &&
205          (cd submodule &&
206           compare_head
207          ) &&
208          git submodule update submodule &&
209          cd submodule &&
210          compare_head
211         )
212 '
213
214 test_expect_success 'submodule update - checkout in .git/config but --rebase given' '
215         (cd super &&
216          git config submodule.submodule.update checkout
217         ) &&
218         (cd super/submodule &&
219           git reset --hard HEAD~1
220         ) &&
221         (cd super &&
222          (cd submodule &&
223           compare_head
224          ) &&
225          git submodule update --rebase submodule &&
226          cd submodule &&
227          compare_head
228         )
229 '
230
231 test_expect_success 'submodule update - merge in .git/config' '
232         (cd super &&
233          git config submodule.submodule.update merge
234         ) &&
235         (cd super/submodule &&
236           git reset --hard HEAD~1
237         ) &&
238         (cd super &&
239          (cd submodule &&
240           compare_head
241          ) &&
242          git submodule update submodule &&
243          cd submodule &&
244          compare_head
245         )
246 '
247
248 test_expect_success 'submodule update - checkout in .git/config but --merge given' '
249         (cd super &&
250          git config submodule.submodule.update checkout
251         ) &&
252         (cd super/submodule &&
253           git reset --hard HEAD~1
254         ) &&
255         (cd super &&
256          (cd submodule &&
257           compare_head
258          ) &&
259          git submodule update --merge submodule &&
260          cd submodule &&
261          compare_head
262         )
263 '
264
265 test_expect_success 'submodule update - checkout in .git/config' '
266         (cd super &&
267          git config submodule.submodule.update checkout
268         ) &&
269         (cd super/submodule &&
270           git reset --hard HEAD^
271         ) &&
272         (cd super &&
273          (cd submodule &&
274           compare_head
275          ) &&
276          git submodule update submodule &&
277          cd submodule &&
278          ! compare_head
279         )
280 '
281
282 test_expect_success 'submodule init picks up rebase' '
283         (cd super &&
284          git config -f .gitmodules submodule.rebasing.update rebase &&
285          git submodule init rebasing &&
286          test "rebase" = "$(git config submodule.rebasing.update)"
287         )
288 '
289
290 test_expect_success 'submodule init picks up merge' '
291         (cd super &&
292          git config -f .gitmodules submodule.merging.update merge &&
293          git submodule init merging &&
294          test "merge" = "$(git config submodule.merging.update)"
295         )
296 '
297
298 test_expect_success 'submodule update --merge  - ignores --merge  for new submodules' '
299         (cd super &&
300          rm -rf submodule &&
301          git submodule update submodule &&
302          git status -s submodule >expect &&
303          rm -rf submodule &&
304          git submodule update --merge submodule &&
305          git status -s submodule >actual &&
306          test_cmp expect actual
307         )
308 '
309
310 test_expect_success 'submodule update --rebase - ignores --rebase for new submodules' '
311         (cd super &&
312          rm -rf submodule &&
313          git submodule update submodule &&
314          git status -s submodule >expect &&
315          rm -rf submodule &&
316          git submodule update --rebase submodule &&
317          git status -s submodule >actual &&
318          test_cmp expect actual
319         )
320 '
321
322 test_expect_success 'submodule update ignores update=merge config for new submodules' '
323         (cd super &&
324          rm -rf submodule &&
325          git submodule update submodule &&
326          git status -s submodule >expect &&
327          rm -rf submodule &&
328          git config submodule.submodule.update merge &&
329          git submodule update submodule &&
330          git status -s submodule >actual &&
331          git config --unset submodule.submodule.update &&
332          test_cmp expect actual
333         )
334 '
335
336 test_expect_success 'submodule update ignores update=rebase config for new submodules' '
337         (cd super &&
338          rm -rf submodule &&
339          git submodule update submodule &&
340          git status -s submodule >expect &&
341          rm -rf submodule &&
342          git config submodule.submodule.update rebase &&
343          git submodule update submodule &&
344          git status -s submodule >actual &&
345          git config --unset submodule.submodule.update &&
346          test_cmp expect actual
347         )
348 '
349
350 test_expect_success 'submodule init picks up update=none' '
351         (cd super &&
352          git config -f .gitmodules submodule.none.update none &&
353          git submodule init none &&
354          test "none" = "$(git config submodule.none.update)"
355         )
356 '
357
358 test_expect_success 'submodule update - update=none in .git/config' '
359         (cd super &&
360          git config submodule.submodule.update none &&
361          (cd submodule &&
362           git checkout master &&
363           compare_head
364          ) &&
365          git diff --raw | grep "        submodule" &&
366          git submodule update &&
367          git diff --raw | grep "        submodule" &&
368          (cd submodule &&
369           compare_head
370          ) &&
371          git config --unset submodule.submodule.update &&
372          git submodule update submodule
373         )
374 '
375
376 test_expect_success 'submodule update - update=none in .git/config but --checkout given' '
377         (cd super &&
378          git config submodule.submodule.update none &&
379          (cd submodule &&
380           git checkout master &&
381           compare_head
382          ) &&
383          git diff --raw | grep "        submodule" &&
384          git submodule update --checkout &&
385          test_must_fail git diff --raw \| grep "        submodule" &&
386          (cd submodule &&
387           test_must_fail compare_head
388          ) &&
389          git config --unset submodule.submodule.update
390         )
391 '
392
393 test_expect_success 'submodule update --init skips submodule with update=none' '
394         (cd super &&
395          git add .gitmodules &&
396          git commit -m ".gitmodules"
397         ) &&
398         git clone super cloned &&
399         (cd cloned &&
400          git submodule update --init &&
401          test -e submodule/.git &&
402          test_must_fail test -e none/.git
403         )
404 '
405
406 test_expect_success 'submodule update continues after checkout error' '
407         (cd super &&
408          git reset --hard HEAD &&
409          git submodule add ../submodule submodule2 &&
410          git submodule init &&
411          git commit -am "new_submodule" &&
412          (cd submodule2 &&
413           git rev-parse --verify HEAD >../expect
414          ) &&
415          (cd submodule &&
416           test_commit "update_submodule" file
417          ) &&
418          (cd submodule2 &&
419           test_commit "update_submodule2" file
420          ) &&
421          git add submodule &&
422          git add submodule2 &&
423          git commit -m "two_new_submodule_commits" &&
424          (cd submodule &&
425           echo "" > file
426          ) &&
427          git checkout HEAD^ &&
428          test_must_fail git submodule update &&
429          (cd submodule2 &&
430           git rev-parse --verify HEAD >../actual
431          ) &&
432          test_cmp expect actual
433         )
434 '
435 test_expect_success 'submodule update continues after recursive checkout error' '
436         (cd super &&
437          git reset --hard HEAD &&
438          git checkout master &&
439          git submodule update &&
440          (cd submodule &&
441           git submodule add ../submodule subsubmodule &&
442           git submodule init &&
443           git commit -m "new_subsubmodule"
444          ) &&
445          git add submodule &&
446          git commit -m "update_submodule" &&
447          (cd submodule &&
448           (cd subsubmodule &&
449            test_commit "update_subsubmodule" file
450           ) &&
451           git add subsubmodule &&
452           test_commit "update_submodule_again" file &&
453           (cd subsubmodule &&
454            test_commit "update_subsubmodule_again" file
455           ) &&
456           test_commit "update_submodule_again_again" file
457          ) &&
458          (cd submodule2 &&
459           git rev-parse --verify HEAD >../expect &&
460           test_commit "update_submodule2_again" file
461          ) &&
462          git add submodule &&
463          git add submodule2 &&
464          git commit -m "new_commits" &&
465          git checkout HEAD^ &&
466          (cd submodule &&
467           git checkout HEAD^ &&
468           (cd subsubmodule &&
469            echo "" > file
470           )
471          ) &&
472          test_must_fail git submodule update --recursive &&
473          (cd submodule2 &&
474           git rev-parse --verify HEAD >../actual
475          ) &&
476          test_cmp expect actual
477         )
478 '
479
480 test_expect_success 'submodule update exit immediately in case of merge conflict' '
481         (cd super &&
482          git checkout master &&
483          git reset --hard HEAD &&
484          (cd submodule &&
485           (cd subsubmodule &&
486            git reset --hard HEAD
487           )
488          ) &&
489          git submodule update --recursive &&
490          (cd submodule &&
491           test_commit "update_submodule_2" file
492          ) &&
493          (cd submodule2 &&
494           test_commit "update_submodule2_2" file
495          ) &&
496          git add submodule &&
497          git add submodule2 &&
498          git commit -m "two_new_submodule_commits" &&
499          (cd submodule &&
500           git checkout master &&
501           test_commit "conflict" file &&
502           echo "conflict" > file
503          ) &&
504          git checkout HEAD^ &&
505          (cd submodule2 &&
506           git rev-parse --verify HEAD >../expect
507          ) &&
508          git config submodule.submodule.update merge &&
509          test_must_fail git submodule update &&
510          (cd submodule2 &&
511           git rev-parse --verify HEAD >../actual
512          ) &&
513          test_cmp expect actual
514         )
515 '
516
517 test_expect_success 'submodule update exit immediately after recursive rebase error' '
518         (cd super &&
519          git checkout master &&
520          git reset --hard HEAD &&
521          (cd submodule &&
522           git reset --hard HEAD &&
523           git submodule update --recursive
524          ) &&
525          (cd submodule &&
526           test_commit "update_submodule_3" file
527          ) &&
528          (cd submodule2 &&
529           test_commit "update_submodule2_3" file
530          ) &&
531          git add submodule &&
532          git add submodule2 &&
533          git commit -m "two_new_submodule_commits" &&
534          (cd submodule &&
535           git checkout master &&
536           test_commit "conflict2" file &&
537           echo "conflict" > file
538          ) &&
539          git checkout HEAD^ &&
540          (cd submodule2 &&
541           git rev-parse --verify HEAD >../expect
542          ) &&
543          git config submodule.submodule.update rebase &&
544          test_must_fail git submodule update &&
545          (cd submodule2 &&
546           git rev-parse --verify HEAD >../actual
547          ) &&
548          test_cmp expect actual
549         )
550 '
551
552 test_expect_success 'add different submodules to the same path' '
553         (cd super &&
554          git submodule add ../submodule s1 &&
555          test_must_fail git submodule add ../merging s1
556         )
557 '
558
559 test_expect_success 'submodule add places git-dir in superprojects git-dir' '
560         (cd super &&
561          mkdir deeper &&
562          git submodule add ../submodule deeper/submodule &&
563          (cd deeper/submodule &&
564           git log > ../../expected
565          ) &&
566          (cd .git/modules/deeper/submodule &&
567           git log > ../../../../actual
568          ) &&
569          test_cmp actual expected
570         )
571 '
572
573 test_expect_success 'submodule update places git-dir in superprojects git-dir' '
574         (cd super &&
575          git commit -m "added submodule"
576         ) &&
577         git clone super super2 &&
578         (cd super2 &&
579          git submodule init deeper/submodule &&
580          git submodule update &&
581          (cd deeper/submodule &&
582           git log > ../../expected
583          ) &&
584          (cd .git/modules/deeper/submodule &&
585           git log > ../../../../actual
586          ) &&
587          test_cmp actual expected
588         )
589 '
590
591 test_expect_success 'submodule add places git-dir in superprojects git-dir recursive' '
592         (cd super2 &&
593          (cd deeper/submodule &&
594           git submodule add ../submodule subsubmodule &&
595           (cd subsubmodule &&
596            git log > ../../../expected
597           ) &&
598           git commit -m "added subsubmodule" &&
599           git push
600          ) &&
601          (cd .git/modules/deeper/submodule/modules/subsubmodule &&
602           git log > ../../../../../actual
603          ) &&
604          git add deeper/submodule &&
605          git commit -m "update submodule" &&
606          git push &&
607          test_cmp actual expected
608         )
609 '
610
611 test_expect_success 'submodule update places git-dir in superprojects git-dir recursive' '
612         mkdir super_update_r &&
613         (cd super_update_r &&
614          git init --bare
615         ) &&
616         mkdir subsuper_update_r &&
617         (cd subsuper_update_r &&
618          git init --bare
619         ) &&
620         mkdir subsubsuper_update_r &&
621         (cd subsubsuper_update_r &&
622          git init --bare
623         ) &&
624         git clone subsubsuper_update_r subsubsuper_update_r2 &&
625         (cd subsubsuper_update_r2 &&
626          test_commit "update_subsubsuper" file &&
627          git push origin master
628         ) &&
629         git clone subsuper_update_r subsuper_update_r2 &&
630         (cd subsuper_update_r2 &&
631          test_commit "update_subsuper" file &&
632          git submodule add ../subsubsuper_update_r subsubmodule &&
633          git commit -am "subsubmodule" &&
634          git push origin master
635         ) &&
636         git clone super_update_r super_update_r2 &&
637         (cd super_update_r2 &&
638          test_commit "update_super" file &&
639          git submodule add ../subsuper_update_r submodule &&
640          git commit -am "submodule" &&
641          git push origin master
642         ) &&
643         rm -rf super_update_r2 &&
644         git clone super_update_r super_update_r2 &&
645         (cd super_update_r2 &&
646          git submodule update --init --recursive >actual &&
647          test_i18ngrep "Submodule path .submodule/subsubmodule.: checked out" actual &&
648          (cd submodule/subsubmodule &&
649           git log > ../../expected
650          ) &&
651          (cd .git/modules/submodule/modules/subsubmodule
652           git log > ../../../../../actual
653          )
654          test_cmp actual expected
655         )
656 '
657
658 test_expect_success 'submodule add properly re-creates deeper level submodules' '
659         (cd super &&
660          git reset --hard master &&
661          rm -rf deeper/ &&
662          git submodule add --force ../submodule deeper/submodule
663         )
664 '
665
666 test_expect_success 'submodule update properly revives a moved submodule' '
667         (cd super &&
668          H=$(git rev-parse --short HEAD) &&
669          git commit -am "pre move" &&
670          H2=$(git rev-parse --short HEAD) &&
671          git status | sed "s/$H/XXX/" >expect &&
672          H=$(cd submodule2; git rev-parse HEAD) &&
673          git rm --cached submodule2 &&
674          rm -rf submodule2 &&
675          mkdir -p "moved/sub module" &&
676          git update-index --add --cacheinfo 160000 $H "moved/sub module" &&
677          git config -f .gitmodules submodule.submodule2.path "moved/sub module"
678          git commit -am "post move" &&
679          git submodule update &&
680          git status | sed "s/$H2/XXX/" >actual &&
681          test_cmp expect actual
682         )
683 '
684
685 test_expect_success SYMLINKS 'submodule update can handle symbolic links in pwd' '
686         mkdir -p linked/dir &&
687         ln -s linked/dir linkto &&
688         (
689                 cd linkto &&
690                 git clone "$TRASH_DIRECTORY"/super_update_r2 super &&
691                 (
692                         cd super &&
693                         git submodule update --init --recursive
694                 )
695         )
696 '
697
698 test_done