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