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