1#!/bin/sh
2#
3# Copyright (c) 2007 Johannes E. Schindelin
4#
5
6test_description='git status'
7
8. ./test-lib.sh
9
10test_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
22test_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
34test_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
58test_expect_success 'status (1)' '
59 test_i18ngrep "use \"git rm --cached <file>\.\.\.\" to unstage" output
60'
61
62cat >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
84EOF
85
86test_expect_success 'status (2)' '
87 git status >output &&
88 test_i18ncmp expect output
89'
90
91cat >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
106EOF
107
108test_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
116cat >expect <<\EOF
117 M dir1/modified
118A dir2/added
119?? dir1/untracked
120?? dir2/modified
121?? dir2/untracked
122?? expect
123?? output
124?? untracked
125EOF
126
127test_expect_success 'status -s' '
128
129 git status -s >output &&
130 test_cmp expect output
131
132'
133
134cat >expect <<\EOF
135## master
136 M dir1/modified
137A dir2/added
138?? dir1/untracked
139?? dir2/modified
140?? dir2/untracked
141?? expect
142?? output
143?? untracked
144EOF
145
146test_expect_success 'status -s -b' '
147
148 git status -s -b >output &&
149 test_cmp expect output
150
151'
152
153test_expect_success 'setup dir3' '
154 mkdir dir3 &&
155 : >dir3/untracked1 &&
156 : >dir3/untracked2
157'
158
159cat >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)
173EOF
174test_expect_success 'status -uno' '
175 git status -uno >output &&
176 test_i18ncmp expect output
177'
178
179test_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
186cat >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
195EOF
196git config advice.statusHints false
197test_expect_success 'status -uno (advice.statusHints false)' '
198 git status -uno >output &&
199 test_i18ncmp expect output
200'
201git config --unset advice.statusHints
202
203cat >expect << EOF
204 M dir1/modified
205A dir2/added
206EOF
207test_expect_success 'status -s -uno' '
208 git status -s -uno >output &&
209 test_cmp expect output
210'
211
212test_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
218cat >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
241EOF
242test_expect_success 'status -unormal' '
243 git status -unormal >output &&
244 test_i18ncmp expect output
245'
246
247test_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
254cat >expect <<EOF
255 M dir1/modified
256A dir2/added
257?? dir1/untracked
258?? dir2/modified
259?? dir2/untracked
260?? dir3/
261?? expect
262?? output
263?? untracked
264EOF
265test_expect_success 'status -s -unormal' '
266 git status -s -unormal >output &&
267 test_cmp expect output
268'
269
270test_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
276cat >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
300EOF
301test_expect_success 'status -uall' '
302 git status -uall >output &&
303 test_i18ncmp expect output
304'
305
306test_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
313test_expect_success 'teardown dir3' '
314 rm -rf dir3
315'
316
317cat >expect <<EOF
318 M dir1/modified
319A dir2/added
320?? dir1/untracked
321?? dir2/modified
322?? dir2/untracked
323?? expect
324?? output
325?? untracked
326EOF
327test_expect_success 'status -s -uall' '
328 git config --unset status.showuntrackedfiles
329 git status -s -uall >output &&
330 test_cmp expect output
331'
332test_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
340cat >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
362EOF
363
364test_expect_success 'status with relative paths' '
365 (cd dir1 && git status) >output &&
366 test_i18ncmp expect output
367'
368
369cat >expect <<\EOF
370 M modified
371A ../dir2/added
372?? untracked
373?? ../dir2/modified
374?? ../dir2/untracked
375?? ../expect
376?? ../output
377?? ../untracked
378EOF
379test_expect_success 'status -s with relative paths' '
380
381 (cd dir1 && git status -s) >output &&
382 test_cmp expect output
383
384'
385
386cat >expect <<\EOF
387 M dir1/modified
388A dir2/added
389?? dir1/untracked
390?? dir2/modified
391?? dir2/untracked
392?? expect
393?? output
394?? untracked
395EOF
396
397test_expect_success 'status --porcelain ignores relative paths setting' '
398
399 (cd dir1 && git status --porcelain) >output &&
400 test_cmp expect output
401
402'
403
404test_expect_success 'setup unique colors' '
405
406 git config status.color.untracked blue &&
407 git config status.color.branch green
408
409'
410
411cat >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>
433EOF
434
435test_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
442test_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
449cat >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
458EOF
459
460test_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
468test_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
477cat >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
487EOF
488
489test_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
496cat >expect <<\EOF
497 M dir1/modified
498A dir2/added
499?? dir1/untracked
500?? dir2/modified
501?? dir2/untracked
502?? expect
503?? output
504?? untracked
505EOF
506
507test_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
516test_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
526git config --unset color.status
527git config --unset color.ui
528
529test_expect_success 'status --porcelain ignores -b' '
530
531 git status --porcelain -b >output &&
532 test_cmp expect output
533
534'
535
536cat >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
558EOF
559
560
561test_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
570cat >expect <<\EOF
571 M dir1/modified
572A dir2/added
573?? dir1/untracked
574?? dir2/modified
575?? dir2/untracked
576?? expect
577?? output
578?? untracked
579EOF
580
581test_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
590cat <<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
605EOF
606test_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
611cat >expect <<EOF
612:100644 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 M dir1/modified
613EOF
614test_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
621test_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
631cat >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
654EOF
655test_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
661test_expect_success 'status --untracked-files=all does not show submodule' '
662 git status --untracked-files=all >output &&
663 test_i18ncmp expect output
664'
665
666cat >expect <<EOF
667 M dir1/modified
668A dir2/added
669A sm
670?? dir1/untracked
671?? dir2/modified
672?? dir2/untracked
673?? expect
674?? output
675?? untracked
676EOF
677test_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
683test_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
688head=$(cd sm && git rev-parse --short=7 --verify HEAD)
689
690cat >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
718EOF
719test_expect_success 'status submodule summary' '
720 git config status.submodulesummary 10 &&
721 git status >output &&
722 test_i18ncmp expect output
723'
724
725cat >expect <<EOF
726 M dir1/modified
727A dir2/added
728A sm
729?? dir1/untracked
730?? dir2/modified
731?? dir2/untracked
732?? expect
733?? output
734?? untracked
735EOF
736test_expect_success 'status -s submodule summary' '
737 git status -s >output &&
738 test_cmp expect output
739'
740
741cat >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
758no changes added to commit (use "git add" and/or "git commit -a")
759EOF
760test_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
769cat >expect <<EOF
770 M dir1/modified
771?? dir1/untracked
772?? dir2/modified
773?? dir2/untracked
774?? expect
775?? output
776?? untracked
777EOF
778test_expect_success 'status -s submodule summary (clean submodule)' '
779 git status -s >output &&
780 test_cmp expect output
781'
782
783test_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
790cat >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
818EOF
819test_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
825test_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
841new_head=$(cd sm && git rev-parse --short=7 --verify HEAD)
842touch .gitmodules
843
844cat > 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
872EOF
873
874test_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
880test_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
892test_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
903test_expect_success '--ignore-submodules=dirty suppresses submodules with untracked content' '
904 git status --ignore-submodules=dirty >output &&
905 test_i18ncmp expect output
906'
907
908test_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
920test_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
931test_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
937test_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
945test_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
956cat > 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
986EOF
987
988test_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
993test_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
1001test_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
1012head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --verify HEAD)
1013
1014cat > 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
1048EOF
1049
1050test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" '
1051 git status --ignore-submodules=untracked > output &&
1052 test_i18ncmp expect output
1053'
1054
1055test_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
1063test_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
1074test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summary" '
1075 git status --ignore-submodules=dirty > output &&
1076 test_i18ncmp expect output
1077'
1078test_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
1086test_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
1097cat > 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
1115no changes added to commit (use "git add" and/or "git commit -a")
1116EOF
1117
1118test_expect_success "--ignore-submodules=all suppresses submodule summary" '
1119 git status --ignore-submodules=all > output &&
1120 test_i18ncmp expect output
1121'
1122
1123test_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
1131test_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
1142test_done