3 # Copyright (c) 2007 Johannes E. Schindelin
6 test_description
='git status'
8 TEST_PASSES_SANITIZE_LEAK
=true
10 .
"$TEST_DIRECTORY"/lib-terminal.sh
12 test_expect_success
'status -h in broken repository' '
13 git config --global advice.statusuoption false &&
15 test_when_finished "rm -fr broken" &&
19 echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
20 test_expect_code 129 git status -h >usage 2>&1
22 test_i18ngrep "[Uu]sage" broken/usage
25 test_expect_success
'commit -h in broken repository' '
27 test_when_finished "rm -fr broken" &&
31 echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
32 test_expect_code 129 git commit -h >usage 2>&1
34 test_i18ngrep "[Uu]sage" broken/usage
37 test_expect_success
'create upstream branch' '
38 git checkout -b upstream &&
39 test_commit upstream1 &&
40 test_commit upstream2 &&
41 # leave the first commit on main as root because several
42 # tests depend on this case; for our upstream we only
43 # care about commit counts anyway, so a totally divergent
45 git checkout --orphan main
48 test_expect_success
'setup' '
62 git commit -m initial &&
66 echo 1 >dir1/modified &&
67 echo 2 >dir2/modified &&
71 git branch --set-upstream-to=upstream
74 test_expect_success
'status (1)' '
75 test_i18ngrep "use \"git rm --cached <file>\.\.\.\" to unstage" output
80 sed "s/^\# //; s/^\#$//; s/^#$tab/$tab/" <"$1" >"$1".tmp
&&
81 rm "$1" && mv "$1".tmp
"$1"
84 cat >.gitignore
<<\EOF
90 test_expect_success
'status --column' '
93 # Your branch and '\''upstream'\'' have diverged,
94 # and have 1 and 2 different commits each, respectively.
95 # (use "git pull" to merge the remote branch into yours)
97 # Changes to be committed:
98 # (use "git restore --staged <file>..." to unstage)
99 # new file: dir2/added
101 # Changes not staged for commit:
102 # (use "git add <file>..." to update what will be committed)
103 # (use "git restore <file>..." to discard changes in working directory)
104 # modified: dir1/modified
107 # (use "git add <file>..." to include in what will be committed)
108 # dir1/untracked dir2/untracked
109 # dir2/modified untracked
112 COLUMNS=50 git -c status.displayCommentPrefix=true status --column="column dense" >output &&
113 test_cmp expect output
116 test_expect_success
'status --column status.displayCommentPrefix=false' '
117 strip_comments expect &&
118 COLUMNS=49 git -c status.displayCommentPrefix=false status --column="column dense" >output &&
119 test_cmp expect output
124 # Your branch and 'upstream' have diverged,
125 # and have 1 and 2 different commits each, respectively.
126 # (use "git pull" to merge the remote branch into yours)
128 # Changes to be committed:
129 # (use "git restore --staged <file>..." to unstage)
130 # new file: dir2/added
132 # Changes not staged for commit:
133 # (use "git add <file>..." to update what will be committed)
134 # (use "git restore <file>..." to discard changes in working directory)
135 # modified: dir1/modified
138 # (use "git add <file>..." to include in what will be committed)
146 test_expect_success
'status with status.displayCommentPrefix=true' '
147 git -c status.displayCommentPrefix=true status >output &&
148 test_cmp expect output
151 test_expect_success
'status with status.displayCommentPrefix=false' '
152 strip_comments expect &&
153 git -c status.displayCommentPrefix=false status >output &&
154 test_cmp expect output
157 test_expect_success
'status -v' '
158 (cat expect && git diff --cached) >expect-with-v &&
159 git status -v >output &&
160 test_cmp expect-with-v output
163 test_expect_success
'status -v -v' '
165 echo "Changes to be committed:" &&
166 git -c diff.mnemonicprefix=true diff --cached &&
167 echo "--------------------------------------------------" &&
168 echo "Changes not staged for commit:" &&
169 git -c diff.mnemonicprefix=true diff) >expect-with-v &&
170 git status -v -v >output &&
171 test_cmp expect-with-v output
174 test_expect_success
'setup fake editor' '
175 cat >.git/editor <<-\EOF &&
179 chmod 755 .git/editor
182 commit_template_commented
() {
184 EDITOR
=.git
/editor
&&
186 # Fails due to empty message
187 test_must_fail git commit
189 ! grep '^[^#]' output
192 test_expect_success
'commit ignores status.displayCommentPrefix=false in COMMIT_EDITMSG' '
193 commit_template_commented
198 Your branch and
'upstream' have diverged
,
199 and have
1 and
2 different commits each
, respectively.
201 Changes to be committed
:
204 Changes not staged
for commit
:
205 modified
: dir
1/modified
215 test_expect_success
'status (advice.statusHints false)' '
216 test_config advice.statusHints false &&
217 git status >output &&
218 test_cmp expect output
231 test_expect_success
'status -s' '
233 git status -s >output &&
234 test_cmp expect output
238 test_expect_success
'status with gitignore' '
246 cat >expect <<-\EOF &&
251 git status -s >output &&
252 test_cmp expect output &&
254 cat >expect <<-\EOF &&
266 git status -s --ignored >output &&
267 test_cmp expect output &&
269 cat >expect <<\EOF &&
271 Your branch and '\''upstream'\'' have diverged,
272 and have 1 and 2 different commits each, respectively.
273 (use "git pull" to merge the remote branch into yours)
275 Changes to be committed:
276 (use "git restore --staged <file>..." to unstage)
279 Changes not staged for commit:
280 (use "git add <file>..." to update what will be committed)
281 (use "git restore <file>..." to discard changes in working directory)
282 modified: dir1/modified
285 (use "git add <file>..." to include in what will be committed)
289 (use "git add -f <file>..." to include in what will be committed)
299 git status --ignored >output &&
300 test_cmp expect output
303 test_expect_success
'status with gitignore (nothing untracked)' '
307 echo "dir2/modified" &&
312 cat >expect <<-\EOF &&
316 git status -s >output &&
317 test_cmp expect output &&
319 cat >expect <<-\EOF &&
331 git status -s --ignored >output &&
332 test_cmp expect output &&
334 cat >expect <<\EOF &&
336 Your branch and '\''upstream'\'' have diverged,
337 and have 1 and 2 different commits each, respectively.
338 (use "git pull" to merge the remote branch into yours)
340 Changes to be committed:
341 (use "git restore --staged <file>..." to unstage)
344 Changes not staged for commit:
345 (use "git add <file>..." to update what will be committed)
346 (use "git restore <file>..." to discard changes in working directory)
347 modified: dir1/modified
350 (use "git add -f <file>..." to include in what will be committed)
361 git status --ignored >output &&
362 test_cmp expect output
365 cat >.gitignore
<<\EOF
372 ## main...upstream [ahead 1, behind 2]
381 test_expect_success
'status -s -b' '
383 git status -s -b >output &&
384 test_cmp expect output
388 test_expect_success
'status -s -z -b' '
389 tr "\\n" Q <expect >expect.q &&
390 mv expect.q expect &&
391 git status -s -z -b >output &&
392 nul_to_q <output >output.q &&
393 mv output.q output &&
394 test_cmp expect output
397 test_expect_success
'setup dir3' '
399 : >dir3/untracked1 &&
403 test_expect_success
'status -uno' '
406 Your branch and '\''upstream'\'' have diverged,
407 and have 1 and 2 different commits each, respectively.
408 (use "git pull" to merge the remote branch into yours)
410 Changes to be committed:
411 (use "git restore --staged <file>..." to unstage)
414 Changes not staged for commit:
415 (use "git add <file>..." to update what will be committed)
416 (use "git restore <file>..." to discard changes in working directory)
417 modified: dir1/modified
419 Untracked files not listed (use -u option to show untracked files)
421 git status -uno >output &&
422 test_cmp expect output
425 test_expect_success
'status (status.showUntrackedFiles no)' '
426 test_config status.showuntrackedfiles no &&
427 git status >output &&
428 test_cmp expect output
431 test_expect_success
'status -uno (advice.statusHints false)' '
434 Your branch and '\''upstream'\'' have diverged,
435 and have 1 and 2 different commits each, respectively.
437 Changes to be committed:
440 Changes not staged for commit:
441 modified: dir1/modified
443 Untracked files not listed
445 test_config advice.statusHints false &&
446 git status -uno >output &&
447 test_cmp expect output
454 test_expect_success
'status -s -uno' '
455 git status -s -uno >output &&
456 test_cmp expect output
459 test_expect_success
'status -s (status.showUntrackedFiles no)' '
460 git config status.showuntrackedfiles no &&
461 git status -s >output &&
462 test_cmp expect output
465 test_expect_success
'status -unormal' '
468 Your branch and '\''upstream'\'' have diverged,
469 and have 1 and 2 different commits each, respectively.
470 (use "git pull" to merge the remote branch into yours)
472 Changes to be committed:
473 (use "git restore --staged <file>..." to unstage)
476 Changes not staged for commit:
477 (use "git add <file>..." to update what will be committed)
478 (use "git restore <file>..." to discard changes in working directory)
479 modified: dir1/modified
482 (use "git add <file>..." to include in what will be committed)
490 git status -unormal >output &&
491 test_cmp expect output
494 test_expect_success
'status (status.showUntrackedFiles normal)' '
495 test_config status.showuntrackedfiles normal &&
496 git status >output &&
497 test_cmp expect output
509 test_expect_success
'status -s -unormal' '
510 git status -s -unormal >output &&
511 test_cmp expect output
514 test_expect_success
'status -s (status.showUntrackedFiles normal)' '
515 git config status.showuntrackedfiles normal &&
516 git status -s >output &&
517 test_cmp expect output
520 test_expect_success
'status -uall' '
523 Your branch and '\''upstream'\'' have diverged,
524 and have 1 and 2 different commits each, respectively.
525 (use "git pull" to merge the remote branch into yours)
527 Changes to be committed:
528 (use "git restore --staged <file>..." to unstage)
531 Changes not staged for commit:
532 (use "git add <file>..." to update what will be committed)
533 (use "git restore <file>..." to discard changes in working directory)
534 modified: dir1/modified
537 (use "git add <file>..." to include in what will be committed)
546 git status -uall >output &&
547 test_cmp expect output
550 test_expect_success
'status (status.showUntrackedFiles all)' '
551 test_config status.showuntrackedfiles all &&
552 git status >output &&
553 test_cmp expect output
556 test_expect_success
'teardown dir3' '
568 test_expect_success
'status -s -uall' '
569 test_unconfig status.showuntrackedfiles &&
570 git status -s -uall >output &&
571 test_cmp expect output
573 test_expect_success
'status -s (status.showUntrackedFiles all)' '
574 test_config status.showuntrackedfiles all &&
575 git status -s >output &&
577 test_cmp expect output
580 test_expect_success
'status with relative paths' '
581 cat >expect <<\EOF &&
583 Your branch and '\''upstream'\'' have diverged,
584 and have 1 and 2 different commits each, respectively.
585 (use "git pull" to merge the remote branch into yours)
587 Changes to be committed:
588 (use "git restore --staged <file>..." to unstage)
589 new file: ../dir2/added
591 Changes not staged for commit:
592 (use "git add <file>..." to update what will be committed)
593 (use "git restore <file>..." to discard changes in working directory)
597 (use "git add <file>..." to include in what will be committed)
604 (cd dir1 && git status) >output &&
605 test_cmp expect output
616 test_expect_success
'status -s with relative paths' '
618 (cd dir1 && git status -s) >output &&
619 test_cmp expect output
632 test_expect_success
'status --porcelain ignores relative paths setting' '
634 (cd dir1 && git status --porcelain) >output &&
635 test_cmp expect output
639 test_expect_success
'setup unique colors' '
641 git config status.color.untracked blue &&
642 git config status.color.branch green &&
643 git config status.color.localBranch yellow &&
644 git config status.color.remoteBranch cyan
648 test_expect_success TTY
'status with color.ui' '
649 cat >expect <<\EOF &&
650 On branch <GREEN>main<RESET>
651 Your branch and '\''upstream'\'' have diverged,
652 and have 1 and 2 different commits each, respectively.
653 (use "git pull" to merge the remote branch into yours)
655 Changes to be committed:
656 (use "git restore --staged <file>..." to unstage)
657 <GREEN>new file: dir2/added<RESET>
659 Changes not staged for commit:
660 (use "git add <file>..." to update what will be committed)
661 (use "git restore <file>..." to discard changes in working directory)
662 <RED>modified: dir1/modified<RESET>
665 (use "git add <file>..." to include in what will be committed)
666 <BLUE>dir1/untracked<RESET>
667 <BLUE>dir2/modified<RESET>
668 <BLUE>dir2/untracked<RESET>
669 <BLUE>untracked<RESET>
672 test_config color.ui auto &&
673 test_terminal git status | test_decode_color >output &&
674 test_cmp expect output
677 test_expect_success TTY
'status with color.status' '
678 test_config color.status auto &&
679 test_terminal git status | test_decode_color >output &&
680 test_cmp expect output
684 <RED
>M
<RESET
> dir
1/modified
685 <GREEN
>A
<RESET
> dir
2/added
686 <BLUE
>??
<RESET
> dir
1/untracked
687 <BLUE
>??
<RESET
> dir
2/modified
688 <BLUE
>??
<RESET
> dir
2/untracked
689 <BLUE
>??
<RESET
> untracked
692 test_expect_success TTY
'status -s with color.ui' '
694 git config color.ui auto &&
695 test_terminal git status -s | test_decode_color >output &&
696 test_cmp expect output
700 test_expect_success TTY
'status -s with color.status' '
702 git config --unset color.ui &&
703 git config color.status auto &&
704 test_terminal git status -s | test_decode_color >output &&
705 test_cmp expect output
710 ## <YELLOW>main<RESET>...<CYAN>upstream<RESET> [ahead <YELLOW>1<RESET>, behind <CYAN>2<RESET>]
711 <RED
>M
<RESET
> dir
1/modified
712 <GREEN
>A
<RESET
> dir
2/added
713 <BLUE
>??
<RESET
> dir
1/untracked
714 <BLUE
>??
<RESET
> dir
2/modified
715 <BLUE
>??
<RESET
> dir
2/untracked
716 <BLUE
>??
<RESET
> untracked
719 test_expect_success TTY
'status -s -b with color.status' '
721 test_terminal git status -s -b | test_decode_color >output &&
722 test_cmp expect output
735 test_expect_success TTY
'status --porcelain ignores color.ui' '
737 git config --unset color.status &&
738 git config color.ui auto &&
739 test_terminal git status --porcelain | test_decode_color >output &&
740 test_cmp expect output
744 test_expect_success TTY
'status --porcelain ignores color.status' '
746 git config --unset color.ui &&
747 git config color.status auto &&
748 test_terminal git status --porcelain | test_decode_color >output &&
749 test_cmp expect output
753 # recover unconditionally from color tests
754 git config
--unset color.status
755 git config
--unset color.ui
757 test_expect_success
'status --porcelain respects -b' '
759 git status --porcelain -b >output &&
761 echo "## main...upstream [ahead 1, behind 2]" &&
765 test_cmp expect output
771 test_expect_success
'status without relative paths' '
772 cat >expect <<\EOF &&
774 Your branch and '\''upstream'\'' have diverged,
775 and have 1 and 2 different commits each, respectively.
776 (use "git pull" to merge the remote branch into yours)
778 Changes to be committed:
779 (use "git restore --staged <file>..." to unstage)
782 Changes not staged for commit:
783 (use "git add <file>..." to update what will be committed)
784 (use "git restore <file>..." to discard changes in working directory)
785 modified: dir1/modified
788 (use "git add <file>..." to include in what will be committed)
795 test_config status.relativePaths false &&
796 (cd dir1 && git status) >output &&
797 test_cmp expect output
810 test_expect_success
'status -s without relative paths' '
812 test_config status.relativePaths false &&
813 (cd dir1 && git status -s) >output &&
814 test_cmp expect output
825 ??
"file with spaces 2"
829 test_expect_success
'status -s without relative paths' '
830 test_when_finished "git rm --cached \"file with spaces\"; rm -f file*" &&
831 >"file with spaces" &&
832 >"file with spaces 2" &&
833 >"expect with spaces" &&
834 git add "file with spaces" &&
836 git status -s >output &&
837 test_cmp expect output &&
839 git status -s --ignored >output &&
840 grep "^!! \"expect with spaces\"$" output &&
841 grep -v "^!! " output >output-wo-ignored &&
842 test_cmp expect output-wo-ignored
845 test_expect_success
'dry-run of partial commit excluding new file in index' '
848 Your branch and '\''upstream'\'' have diverged,
849 and have 1 and 2 different commits each, respectively.
850 (use "git pull" to merge the remote branch into yours)
852 Changes to be committed:
853 (use "git restore --staged <file>..." to unstage)
854 modified: dir1/modified
857 (use "git add <file>..." to include in what will be committed)
863 git commit --dry-run dir1/modified >output &&
864 test_cmp expect output
868 :100644 100644 $EMPTY_BLOB $ZERO_OID M dir1/modified
870 test_expect_success
'status refreshes the index' '
873 git diff-files >output &&
874 test_cmp expect output
877 test_expect_success
'status shows detached HEAD properly after checking out non-local upstream branch' '
878 test_when_finished rm -rf upstream downstream actual &&
880 test_create_repo upstream &&
881 test_commit -C upstream foo &&
883 git clone upstream downstream &&
884 git -C downstream checkout @{u} &&
885 git -C downstream status >actual &&
886 grep -E "HEAD detached at [0-9a-f]+" actual
889 test_expect_success
'setup status submodule summary' '
890 test_create_repo sm && (
894 git commit -m "Add foo"
899 test_expect_success
'status submodule summary is disabled by default' '
902 Your branch and '\''upstream'\'' have diverged,
903 and have 1 and 2 different commits each, respectively.
904 (use "git pull" to merge the remote branch into yours)
906 Changes to be committed:
907 (use "git restore --staged <file>..." to unstage)
911 Changes not staged for commit:
912 (use "git add <file>..." to update what will be committed)
913 (use "git restore <file>..." to discard changes in working directory)
914 modified: dir1/modified
917 (use "git add <file>..." to include in what will be committed)
924 git status >output &&
925 test_cmp expect output
928 # we expect the same as the previous test
929 test_expect_success
'status --untracked-files=all does not show submodule' '
930 git status --untracked-files=all >output &&
931 test_cmp expect output
943 test_expect_success
'status -s submodule summary is disabled by default' '
944 git status -s >output &&
945 test_cmp expect output
948 # we expect the same as the previous test
949 test_expect_success
'status -s --untracked-files=all does not show submodule' '
950 git status -s --untracked-files=all >output &&
951 test_cmp expect output
954 head=$
(cd sm
&& git rev-parse
--short=7 --verify HEAD
)
956 test_expect_success
'status submodule summary' '
959 Your branch and '\''upstream'\'' have diverged,
960 and have 1 and 2 different commits each, respectively.
961 (use "git pull" to merge the remote branch into yours)
963 Changes to be committed:
964 (use "git restore --staged <file>..." to unstage)
968 Changes not staged for commit:
969 (use "git add <file>..." to update what will be committed)
970 (use "git restore <file>..." to discard changes in working directory)
971 modified: dir1/modified
973 Submodule changes to be committed:
975 * sm 0000000...$head (1):
979 (use "git add <file>..." to include in what will be committed)
986 git config status.submodulesummary 10 &&
987 git status >output &&
988 test_cmp expect output
991 test_expect_success
'status submodule summary with status.displayCommentPrefix=false' '
992 strip_comments expect &&
993 git -c status.displayCommentPrefix=false status >output &&
994 test_cmp expect output
997 test_expect_success
'commit with submodule summary ignores status.displayCommentPrefix' '
998 commit_template_commented
1010 test_expect_success
'status -s submodule summary' '
1011 git status -s >output &&
1012 test_cmp expect output
1015 test_expect_success
'status submodule summary (clean submodule): commit' '
1016 cat >expect <<EOF &&
1018 Your branch and '\''upstream'\'' have diverged,
1019 and have 2 and 2 different commits each, respectively.
1020 (use "git pull" to merge the remote branch into yours)
1022 Changes not staged for commit:
1023 (use "git add <file>..." to update what will be committed)
1024 (use "git restore <file>..." to discard changes in working directory)
1025 modified: dir1/modified
1028 (use "git add <file>..." to include in what will be committed)
1034 no changes added to commit (use "git add" and/or "git commit -a")
1036 git commit -m "commit submodule" &&
1037 git config status.submodulesummary 10 &&
1038 test_must_fail git commit --dry-run >output &&
1039 test_cmp expect output &&
1040 git status >output &&
1041 test_cmp expect output
1051 test_expect_success
'status -s submodule summary (clean submodule)' '
1052 git status -s >output &&
1053 test_cmp expect output
1056 test_expect_success
'status -z implies porcelain' '
1057 git status --porcelain |
1058 perl -pe "s/\012/\000/g" >expect &&
1059 git status -z >output &&
1060 test_cmp expect output
1063 test_expect_success
'commit --dry-run submodule summary (--amend)' '
1064 cat >expect <<EOF &&
1066 Your branch and '\''upstream'\'' have diverged,
1067 and have 2 and 2 different commits each, respectively.
1068 (use "git pull" to merge the remote branch into yours)
1070 Changes to be committed:
1071 (use "git restore --source=HEAD^1 --staged <file>..." to unstage)
1072 new file: dir2/added
1075 Changes not staged for commit:
1076 (use "git add <file>..." to update what will be committed)
1077 (use "git restore <file>..." to discard changes in working directory)
1078 modified: dir1/modified
1080 Submodule changes to be committed:
1082 * sm 0000000...$head (1):
1086 (use "git add <file>..." to include in what will be committed)
1093 git config status.submodulesummary 10 &&
1094 git commit --dry-run --amend >output &&
1095 test_cmp expect output
1098 test_expect_success POSIXPERM
,SANITY
'status succeeds in a read-only repository' '
1099 test_when_finished "chmod 775 .git" &&
1102 # make dir1/tracked stat-dirty
1103 >dir1/tracked1 && mv -f dir1/tracked1 dir1/tracked &&
1104 git status -s >output &&
1105 ! grep dir1/tracked output &&
1106 # make sure "status" succeeded without writing index out
1107 git diff-files | grep dir1/tracked
1111 (cd sm
&& echo > bar
&& git add bar
&& git commit
-q -m 'Add bar') && git add sm
1112 new_head
=$
(cd sm
&& git rev-parse
--short=7 --verify HEAD
)
1115 test_expect_success
'--ignore-submodules=untracked suppresses submodules with untracked content' '
1116 cat > expect << EOF &&
1118 Your branch and '\''upstream'\'' have diverged,
1119 and have 2 and 2 different commits each, respectively.
1120 (use "git pull" to merge the remote branch into yours)
1122 Changes to be committed:
1123 (use "git restore --staged <file>..." to unstage)
1126 Changes not staged for commit:
1127 (use "git add <file>..." to update what will be committed)
1128 (use "git restore <file>..." to discard changes in working directory)
1129 modified: dir1/modified
1131 Submodule changes to be committed:
1133 * sm $head...$new_head (1):
1137 (use "git add <file>..." to include in what will be committed)
1145 echo modified sm/untracked &&
1146 git status --ignore-submodules=untracked >output &&
1147 test_cmp expect output
1150 test_expect_success
'.gitmodules ignore=untracked suppresses submodules with untracked content' '
1151 test_config diff.ignoreSubmodules dirty &&
1152 git status >output &&
1153 test_cmp expect output &&
1154 git config --add -f .gitmodules submodule.subname.ignore untracked &&
1155 git config --add -f .gitmodules submodule.subname.path sm &&
1156 git status >output &&
1157 test_cmp expect output &&
1158 git config -f .gitmodules --remove-section submodule.subname
1161 test_expect_success
'.git/config ignore=untracked suppresses submodules with untracked content' '
1162 git config --add -f .gitmodules submodule.subname.ignore none &&
1163 git config --add -f .gitmodules submodule.subname.path sm &&
1164 git config --add submodule.subname.ignore untracked &&
1165 git config --add submodule.subname.path sm &&
1166 git status >output &&
1167 test_cmp expect output &&
1168 git config --remove-section submodule.subname &&
1169 git config --remove-section -f .gitmodules submodule.subname
1172 test_expect_success
'--ignore-submodules=dirty suppresses submodules with untracked content' '
1173 git status --ignore-submodules=dirty >output &&
1174 test_cmp expect output
1177 test_expect_success
'.gitmodules ignore=dirty suppresses submodules with untracked content' '
1178 test_config diff.ignoreSubmodules dirty &&
1179 git status >output &&
1181 git config --add -f .gitmodules submodule.subname.ignore dirty &&
1182 git config --add -f .gitmodules submodule.subname.path sm &&
1183 git status >output &&
1184 test_cmp expect output &&
1185 git config -f .gitmodules --remove-section submodule.subname
1188 test_expect_success
'.git/config ignore=dirty suppresses submodules with untracked content' '
1189 git config --add -f .gitmodules submodule.subname.ignore none &&
1190 git config --add -f .gitmodules submodule.subname.path sm &&
1191 git config --add submodule.subname.ignore dirty &&
1192 git config --add submodule.subname.path sm &&
1193 git status >output &&
1194 test_cmp expect output &&
1195 git config --remove-section submodule.subname &&
1196 git config -f .gitmodules --remove-section submodule.subname
1199 test_expect_success
'--ignore-submodules=dirty suppresses submodules with modified content' '
1200 echo modified >sm/foo &&
1201 git status --ignore-submodules=dirty >output &&
1202 test_cmp expect output
1205 test_expect_success
'.gitmodules ignore=dirty suppresses submodules with modified content' '
1206 git config --add -f .gitmodules submodule.subname.ignore dirty &&
1207 git config --add -f .gitmodules submodule.subname.path sm &&
1208 git status >output &&
1209 test_cmp expect output &&
1210 git config -f .gitmodules --remove-section submodule.subname
1213 test_expect_success
'.git/config ignore=dirty suppresses submodules with modified content' '
1214 git config --add -f .gitmodules submodule.subname.ignore none &&
1215 git config --add -f .gitmodules submodule.subname.path sm &&
1216 git config --add submodule.subname.ignore dirty &&
1217 git config --add submodule.subname.path sm &&
1218 git status >output &&
1219 test_cmp expect output &&
1220 git config --remove-section submodule.subname &&
1221 git config -f .gitmodules --remove-section submodule.subname
1224 test_expect_success
"--ignore-submodules=untracked doesn't suppress submodules with modified content" '
1225 cat > expect << EOF &&
1227 Your branch and '\''upstream'\'' have diverged,
1228 and have 2 and 2 different commits each, respectively.
1229 (use "git pull" to merge the remote branch into yours)
1231 Changes to be committed:
1232 (use "git restore --staged <file>..." to unstage)
1235 Changes not staged for commit:
1236 (use "git add <file>..." to update what will be committed)
1237 (use "git restore <file>..." to discard changes in working directory)
1238 (commit or discard the untracked or modified content in submodules)
1239 modified: dir1/modified
1240 modified: sm (modified content)
1242 Submodule changes to be committed:
1244 * sm $head...$new_head (1):
1248 (use "git add <file>..." to include in what will be committed)
1256 git status --ignore-submodules=untracked > output &&
1257 test_cmp expect output
1260 test_expect_success
".gitmodules ignore=untracked doesn't suppress submodules with modified content" '
1261 git config --add -f .gitmodules submodule.subname.ignore untracked &&
1262 git config --add -f .gitmodules submodule.subname.path sm &&
1263 git status >output &&
1264 test_cmp expect output &&
1265 git config -f .gitmodules --remove-section submodule.subname
1268 test_expect_success
".git/config ignore=untracked doesn't suppress submodules with modified content" '
1269 git config --add -f .gitmodules submodule.subname.ignore none &&
1270 git config --add -f .gitmodules submodule.subname.path sm &&
1271 git config --add submodule.subname.ignore untracked &&
1272 git config --add submodule.subname.path sm &&
1273 git status >output &&
1274 test_cmp expect output &&
1275 git config --remove-section submodule.subname &&
1276 git config -f .gitmodules --remove-section submodule.subname
1279 head2
=$
(cd sm
&& git commit
-q -m "2nd commit" foo
&& git rev-parse
--short=7 --verify HEAD
)
1281 test_expect_success
"--ignore-submodules=untracked doesn't suppress submodule summary" '
1282 cat > expect << EOF &&
1284 Your branch and '\''upstream'\'' have diverged,
1285 and have 2 and 2 different commits each, respectively.
1286 (use "git pull" to merge the remote branch into yours)
1288 Changes to be committed:
1289 (use "git restore --staged <file>..." to unstage)
1292 Changes not staged for commit:
1293 (use "git add <file>..." to update what will be committed)
1294 (use "git restore <file>..." to discard changes in working directory)
1295 modified: dir1/modified
1296 modified: sm (new commits)
1298 Submodule changes to be committed:
1300 * sm $head...$new_head (1):
1303 Submodules changed but not updated:
1305 * sm $new_head...$head2 (1):
1309 (use "git add <file>..." to include in what will be committed)
1317 git status --ignore-submodules=untracked > output &&
1318 test_cmp expect output
1321 test_expect_success
".gitmodules ignore=untracked doesn't suppress submodule summary" '
1322 git config --add -f .gitmodules submodule.subname.ignore untracked &&
1323 git config --add -f .gitmodules submodule.subname.path sm &&
1324 git status >output &&
1325 test_cmp expect output &&
1326 git config -f .gitmodules --remove-section submodule.subname
1329 test_expect_success
".git/config ignore=untracked doesn't suppress submodule summary" '
1330 git config --add -f .gitmodules submodule.subname.ignore none &&
1331 git config --add -f .gitmodules submodule.subname.path sm &&
1332 git config --add submodule.subname.ignore untracked &&
1333 git config --add submodule.subname.path sm &&
1334 git status >output &&
1335 test_cmp expect output &&
1336 git config --remove-section submodule.subname &&
1337 git config -f .gitmodules --remove-section submodule.subname
1340 test_expect_success
"--ignore-submodules=dirty doesn't suppress submodule summary" '
1341 git status --ignore-submodules=dirty > output &&
1342 test_cmp expect output
1344 test_expect_success
".gitmodules ignore=dirty doesn't suppress submodule summary" '
1345 git config --add -f .gitmodules submodule.subname.ignore dirty &&
1346 git config --add -f .gitmodules submodule.subname.path sm &&
1347 git status >output &&
1348 test_cmp expect output &&
1349 git config -f .gitmodules --remove-section submodule.subname
1352 test_expect_success
".git/config ignore=dirty doesn't suppress submodule summary" '
1353 git config --add -f .gitmodules submodule.subname.ignore none &&
1354 git config --add -f .gitmodules submodule.subname.path sm &&
1355 git config --add submodule.subname.ignore dirty &&
1356 git config --add submodule.subname.path sm &&
1357 git status >output &&
1358 test_cmp expect output &&
1359 git config --remove-section submodule.subname &&
1360 git config -f .gitmodules --remove-section submodule.subname
1365 ; Your branch and 'upstream' have diverged,
1366 ; and have 2 and 2 different commits each, respectively.
1367 ; (use "git pull" to merge the remote branch into yours)
1369 ; Changes to be committed:
1370 ; (use "git restore --staged <file>..." to unstage)
1373 ; Changes not staged for commit:
1374 ; (use "git add <file>..." to update what will be committed)
1375 ; (use "git restore <file>..." to discard changes in working directory)
1376 ; modified: dir1/modified
1377 ; modified: sm (new commits)
1379 ; Submodule changes to be committed:
1381 ; * sm $head...$new_head (1):
1384 ; Submodules changed but not updated:
1386 ; * sm $new_head...$head2 (1):
1390 ; (use "git add <file>..." to include in what will be committed)
1399 test_expect_success
"status (core.commentchar with submodule summary)" '
1400 test_config core.commentchar ";" &&
1401 git -c status.displayCommentPrefix=true status >output &&
1402 test_cmp expect output
1405 test_expect_success
"status (core.commentchar with two chars with submodule summary)" '
1406 test_config core.commentchar ";;" &&
1407 test_must_fail git -c status.displayCommentPrefix=true status
1410 test_expect_success
"--ignore-submodules=all suppresses submodule summary" '
1411 cat > expect << EOF &&
1413 Your branch and '\''upstream'\'' have diverged,
1414 and have 2 and 2 different commits each, respectively.
1415 (use "git pull" to merge the remote branch into yours)
1417 Changes not staged for commit:
1418 (use "git add <file>..." to update what will be committed)
1419 (use "git restore <file>..." to discard changes in working directory)
1420 modified: dir1/modified
1423 (use "git add <file>..." to include in what will be committed)
1430 no changes added to commit (use "git add" and/or "git commit -a")
1432 git status --ignore-submodules=all > output &&
1433 test_cmp expect output
1436 test_expect_success
'.gitmodules ignore=all suppresses unstaged submodule summary' '
1437 cat > expect << EOF &&
1439 Your branch and '\''upstream'\'' have diverged,
1440 and have 2 and 2 different commits each, respectively.
1441 (use "git pull" to merge the remote branch into yours)
1443 Changes to be committed:
1444 (use "git restore --staged <file>..." to unstage)
1447 Changes not staged for commit:
1448 (use "git add <file>..." to update what will be committed)
1449 (use "git restore <file>..." to discard changes in working directory)
1450 modified: dir1/modified
1453 (use "git add <file>..." to include in what will be committed)
1461 git config --add -f .gitmodules submodule.subname.ignore all &&
1462 git config --add -f .gitmodules submodule.subname.path sm &&
1463 git status > output &&
1464 test_cmp expect output &&
1465 git config -f .gitmodules --remove-section submodule.subname
1468 test_expect_success
'.git/config ignore=all suppresses unstaged submodule summary' '
1469 git config --add -f .gitmodules submodule.subname.ignore none &&
1470 git config --add -f .gitmodules submodule.subname.path sm &&
1471 git config --add submodule.subname.ignore all &&
1472 git config --add submodule.subname.path sm &&
1473 git status > output &&
1474 test_cmp expect output &&
1475 git config --remove-section submodule.subname &&
1476 git config -f .gitmodules --remove-section submodule.subname
1479 test_expect_success
'setup of test environment' '
1480 git config status.showUntrackedFiles no &&
1481 git status -s >expected_short &&
1482 git status --no-short >expected_noshort
1485 test_expect_success
'"status.short=true" same as "-s"' '
1486 git -c status.short=true status >actual &&
1487 test_cmp expected_short actual
1490 test_expect_success
'"status.short=true" weaker than "--no-short"' '
1491 git -c status.short=true status --no-short >actual &&
1492 test_cmp expected_noshort actual
1495 test_expect_success
'"status.short=false" same as "--no-short"' '
1496 git -c status.short=false status >actual &&
1497 test_cmp expected_noshort actual
1500 test_expect_success
'"status.short=false" weaker than "-s"' '
1501 git -c status.short=false status -s >actual &&
1502 test_cmp expected_short actual
1505 test_expect_success
'"status.branch=true" same as "-b"' '
1506 git status -sb >expected_branch &&
1507 git -c status.branch=true status -s >actual &&
1508 test_cmp expected_branch actual
1511 test_expect_success
'"status.branch=true" different from "--no-branch"' '
1512 git status -s --no-branch >expected_nobranch &&
1513 git -c status.branch=true status -s >actual &&
1514 ! test_cmp expected_nobranch actual
1517 test_expect_success
'"status.branch=true" weaker than "--no-branch"' '
1518 git -c status.branch=true status -s --no-branch >actual &&
1519 test_cmp expected_nobranch actual
1522 test_expect_success
'"status.branch=true" weaker than "--porcelain"' '
1523 git -c status.branch=true status --porcelain >actual &&
1524 test_cmp expected_nobranch actual
1527 test_expect_success
'"status.branch=false" same as "--no-branch"' '
1528 git -c status.branch=false status -s >actual &&
1529 test_cmp expected_nobranch actual
1532 test_expect_success
'"status.branch=false" weaker than "-b"' '
1533 git -c status.branch=false status -sb >actual &&
1534 test_cmp expected_branch actual
1537 test_expect_success
'Restore default test environment' '
1538 git config --unset status.showUntrackedFiles
1541 test_expect_success
'git commit will commit a staged but ignored submodule' '
1542 git config --add -f .gitmodules submodule.subname.ignore all &&
1543 git config --add -f .gitmodules submodule.subname.path sm &&
1544 git config --add submodule.subname.ignore all &&
1545 git status -s --ignore-submodules=dirty >output &&
1546 test_i18ngrep "^M. sm" output &&
1547 GIT_EDITOR="echo hello >>\"\$1\"" &&
1548 export GIT_EDITOR &&
1550 git status -s --ignore-submodules=dirty >output &&
1551 test_i18ngrep ! "^M. sm" output
1554 test_expect_success
'git commit --dry-run will show a staged but ignored submodule' '
1557 cat >expect << EOF &&
1559 Your branch and '\''upstream'\'' have diverged,
1560 and have 2 and 2 different commits each, respectively.
1561 (use "git pull" to merge the remote branch into yours)
1563 Changes to be committed:
1564 (use "git restore --staged <file>..." to unstage)
1567 Changes not staged for commit:
1568 (use "git add <file>..." to update what will be committed)
1569 (use "git restore <file>..." to discard changes in working directory)
1570 modified: dir1/modified
1572 Untracked files not listed (use -u option to show untracked files)
1574 git commit -uno --dry-run >output &&
1575 test_cmp expect output &&
1576 git status -s --ignore-submodules=dirty >output &&
1577 test_i18ngrep "^M. sm" output
1580 test_expect_success
'git commit -m will commit a staged but ignored submodule' '
1581 git commit -uno -m message &&
1582 git status -s --ignore-submodules=dirty >output &&
1583 test_i18ngrep ! "^M. sm" output &&
1584 git config --remove-section submodule.subname &&
1585 git config -f .gitmodules --remove-section submodule.subname
1588 test_expect_success
'show stash info with "--show-stash"' '
1594 git status >expected_default &&
1595 git status --show-stash >expected_with_stash &&
1596 test_i18ngrep "^Your stash currently has 1 entry$" expected_with_stash
1599 test_expect_success
'no stash info with "--show-stash --no-show-stash"' '
1600 git status --show-stash --no-show-stash >expected_without_stash &&
1601 test_cmp expected_default expected_without_stash
1604 test_expect_success
'"status.showStash=false" weaker than "--show-stash"' '
1605 git -c status.showStash=false status --show-stash >actual &&
1606 test_cmp expected_with_stash actual
1609 test_expect_success
'"status.showStash=true" weaker than "--no-show-stash"' '
1610 git -c status.showStash=true status --no-show-stash >actual &&
1611 test_cmp expected_without_stash actual
1614 test_expect_success
'no additional info if no stash entries' '
1616 git -c status.showStash=true status >actual &&
1617 test_cmp expected_without_stash actual
1620 test_expect_success
'"No commits yet" should be noted in status output' '
1621 git checkout --orphan empty-branch-1 &&
1622 git status >output &&
1623 test_i18ngrep "No commits yet" output
1626 test_expect_success
'"No commits yet" should not be noted in status output' '
1627 git checkout --orphan empty-branch-2 &&
1628 test_commit test-commit-1 &&
1629 git status >output &&
1630 test_i18ngrep ! "No commits yet" output
1633 test_expect_success
'"Initial commit" should be noted in commit template' '
1634 git checkout --orphan empty-branch-3 &&
1635 touch to_be_committed_1 &&
1636 git add to_be_committed_1 &&
1637 git commit --dry-run >output &&
1638 test_i18ngrep "Initial commit" output
1641 test_expect_success
'"Initial commit" should not be noted in commit template' '
1642 git checkout --orphan empty-branch-4 &&
1643 test_commit test-commit-2 &&
1644 touch to_be_committed_2 &&
1645 git add to_be_committed_2 &&
1646 git commit --dry-run >output &&
1647 test_i18ngrep ! "Initial commit" output
1650 test_expect_success
'--no-optional-locks prevents index update' '
1651 test_set_magic_mtime .git/index &&
1652 git --no-optional-locks status &&
1653 test_is_magic_mtime .git/index &&
1655 ! test_is_magic_mtime .git/index
1658 test_expect_success
'racy timestamps will be fixed for clean worktree' '
1659 echo content >racy-dirty &&
1660 echo content >racy-racy &&
1662 git commit -m "racy test files" &&
1663 # let status rewrite the index, if necessary; after that we expect
1664 # no more index writes unless caused by racy timestamps; note that
1665 # timestamps may already be racy now (depending on previous tests)
1667 test_set_magic_mtime .git/index &&
1669 ! test_is_magic_mtime .git/index
1672 test_expect_success
'racy timestamps will be fixed for dirty worktree' '
1673 echo content2 >racy-dirty &&
1675 test_set_magic_mtime .git/index &&
1677 ! test_is_magic_mtime .git/index
1680 test_expect_success
'setup slow status advice' '
1681 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main git init slowstatus &&
1684 cat >.gitignore <<-\EOF &&
1689 git add .gitignore &&
1690 git commit -m "Add .gitignore" &&
1691 git config advice.statusuoption true
1695 test_expect_success
'slow status advice when core.untrackedCache and fsmonitor are unset' '
1698 git config core.untrackedCache false &&
1699 git config core.fsmonitor false &&
1700 GIT_TEST_UF_DELAY_WARNING=1 git status >actual &&
1701 cat >expected <<-\EOF &&
1704 It took 3.25 seconds to enumerate untracked files.
1705 See '\''git help status'\'' for information on how to improve this.
1707 nothing to commit, working tree clean
1709 test_cmp expected actual
1713 test_expect_success
'slow status advice when core.untrackedCache true, but not fsmonitor' '
1716 git config core.untrackedCache true &&
1717 git config core.fsmonitor false &&
1718 GIT_TEST_UF_DELAY_WARNING=1 git status >actual &&
1719 cat >expected <<-\EOF &&
1722 It took 3.25 seconds to enumerate untracked files.
1723 See '\''git help status'\'' for information on how to improve this.
1725 nothing to commit, working tree clean
1727 test_cmp expected actual
1731 test_expect_success
'slow status advice when core.untrackedCache true, and fsmonitor' '
1734 git config core.untrackedCache true &&
1735 git config core.fsmonitor true &&
1736 GIT_TEST_UF_DELAY_WARNING=1 git status >actual &&
1737 cat >expected <<-\EOF &&
1740 It took 3.25 seconds to enumerate untracked files,
1741 but the results were cached, and subsequent runs may be faster.
1742 See '\''git help status'\'' for information on how to improve this.
1744 nothing to commit, working tree clean
1746 test_cmp expected actual