Merge branch 'js/merge-edit-option'
[git] / t / t7508-status.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Johannes E. Schindelin
4 #
5
6 test_description='git status'
7
8 . ./test-lib.sh
9
10 test_expect_success 'status -h in broken repository' '
11         mkdir broken &&
12         test_when_finished "rm -fr broken" &&
13         (
14                 cd broken &&
15                 git init &&
16                 echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
17                 test_expect_code 129 git status -h >usage 2>&1
18         ) &&
19         test_i18ngrep "[Uu]sage" broken/usage
20 '
21
22 test_expect_success 'commit -h in broken repository' '
23         mkdir broken &&
24         test_when_finished "rm -fr broken" &&
25         (
26                 cd broken &&
27                 git init &&
28                 echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
29                 test_expect_code 129 git commit -h >usage 2>&1
30         ) &&
31         test_i18ngrep "[Uu]sage" broken/usage
32 '
33
34 test_expect_success 'setup' '
35         : >tracked &&
36         : >modified &&
37         mkdir dir1 &&
38         : >dir1/tracked &&
39         : >dir1/modified &&
40         mkdir dir2 &&
41         : >dir1/tracked &&
42         : >dir1/modified &&
43         git add . &&
44
45         git status >output &&
46
47         test_tick &&
48         git commit -m initial &&
49         : >untracked &&
50         : >dir1/untracked &&
51         : >dir2/untracked &&
52         echo 1 >dir1/modified &&
53         echo 2 >dir2/modified &&
54         echo 3 >dir2/added &&
55         git add dir2/added
56 '
57
58 test_expect_success 'status (1)' '
59         test_i18ngrep "use \"git rm --cached <file>\.\.\.\" to unstage" output
60 '
61
62 cat >expect <<\EOF
63 # On branch master
64 # Changes to be committed:
65 #   (use "git reset HEAD <file>..." to unstage)
66 #
67 #       new file:   dir2/added
68 #
69 # Changes not staged for commit:
70 #   (use "git add <file>..." to update what will be committed)
71 #   (use "git checkout -- <file>..." to discard changes in working directory)
72 #
73 #       modified:   dir1/modified
74 #
75 # Untracked files:
76 #   (use "git add <file>..." to include in what will be committed)
77 #
78 #       dir1/untracked
79 #       dir2/modified
80 #       dir2/untracked
81 #       expect
82 #       output
83 #       untracked
84 EOF
85
86 test_expect_success 'status (2)' '
87         git status >output &&
88         test_i18ncmp expect output
89 '
90
91 cat >expect <<\EOF
92 # On branch master
93 # Changes to be committed:
94 #       new file:   dir2/added
95 #
96 # Changes not staged for commit:
97 #       modified:   dir1/modified
98 #
99 # Untracked files:
100 #       dir1/untracked
101 #       dir2/modified
102 #       dir2/untracked
103 #       expect
104 #       output
105 #       untracked
106 EOF
107
108 test_expect_success 'status (advice.statusHints false)' '
109         test_when_finished "git config --unset advice.statusHints" &&
110         git config advice.statusHints false &&
111         git status >output &&
112         test_i18ncmp expect output
113
114 '
115
116 cat >expect <<\EOF
117  M dir1/modified
118 A  dir2/added
119 ?? dir1/untracked
120 ?? dir2/modified
121 ?? dir2/untracked
122 ?? expect
123 ?? output
124 ?? untracked
125 EOF
126
127 test_expect_success 'status -s' '
128
129         git status -s >output &&
130         test_cmp expect output
131
132 '
133
134 test_expect_success 'status with gitignore' '
135         {
136                 echo ".gitignore" &&
137                 echo "expect" &&
138                 echo "output" &&
139                 echo "untracked"
140         } >.gitignore &&
141
142         cat >expect <<-\EOF &&
143          M dir1/modified
144         A  dir2/added
145         ?? dir2/modified
146         EOF
147         git status -s >output &&
148         test_cmp expect output &&
149
150         cat >expect <<-\EOF &&
151          M dir1/modified
152         A  dir2/added
153         ?? dir2/modified
154         !! .gitignore
155         !! dir1/untracked
156         !! dir2/untracked
157         !! expect
158         !! output
159         !! untracked
160         EOF
161         git status -s --ignored >output &&
162         test_cmp expect output &&
163
164         cat >expect <<-\EOF &&
165         # On branch master
166         # Changes to be committed:
167         #   (use "git reset HEAD <file>..." to unstage)
168         #
169         #       new file:   dir2/added
170         #
171         # Changes not staged for commit:
172         #   (use "git add <file>..." to update what will be committed)
173         #   (use "git checkout -- <file>..." to discard changes in working directory)
174         #
175         #       modified:   dir1/modified
176         #
177         # Untracked files:
178         #   (use "git add <file>..." to include in what will be committed)
179         #
180         #       dir2/modified
181         # Ignored files:
182         #   (use "git add -f <file>..." to include in what will be committed)
183         #
184         #       .gitignore
185         #       dir1/untracked
186         #       dir2/untracked
187         #       expect
188         #       output
189         #       untracked
190         EOF
191         git status --ignored >output &&
192         test_i18ncmp expect output
193 '
194
195 test_expect_success 'status with gitignore (nothing untracked)' '
196         {
197                 echo ".gitignore" &&
198                 echo "expect" &&
199                 echo "dir2/modified" &&
200                 echo "output" &&
201                 echo "untracked"
202         } >.gitignore &&
203
204         cat >expect <<-\EOF &&
205          M dir1/modified
206         A  dir2/added
207         EOF
208         git status -s >output &&
209         test_cmp expect output &&
210
211         cat >expect <<-\EOF &&
212          M dir1/modified
213         A  dir2/added
214         !! .gitignore
215         !! dir1/untracked
216         !! dir2/modified
217         !! dir2/untracked
218         !! expect
219         !! output
220         !! untracked
221         EOF
222         git status -s --ignored >output &&
223         test_cmp expect output &&
224
225         cat >expect <<-\EOF &&
226         # On branch master
227         # Changes to be committed:
228         #   (use "git reset HEAD <file>..." to unstage)
229         #
230         #       new file:   dir2/added
231         #
232         # Changes not staged for commit:
233         #   (use "git add <file>..." to update what will be committed)
234         #   (use "git checkout -- <file>..." to discard changes in working directory)
235         #
236         #       modified:   dir1/modified
237         #
238         # Ignored files:
239         #   (use "git add -f <file>..." to include in what will be committed)
240         #
241         #       .gitignore
242         #       dir1/untracked
243         #       dir2/modified
244         #       dir2/untracked
245         #       expect
246         #       output
247         #       untracked
248         EOF
249         git status --ignored >output &&
250         test_i18ncmp expect output
251 '
252
253 rm -f .gitignore
254
255 cat >expect <<\EOF
256 ## master
257  M dir1/modified
258 A  dir2/added
259 ?? dir1/untracked
260 ?? dir2/modified
261 ?? dir2/untracked
262 ?? expect
263 ?? output
264 ?? untracked
265 EOF
266
267 test_expect_success 'status -s -b' '
268
269         git status -s -b >output &&
270         test_cmp expect output
271
272 '
273
274 test_expect_success 'setup dir3' '
275         mkdir dir3 &&
276         : >dir3/untracked1 &&
277         : >dir3/untracked2
278 '
279
280 cat >expect <<EOF
281 # On branch master
282 # Changes to be committed:
283 #   (use "git reset HEAD <file>..." to unstage)
284 #
285 #       new file:   dir2/added
286 #
287 # Changes not staged for commit:
288 #   (use "git add <file>..." to update what will be committed)
289 #   (use "git checkout -- <file>..." to discard changes in working directory)
290 #
291 #       modified:   dir1/modified
292 #
293 # Untracked files not listed (use -u option to show untracked files)
294 EOF
295 test_expect_success 'status -uno' '
296         git status -uno >output &&
297         test_i18ncmp expect output
298 '
299
300 test_expect_success 'status (status.showUntrackedFiles no)' '
301         git config status.showuntrackedfiles no
302         test_when_finished "git config --unset status.showuntrackedfiles" &&
303         git status >output &&
304         test_i18ncmp expect output
305 '
306
307 cat >expect <<EOF
308 # On branch master
309 # Changes to be committed:
310 #       new file:   dir2/added
311 #
312 # Changes not staged for commit:
313 #       modified:   dir1/modified
314 #
315 # Untracked files not listed
316 EOF
317 git config advice.statusHints false
318 test_expect_success 'status -uno (advice.statusHints false)' '
319         git status -uno >output &&
320         test_i18ncmp expect output
321 '
322 git config --unset advice.statusHints
323
324 cat >expect << EOF
325  M dir1/modified
326 A  dir2/added
327 EOF
328 test_expect_success 'status -s -uno' '
329         git status -s -uno >output &&
330         test_cmp expect output
331 '
332
333 test_expect_success 'status -s (status.showUntrackedFiles no)' '
334         git config status.showuntrackedfiles no
335         git status -s >output &&
336         test_cmp expect output
337 '
338
339 cat >expect <<EOF
340 # On branch master
341 # Changes to be committed:
342 #   (use "git reset HEAD <file>..." to unstage)
343 #
344 #       new file:   dir2/added
345 #
346 # Changes not staged for commit:
347 #   (use "git add <file>..." to update what will be committed)
348 #   (use "git checkout -- <file>..." to discard changes in working directory)
349 #
350 #       modified:   dir1/modified
351 #
352 # Untracked files:
353 #   (use "git add <file>..." to include in what will be committed)
354 #
355 #       dir1/untracked
356 #       dir2/modified
357 #       dir2/untracked
358 #       dir3/
359 #       expect
360 #       output
361 #       untracked
362 EOF
363 test_expect_success 'status -unormal' '
364         git status -unormal >output &&
365         test_i18ncmp expect output
366 '
367
368 test_expect_success 'status (status.showUntrackedFiles normal)' '
369         git config status.showuntrackedfiles normal
370         test_when_finished "git config --unset status.showuntrackedfiles" &&
371         git status >output &&
372         test_i18ncmp expect output
373 '
374
375 cat >expect <<EOF
376  M dir1/modified
377 A  dir2/added
378 ?? dir1/untracked
379 ?? dir2/modified
380 ?? dir2/untracked
381 ?? dir3/
382 ?? expect
383 ?? output
384 ?? untracked
385 EOF
386 test_expect_success 'status -s -unormal' '
387         git status -s -unormal >output &&
388         test_cmp expect output
389 '
390
391 test_expect_success 'status -s (status.showUntrackedFiles normal)' '
392         git config status.showuntrackedfiles normal
393         git status -s >output &&
394         test_cmp expect output
395 '
396
397 cat >expect <<EOF
398 # On branch master
399 # Changes to be committed:
400 #   (use "git reset HEAD <file>..." to unstage)
401 #
402 #       new file:   dir2/added
403 #
404 # Changes not staged for commit:
405 #   (use "git add <file>..." to update what will be committed)
406 #   (use "git checkout -- <file>..." to discard changes in working directory)
407 #
408 #       modified:   dir1/modified
409 #
410 # Untracked files:
411 #   (use "git add <file>..." to include in what will be committed)
412 #
413 #       dir1/untracked
414 #       dir2/modified
415 #       dir2/untracked
416 #       dir3/untracked1
417 #       dir3/untracked2
418 #       expect
419 #       output
420 #       untracked
421 EOF
422 test_expect_success 'status -uall' '
423         git status -uall >output &&
424         test_i18ncmp expect output
425 '
426
427 test_expect_success 'status (status.showUntrackedFiles all)' '
428         git config status.showuntrackedfiles all
429         test_when_finished "git config --unset status.showuntrackedfiles" &&
430         git status >output &&
431         test_i18ncmp expect output
432 '
433
434 test_expect_success 'teardown dir3' '
435         rm -rf dir3
436 '
437
438 cat >expect <<EOF
439  M dir1/modified
440 A  dir2/added
441 ?? dir1/untracked
442 ?? dir2/modified
443 ?? dir2/untracked
444 ?? expect
445 ?? output
446 ?? untracked
447 EOF
448 test_expect_success 'status -s -uall' '
449         git config --unset status.showuntrackedfiles
450         git status -s -uall >output &&
451         test_cmp expect output
452 '
453 test_expect_success 'status -s (status.showUntrackedFiles all)' '
454         git config status.showuntrackedfiles all
455         git status -s >output &&
456         rm -rf dir3 &&
457         git config --unset status.showuntrackedfiles &&
458         test_cmp expect output
459 '
460
461 cat >expect <<\EOF
462 # On branch master
463 # Changes to be committed:
464 #   (use "git reset HEAD <file>..." to unstage)
465 #
466 #       new file:   ../dir2/added
467 #
468 # Changes not staged for commit:
469 #   (use "git add <file>..." to update what will be committed)
470 #   (use "git checkout -- <file>..." to discard changes in working directory)
471 #
472 #       modified:   modified
473 #
474 # Untracked files:
475 #   (use "git add <file>..." to include in what will be committed)
476 #
477 #       untracked
478 #       ../dir2/modified
479 #       ../dir2/untracked
480 #       ../expect
481 #       ../output
482 #       ../untracked
483 EOF
484
485 test_expect_success 'status with relative paths' '
486         (cd dir1 && git status) >output &&
487         test_i18ncmp expect output
488 '
489
490 cat >expect <<\EOF
491  M modified
492 A  ../dir2/added
493 ?? untracked
494 ?? ../dir2/modified
495 ?? ../dir2/untracked
496 ?? ../expect
497 ?? ../output
498 ?? ../untracked
499 EOF
500 test_expect_success 'status -s with relative paths' '
501
502         (cd dir1 && git status -s) >output &&
503         test_cmp expect output
504
505 '
506
507 cat >expect <<\EOF
508  M dir1/modified
509 A  dir2/added
510 ?? dir1/untracked
511 ?? dir2/modified
512 ?? dir2/untracked
513 ?? expect
514 ?? output
515 ?? untracked
516 EOF
517
518 test_expect_success 'status --porcelain ignores relative paths setting' '
519
520         (cd dir1 && git status --porcelain) >output &&
521         test_cmp expect output
522
523 '
524
525 test_expect_success 'setup unique colors' '
526
527         git config status.color.untracked blue &&
528         git config status.color.branch green
529
530 '
531
532 cat >expect <<\EOF
533 # On branch <GREEN>master<RESET>
534 # Changes to be committed:
535 #   (use "git reset HEAD <file>..." to unstage)
536 #
537 #       <GREEN>new file:   dir2/added<RESET>
538 #
539 # Changes not staged for commit:
540 #   (use "git add <file>..." to update what will be committed)
541 #   (use "git checkout -- <file>..." to discard changes in working directory)
542 #
543 #       <RED>modified:   dir1/modified<RESET>
544 #
545 # Untracked files:
546 #   (use "git add <file>..." to include in what will be committed)
547 #
548 #       <BLUE>dir1/untracked<RESET>
549 #       <BLUE>dir2/modified<RESET>
550 #       <BLUE>dir2/untracked<RESET>
551 #       <BLUE>expect<RESET>
552 #       <BLUE>output<RESET>
553 #       <BLUE>untracked<RESET>
554 EOF
555
556 test_expect_success 'status with color.ui' '
557         git config color.ui always &&
558         test_when_finished "git config --unset color.ui" &&
559         git status | test_decode_color >output &&
560         test_i18ncmp expect output
561 '
562
563 test_expect_success 'status with color.status' '
564         git config color.status always &&
565         test_when_finished "git config --unset color.status" &&
566         git status | test_decode_color >output &&
567         test_i18ncmp expect output
568 '
569
570 cat >expect <<\EOF
571  <RED>M<RESET> dir1/modified
572 <GREEN>A<RESET>  dir2/added
573 <BLUE>??<RESET> dir1/untracked
574 <BLUE>??<RESET> dir2/modified
575 <BLUE>??<RESET> dir2/untracked
576 <BLUE>??<RESET> expect
577 <BLUE>??<RESET> output
578 <BLUE>??<RESET> untracked
579 EOF
580
581 test_expect_success 'status -s with color.ui' '
582
583         git config color.ui always &&
584         git status -s | test_decode_color >output &&
585         test_cmp expect output
586
587 '
588
589 test_expect_success 'status -s with color.status' '
590
591         git config --unset color.ui &&
592         git config color.status always &&
593         git status -s | test_decode_color >output &&
594         test_cmp expect output
595
596 '
597
598 cat >expect <<\EOF
599 ## <GREEN>master<RESET>
600  <RED>M<RESET> dir1/modified
601 <GREEN>A<RESET>  dir2/added
602 <BLUE>??<RESET> dir1/untracked
603 <BLUE>??<RESET> dir2/modified
604 <BLUE>??<RESET> dir2/untracked
605 <BLUE>??<RESET> expect
606 <BLUE>??<RESET> output
607 <BLUE>??<RESET> untracked
608 EOF
609
610 test_expect_success 'status -s -b with color.status' '
611
612         git status -s -b | test_decode_color >output &&
613         test_cmp expect output
614
615 '
616
617 cat >expect <<\EOF
618  M dir1/modified
619 A  dir2/added
620 ?? dir1/untracked
621 ?? dir2/modified
622 ?? dir2/untracked
623 ?? expect
624 ?? output
625 ?? untracked
626 EOF
627
628 test_expect_success 'status --porcelain ignores color.ui' '
629
630         git config --unset color.status &&
631         git config color.ui always &&
632         git status --porcelain | test_decode_color >output &&
633         test_cmp expect output
634
635 '
636
637 test_expect_success 'status --porcelain ignores color.status' '
638
639         git config --unset color.ui &&
640         git config color.status always &&
641         git status --porcelain | test_decode_color >output &&
642         test_cmp expect output
643
644 '
645
646 # recover unconditionally from color tests
647 git config --unset color.status
648 git config --unset color.ui
649
650 test_expect_success 'status --porcelain ignores -b' '
651
652         git status --porcelain -b >output &&
653         test_cmp expect output
654
655 '
656
657 cat >expect <<\EOF
658 # On branch master
659 # Changes to be committed:
660 #   (use "git reset HEAD <file>..." to unstage)
661 #
662 #       new file:   dir2/added
663 #
664 # Changes not staged for commit:
665 #   (use "git add <file>..." to update what will be committed)
666 #   (use "git checkout -- <file>..." to discard changes in working directory)
667 #
668 #       modified:   dir1/modified
669 #
670 # Untracked files:
671 #   (use "git add <file>..." to include in what will be committed)
672 #
673 #       dir1/untracked
674 #       dir2/modified
675 #       dir2/untracked
676 #       expect
677 #       output
678 #       untracked
679 EOF
680
681
682 test_expect_success 'status without relative paths' '
683
684         git config status.relativePaths false &&
685         test_when_finished "git config --unset status.relativePaths" &&
686         (cd dir1 && git status) >output &&
687         test_i18ncmp expect output
688
689 '
690
691 cat >expect <<\EOF
692  M dir1/modified
693 A  dir2/added
694 ?? dir1/untracked
695 ?? dir2/modified
696 ?? dir2/untracked
697 ?? expect
698 ?? output
699 ?? untracked
700 EOF
701
702 test_expect_success 'status -s without relative paths' '
703
704         git config status.relativePaths false &&
705         test_when_finished "git config --unset status.relativePaths" &&
706         (cd dir1 && git status -s) >output &&
707         test_cmp expect output
708
709 '
710
711 cat <<EOF >expect
712 # On branch master
713 # Changes to be committed:
714 #   (use "git reset HEAD <file>..." to unstage)
715 #
716 #       modified:   dir1/modified
717 #
718 # Untracked files:
719 #   (use "git add <file>..." to include in what will be committed)
720 #
721 #       dir1/untracked
722 #       dir2/
723 #       expect
724 #       output
725 #       untracked
726 EOF
727 test_expect_success 'dry-run of partial commit excluding new file in index' '
728         git commit --dry-run dir1/modified >output &&
729         test_i18ncmp expect output
730 '
731
732 cat >expect <<EOF
733 :100644 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 M      dir1/modified
734 EOF
735 test_expect_success 'status refreshes the index' '
736         touch dir2/added &&
737         git status &&
738         git diff-files >output &&
739         test_cmp expect output
740 '
741
742 test_expect_success 'setup status submodule summary' '
743         test_create_repo sm && (
744                 cd sm &&
745                 >foo &&
746                 git add foo &&
747                 git commit -m "Add foo"
748         ) &&
749         git add sm
750 '
751
752 cat >expect <<EOF
753 # On branch master
754 # Changes to be committed:
755 #   (use "git reset HEAD <file>..." to unstage)
756 #
757 #       new file:   dir2/added
758 #       new file:   sm
759 #
760 # Changes not staged for commit:
761 #   (use "git add <file>..." to update what will be committed)
762 #   (use "git checkout -- <file>..." to discard changes in working directory)
763 #
764 #       modified:   dir1/modified
765 #
766 # Untracked files:
767 #   (use "git add <file>..." to include in what will be committed)
768 #
769 #       dir1/untracked
770 #       dir2/modified
771 #       dir2/untracked
772 #       expect
773 #       output
774 #       untracked
775 EOF
776 test_expect_success 'status submodule summary is disabled by default' '
777         git status >output &&
778         test_i18ncmp expect output
779 '
780
781 # we expect the same as the previous test
782 test_expect_success 'status --untracked-files=all does not show submodule' '
783         git status --untracked-files=all >output &&
784         test_i18ncmp expect output
785 '
786
787 cat >expect <<EOF
788  M dir1/modified
789 A  dir2/added
790 A  sm
791 ?? dir1/untracked
792 ?? dir2/modified
793 ?? dir2/untracked
794 ?? expect
795 ?? output
796 ?? untracked
797 EOF
798 test_expect_success 'status -s submodule summary is disabled by default' '
799         git status -s >output &&
800         test_cmp expect output
801 '
802
803 # we expect the same as the previous test
804 test_expect_success 'status -s --untracked-files=all does not show submodule' '
805         git status -s --untracked-files=all >output &&
806         test_cmp expect output
807 '
808
809 head=$(cd sm && git rev-parse --short=7 --verify HEAD)
810
811 cat >expect <<EOF
812 # On branch master
813 # Changes to be committed:
814 #   (use "git reset HEAD <file>..." to unstage)
815 #
816 #       new file:   dir2/added
817 #       new file:   sm
818 #
819 # Changes not staged for commit:
820 #   (use "git add <file>..." to update what will be committed)
821 #   (use "git checkout -- <file>..." to discard changes in working directory)
822 #
823 #       modified:   dir1/modified
824 #
825 # Submodule changes to be committed:
826 #
827 # * sm 0000000...$head (1):
828 #   > Add foo
829 #
830 # Untracked files:
831 #   (use "git add <file>..." to include in what will be committed)
832 #
833 #       dir1/untracked
834 #       dir2/modified
835 #       dir2/untracked
836 #       expect
837 #       output
838 #       untracked
839 EOF
840 test_expect_success 'status submodule summary' '
841         git config status.submodulesummary 10 &&
842         git status >output &&
843         test_i18ncmp expect output
844 '
845
846 cat >expect <<EOF
847  M dir1/modified
848 A  dir2/added
849 A  sm
850 ?? dir1/untracked
851 ?? dir2/modified
852 ?? dir2/untracked
853 ?? expect
854 ?? output
855 ?? untracked
856 EOF
857 test_expect_success 'status -s submodule summary' '
858         git status -s >output &&
859         test_cmp expect output
860 '
861
862 cat >expect <<EOF
863 # On branch master
864 # Changes not staged for commit:
865 #   (use "git add <file>..." to update what will be committed)
866 #   (use "git checkout -- <file>..." to discard changes in working directory)
867 #
868 #       modified:   dir1/modified
869 #
870 # Untracked files:
871 #   (use "git add <file>..." to include in what will be committed)
872 #
873 #       dir1/untracked
874 #       dir2/modified
875 #       dir2/untracked
876 #       expect
877 #       output
878 #       untracked
879 no changes added to commit (use "git add" and/or "git commit -a")
880 EOF
881 test_expect_success 'status submodule summary (clean submodule): commit' '
882         git commit -m "commit submodule" &&
883         git config status.submodulesummary 10 &&
884         test_must_fail git commit --dry-run >output &&
885         test_i18ncmp expect output &&
886         git status >output &&
887         test_i18ncmp expect output
888 '
889
890 cat >expect <<EOF
891  M dir1/modified
892 ?? dir1/untracked
893 ?? dir2/modified
894 ?? dir2/untracked
895 ?? expect
896 ?? output
897 ?? untracked
898 EOF
899 test_expect_success 'status -s submodule summary (clean submodule)' '
900         git status -s >output &&
901         test_cmp expect output
902 '
903
904 test_expect_success 'status -z implies porcelain' '
905         git status --porcelain |
906         perl -pe "s/\012/\000/g" >expect &&
907         git status -z >output &&
908         test_cmp expect output
909 '
910
911 cat >expect <<EOF
912 # On branch master
913 # Changes to be committed:
914 #   (use "git reset HEAD^1 <file>..." to unstage)
915 #
916 #       new file:   dir2/added
917 #       new file:   sm
918 #
919 # Changes not staged for commit:
920 #   (use "git add <file>..." to update what will be committed)
921 #   (use "git checkout -- <file>..." to discard changes in working directory)
922 #
923 #       modified:   dir1/modified
924 #
925 # Submodule changes to be committed:
926 #
927 # * sm 0000000...$head (1):
928 #   > Add foo
929 #
930 # Untracked files:
931 #   (use "git add <file>..." to include in what will be committed)
932 #
933 #       dir1/untracked
934 #       dir2/modified
935 #       dir2/untracked
936 #       expect
937 #       output
938 #       untracked
939 EOF
940 test_expect_success 'commit --dry-run submodule summary (--amend)' '
941         git config status.submodulesummary 10 &&
942         git commit --dry-run --amend >output &&
943         test_i18ncmp expect output
944 '
945
946 test_expect_success POSIXPERM,SANITY 'status succeeds in a read-only repository' '
947         (
948                 chmod a-w .git &&
949                 # make dir1/tracked stat-dirty
950                 >dir1/tracked1 && mv -f dir1/tracked1 dir1/tracked &&
951                 git status -s >output &&
952                 ! grep dir1/tracked output &&
953                 # make sure "status" succeeded without writing index out
954                 git diff-files | grep dir1/tracked
955         )
956         status=$?
957         chmod 775 .git
958         (exit $status)
959 '
960
961 (cd sm && echo > bar && git add bar && git commit -q -m 'Add bar') && git add sm
962 new_head=$(cd sm && git rev-parse --short=7 --verify HEAD)
963 touch .gitmodules
964
965 cat > expect << EOF
966 # On branch master
967 # Changes to be committed:
968 #   (use "git reset HEAD <file>..." to unstage)
969 #
970 #       modified:   sm
971 #
972 # Changes not staged for commit:
973 #   (use "git add <file>..." to update what will be committed)
974 #   (use "git checkout -- <file>..." to discard changes in working directory)
975 #
976 #       modified:   dir1/modified
977 #
978 # Submodule changes to be committed:
979 #
980 # * sm $head...$new_head (1):
981 #   > Add bar
982 #
983 # Untracked files:
984 #   (use "git add <file>..." to include in what will be committed)
985 #
986 #       .gitmodules
987 #       dir1/untracked
988 #       dir2/modified
989 #       dir2/untracked
990 #       expect
991 #       output
992 #       untracked
993 EOF
994
995 test_expect_success '--ignore-submodules=untracked suppresses submodules with untracked content' '
996         echo modified  sm/untracked &&
997         git status --ignore-submodules=untracked >output &&
998         test_i18ncmp expect output
999 '
1000
1001 test_expect_success '.gitmodules ignore=untracked suppresses submodules with untracked content' '
1002         git config diff.ignoreSubmodules dirty &&
1003         git status >output &&
1004         test_i18ncmp expect output &&
1005         git config --add -f .gitmodules submodule.subname.ignore untracked &&
1006         git config --add -f .gitmodules submodule.subname.path sm &&
1007         git status >output &&
1008         test_i18ncmp expect output &&
1009         git config -f .gitmodules  --remove-section submodule.subname &&
1010         git config --unset diff.ignoreSubmodules
1011 '
1012
1013 test_expect_success '.git/config ignore=untracked suppresses submodules with untracked content' '
1014         git config --add -f .gitmodules submodule.subname.ignore none &&
1015         git config --add -f .gitmodules submodule.subname.path sm &&
1016         git config --add submodule.subname.ignore untracked &&
1017         git config --add submodule.subname.path sm &&
1018         git status >output &&
1019         test_i18ncmp expect output &&
1020         git config --remove-section submodule.subname &&
1021         git config --remove-section -f .gitmodules submodule.subname
1022 '
1023
1024 test_expect_success '--ignore-submodules=dirty suppresses submodules with untracked content' '
1025         git status --ignore-submodules=dirty >output &&
1026         test_i18ncmp expect output
1027 '
1028
1029 test_expect_success '.gitmodules ignore=dirty suppresses submodules with untracked content' '
1030         git config diff.ignoreSubmodules dirty &&
1031         git status >output &&
1032         ! test -s actual &&
1033         git config --add -f .gitmodules submodule.subname.ignore dirty &&
1034         git config --add -f .gitmodules submodule.subname.path sm &&
1035         git status >output &&
1036         test_i18ncmp expect output &&
1037         git config -f .gitmodules  --remove-section submodule.subname &&
1038         git config --unset diff.ignoreSubmodules
1039 '
1040
1041 test_expect_success '.git/config ignore=dirty suppresses submodules with untracked content' '
1042         git config --add -f .gitmodules submodule.subname.ignore none &&
1043         git config --add -f .gitmodules submodule.subname.path sm &&
1044         git config --add submodule.subname.ignore dirty &&
1045         git config --add submodule.subname.path sm &&
1046         git status >output &&
1047         test_i18ncmp expect output &&
1048         git config --remove-section submodule.subname &&
1049         git config -f .gitmodules  --remove-section submodule.subname
1050 '
1051
1052 test_expect_success '--ignore-submodules=dirty suppresses submodules with modified content' '
1053         echo modified >sm/foo &&
1054         git status --ignore-submodules=dirty >output &&
1055         test_i18ncmp expect output
1056 '
1057
1058 test_expect_success '.gitmodules ignore=dirty suppresses submodules with modified content' '
1059         git config --add -f .gitmodules submodule.subname.ignore dirty &&
1060         git config --add -f .gitmodules submodule.subname.path sm &&
1061         git status >output &&
1062         test_i18ncmp expect output &&
1063         git config -f .gitmodules  --remove-section submodule.subname
1064 '
1065
1066 test_expect_success '.git/config ignore=dirty suppresses submodules with modified content' '
1067         git config --add -f .gitmodules submodule.subname.ignore none &&
1068         git config --add -f .gitmodules submodule.subname.path sm &&
1069         git config --add submodule.subname.ignore dirty &&
1070         git config --add submodule.subname.path sm &&
1071         git status >output &&
1072         test_i18ncmp expect output &&
1073         git config --remove-section submodule.subname &&
1074         git config -f .gitmodules  --remove-section submodule.subname
1075 '
1076
1077 cat > expect << EOF
1078 # On branch master
1079 # Changes to be committed:
1080 #   (use "git reset HEAD <file>..." to unstage)
1081 #
1082 #       modified:   sm
1083 #
1084 # Changes not staged for commit:
1085 #   (use "git add <file>..." to update what will be committed)
1086 #   (use "git checkout -- <file>..." to discard changes in working directory)
1087 #   (commit or discard the untracked or modified content in submodules)
1088 #
1089 #       modified:   dir1/modified
1090 #       modified:   sm (modified content)
1091 #
1092 # Submodule changes to be committed:
1093 #
1094 # * sm $head...$new_head (1):
1095 #   > Add bar
1096 #
1097 # Untracked files:
1098 #   (use "git add <file>..." to include in what will be committed)
1099 #
1100 #       .gitmodules
1101 #       dir1/untracked
1102 #       dir2/modified
1103 #       dir2/untracked
1104 #       expect
1105 #       output
1106 #       untracked
1107 EOF
1108
1109 test_expect_success "--ignore-submodules=untracked doesn't suppress submodules with modified content" '
1110         git status --ignore-submodules=untracked > output &&
1111         test_i18ncmp expect output
1112 '
1113
1114 test_expect_success ".gitmodules ignore=untracked doesn't suppress submodules with modified content" '
1115         git config --add -f .gitmodules submodule.subname.ignore untracked &&
1116         git config --add -f .gitmodules submodule.subname.path sm &&
1117         git status >output &&
1118         test_i18ncmp expect output &&
1119         git config -f .gitmodules  --remove-section submodule.subname
1120 '
1121
1122 test_expect_success ".git/config ignore=untracked doesn't suppress submodules with modified content" '
1123         git config --add -f .gitmodules submodule.subname.ignore none &&
1124         git config --add -f .gitmodules submodule.subname.path sm &&
1125         git config --add submodule.subname.ignore untracked &&
1126         git config --add submodule.subname.path sm &&
1127         git status >output &&
1128         test_i18ncmp expect output &&
1129         git config --remove-section submodule.subname &&
1130         git config -f .gitmodules  --remove-section submodule.subname
1131 '
1132
1133 head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --verify HEAD)
1134
1135 cat > expect << EOF
1136 # On branch master
1137 # Changes to be committed:
1138 #   (use "git reset HEAD <file>..." to unstage)
1139 #
1140 #       modified:   sm
1141 #
1142 # Changes not staged for commit:
1143 #   (use "git add <file>..." to update what will be committed)
1144 #   (use "git checkout -- <file>..." to discard changes in working directory)
1145 #
1146 #       modified:   dir1/modified
1147 #       modified:   sm (new commits)
1148 #
1149 # Submodule changes to be committed:
1150 #
1151 # * sm $head...$new_head (1):
1152 #   > Add bar
1153 #
1154 # Submodules changed but not updated:
1155 #
1156 # * sm $new_head...$head2 (1):
1157 #   > 2nd commit
1158 #
1159 # Untracked files:
1160 #   (use "git add <file>..." to include in what will be committed)
1161 #
1162 #       .gitmodules
1163 #       dir1/untracked
1164 #       dir2/modified
1165 #       dir2/untracked
1166 #       expect
1167 #       output
1168 #       untracked
1169 EOF
1170
1171 test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" '
1172         git status --ignore-submodules=untracked > output &&
1173         test_i18ncmp expect output
1174 '
1175
1176 test_expect_success ".gitmodules ignore=untracked doesn't suppress submodule summary" '
1177         git config --add -f .gitmodules submodule.subname.ignore untracked &&
1178         git config --add -f .gitmodules submodule.subname.path sm &&
1179         git status >output &&
1180         test_i18ncmp expect output &&
1181         git config -f .gitmodules  --remove-section submodule.subname
1182 '
1183
1184 test_expect_success ".git/config ignore=untracked doesn't suppress submodule summary" '
1185         git config --add -f .gitmodules submodule.subname.ignore none &&
1186         git config --add -f .gitmodules submodule.subname.path sm &&
1187         git config --add submodule.subname.ignore untracked &&
1188         git config --add submodule.subname.path sm &&
1189         git status >output &&
1190         test_i18ncmp expect output &&
1191         git config --remove-section submodule.subname &&
1192         git config -f .gitmodules  --remove-section submodule.subname
1193 '
1194
1195 test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summary" '
1196         git status --ignore-submodules=dirty > output &&
1197         test_i18ncmp expect output
1198 '
1199 test_expect_success ".gitmodules ignore=dirty doesn't suppress submodule summary" '
1200         git config --add -f .gitmodules submodule.subname.ignore dirty &&
1201         git config --add -f .gitmodules submodule.subname.path sm &&
1202         git status >output &&
1203         test_i18ncmp expect output &&
1204         git config -f .gitmodules  --remove-section submodule.subname
1205 '
1206
1207 test_expect_success ".git/config ignore=dirty doesn't suppress submodule summary" '
1208         git config --add -f .gitmodules submodule.subname.ignore none &&
1209         git config --add -f .gitmodules submodule.subname.path sm &&
1210         git config --add submodule.subname.ignore dirty &&
1211         git config --add submodule.subname.path sm &&
1212         git status >output &&
1213         test_i18ncmp expect output &&
1214         git config --remove-section submodule.subname &&
1215         git config -f .gitmodules  --remove-section submodule.subname
1216 '
1217
1218 cat > expect << EOF
1219 # On branch master
1220 # Changes not staged for commit:
1221 #   (use "git add <file>..." to update what will be committed)
1222 #   (use "git checkout -- <file>..." to discard changes in working directory)
1223 #
1224 #       modified:   dir1/modified
1225 #
1226 # Untracked files:
1227 #   (use "git add <file>..." to include in what will be committed)
1228 #
1229 #       .gitmodules
1230 #       dir1/untracked
1231 #       dir2/modified
1232 #       dir2/untracked
1233 #       expect
1234 #       output
1235 #       untracked
1236 no changes added to commit (use "git add" and/or "git commit -a")
1237 EOF
1238
1239 test_expect_success "--ignore-submodules=all suppresses submodule summary" '
1240         git status --ignore-submodules=all > output &&
1241         test_i18ncmp expect output
1242 '
1243
1244 test_expect_failure '.gitmodules ignore=all suppresses submodule summary' '
1245         git config --add -f .gitmodules submodule.subname.ignore all &&
1246         git config --add -f .gitmodules submodule.subname.path sm &&
1247         git status > output &&
1248         test_cmp expect output &&
1249         git config -f .gitmodules  --remove-section submodule.subname
1250 '
1251
1252 test_expect_failure '.git/config ignore=all suppresses submodule summary' '
1253         git config --add -f .gitmodules submodule.subname.ignore none &&
1254         git config --add -f .gitmodules submodule.subname.path sm &&
1255         git config --add submodule.subname.ignore all &&
1256         git config --add submodule.subname.path sm &&
1257         git status > output &&
1258         test_cmp expect output &&
1259         git config --remove-section submodule.subname &&
1260         git config -f .gitmodules  --remove-section submodule.subname
1261 '
1262
1263 test_done