1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Johannes E. Schindelin
4 #
6 test_description='git status'
8 . ./test-lib.sh
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 '
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 '
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 . &&
45 git status >output &&
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 '
58 test_expect_success C_LOCALE_OUTPUT 'status (1)' '
60 grep "use \"git rm --cached <file>\.\.\.\" to unstage" output
62 '
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
88 test_expect_success C_LOCALE_OUTPUT 'status (2)' '
90 git status >output &&
91 test_cmp expect output
93 '
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
112 git config advice.statusHints false
114 test_expect_success C_LOCALE_OUTPUT 'status (advice.statusHints false)' '
116 git status >output &&
117 test_cmp expect output
119 '
121 git config --unset advice.statusHints
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
134 test_expect_success 'status -s' '
136 git status -s >output &&
137 test_cmp expect output
139 '
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
153 test_expect_success 'status -s -b' '
155 git status -s -b >output &&
156 test_cmp expect output
158 '
160 test_expect_success 'setup dir3' '
161 mkdir dir3 &&
162 : >dir3/untracked1 &&
163 : >dir3/untracked2
164 '
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 '
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 '
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
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 '
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 '
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 '
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 '
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 '
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 '
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 '
319 test_expect_success 'teardown dir3' '
320 rm -rf dir3
321 '
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 '
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
370 test_expect_success C_LOCALE_OUTPUT 'status with relative paths' '
372 (cd dir1 && git status) >output &&
373 test_cmp expect output
375 '
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' '
389 (cd dir1 && git status -s) >output &&
390 test_cmp expect output
392 '
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
405 test_expect_success 'status --porcelain ignores relative paths setting' '
407 (cd dir1 && git status --porcelain) >output &&
408 test_cmp expect output
410 '
412 test_expect_success 'setup unique colors' '
414 git config status.color.untracked blue &&
415 git config status.color.branch green
417 '
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
443 test_expect_success C_LOCALE_OUTPUT 'status with color.ui' '
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
450 '
452 test_expect_success C_LOCALE_OUTPUT 'status with color.status' '
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
459 '
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
472 test_expect_success 'status -s with color.ui' '
474 git config color.ui always &&
475 git status -s | test_decode_color >output &&
476 test_cmp expect output
478 '
480 test_expect_success 'status -s with color.status' '
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
487 '
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
501 test_expect_success 'status -s -b with color.status' '
503 git status -s -b | test_decode_color >output &&
504 test_cmp expect output
506 '
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
519 test_expect_success 'status --porcelain ignores color.ui' '
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
526 '
528 test_expect_success 'status --porcelain ignores color.status' '
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
535 '
537 # recover unconditionally from color tests
538 git config --unset color.status
539 git config --unset color.ui
541 test_expect_success 'status --porcelain ignores -b' '
543 git status --porcelain -b >output &&
544 test_cmp expect output
546 '
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
573 test_expect_success C_LOCALE_OUTPUT 'status without relative paths' '
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
580 '
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
593 test_expect_success 'status -s without relative paths' '
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
600 '
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 '
622 test_expect_success C_LOCALE_OUTPUT 'dry-run of partial commit excluding new file in index: output' '
623 test_cmp expect output
624 '
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 '
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 '
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 '
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 '
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 '
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 '
703 head=$(cd sm && git rev-parse --short=7 --verify HEAD)
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 '
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 '
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 '
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 '
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 '
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 '
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 '
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
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
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 '
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 '
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 '
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 '
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 '
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 '
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 '
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 '
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 '
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
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 '
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 '
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 '
1023 head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --verify HEAD)
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
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 '
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 '
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 '
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 '
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 '
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
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 '
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 '
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 '
1153 test_done