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