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