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