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