]> git.ipfire.org Git - thirdparty/git.git/blame - t/t7508-status.sh
Merge branch 'jc/test-i18ngrep'
[thirdparty/git.git] / t / t7508-status.sh
CommitLineData
367c9886
JS
1#!/bin/sh
2#
3# Copyright (c) 2007 Johannes E. Schindelin
4#
5
47a528ad 6test_description='git status'
367c9886 7
80d32e84 8TEST_PASSES_SANITIZE_LEAK=true
367c9886 9. ./test-lib.sh
01c94e90 10. "$TEST_DIRECTORY"/lib-terminal.sh
367c9886 11
5d3dd915 12test_expect_success 'status -h in broken repository' '
6a38ef2c 13 git config --global advice.statusuoption false &&
5d3dd915
NTND
14 mkdir broken &&
15 test_when_finished "rm -fr broken" &&
16 (
17 cd broken &&
18 git init &&
19 echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
20 test_expect_code 129 git status -h >usage 2>&1
21 ) &&
6789275d 22 test_grep "[Uu]sage" broken/usage
5d3dd915
NTND
23'
24
25test_expect_success 'commit -h in broken repository' '
26 mkdir broken &&
27 test_when_finished "rm -fr broken" &&
28 (
29 cd broken &&
30 git init &&
31 echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
32 test_expect_code 129 git commit -h >usage 2>&1
33 ) &&
6789275d 34 test_grep "[Uu]sage" broken/usage
5d3dd915
NTND
35'
36
75177c85
JK
37test_expect_success 'create upstream branch' '
38 git checkout -b upstream &&
39 test_commit upstream1 &&
40 test_commit upstream2 &&
1e2ae142 41 # leave the first commit on main as root because several
75177c85
JK
42 # tests depend on this case; for our upstream we only
43 # care about commit counts anyway, so a totally divergent
44 # history is OK
1e2ae142 45 git checkout --orphan main
75177c85
JK
46'
47
367c9886 48test_expect_success 'setup' '
68cfc6f5
MG
49 : >tracked &&
50 : >modified &&
367c9886 51 mkdir dir1 &&
68cfc6f5
MG
52 : >dir1/tracked &&
53 : >dir1/modified &&
367c9886 54 mkdir dir2 &&
68cfc6f5
MG
55 : >dir1/tracked &&
56 : >dir1/modified &&
367c9886 57 git add . &&
ff58b9aa
JK
58
59 git status >output &&
60
367c9886
JS
61 test_tick &&
62 git commit -m initial &&
68cfc6f5
MG
63 : >untracked &&
64 : >dir1/untracked &&
65 : >dir2/untracked &&
66 echo 1 >dir1/modified &&
67 echo 2 >dir2/modified &&
68 echo 3 >dir2/added &&
75177c85
JK
69 git add dir2/added &&
70
71 git branch --set-upstream-to=upstream
367c9886
JS
72'
73
cc6658e7 74test_expect_success 'status (1)' '
6789275d 75 test_grep "use \"git rm --cached <file>\.\.\.\" to unstage" output
ff58b9aa
JK
76'
77
2556b996 78strip_comments () {
2e582df0
ES
79 tab=' '
80 sed "s/^\# //; s/^\#$//; s/^#$tab/$tab/" <"$1" >"$1".tmp &&
2556b996
MM
81 rm "$1" && mv "$1".tmp "$1"
82}
83
ec8a896e
JH
84cat >.gitignore <<\EOF
85.gitignore
86expect*
87output*
88EOF
89
323d0530 90test_expect_success 'status --column' '
323d0530 91 cat >expect <<\EOF &&
1e2ae142 92# On branch main
75177c85
JK
93# Your branch and '\''upstream'\'' have diverged,
94# and have 1 and 2 different commits each, respectively.
d92304ff 95# (use "git pull" if you want to integrate the remote branch with yours)
75177c85 96#
323d0530 97# Changes to be committed:
80f537f7 98# (use "git restore --staged <file>..." to unstage)
323d0530
NTND
99# new file: dir2/added
100#
101# Changes not staged for commit:
102# (use "git add <file>..." to update what will be committed)
80f537f7 103# (use "git restore <file>..." to discard changes in working directory)
323d0530
NTND
104# modified: dir1/modified
105#
106# Untracked files:
107# (use "git add <file>..." to include in what will be committed)
ec8a896e
JH
108# dir1/untracked dir2/untracked
109# dir2/modified untracked
2f0f7f1c 110#
323d0530 111EOF
2556b996 112 COLUMNS=50 git -c status.displayCommentPrefix=true status --column="column dense" >output &&
1108cea7 113 test_cmp expect output
2556b996
MM
114'
115
116test_expect_success 'status --column status.displayCommentPrefix=false' '
117 strip_comments expect &&
118 COLUMNS=49 git -c status.displayCommentPrefix=false status --column="column dense" >output &&
1108cea7 119 test_cmp expect output
323d0530
NTND
120'
121
68cfc6f5 122cat >expect <<\EOF
1e2ae142 123# On branch main
75177c85
JK
124# Your branch and 'upstream' have diverged,
125# and have 1 and 2 different commits each, respectively.
d92304ff 126# (use "git pull" if you want to integrate the remote branch with yours)
75177c85 127#
367c9886 128# Changes to be committed:
80f537f7 129# (use "git restore --staged <file>..." to unstage)
367c9886
JS
130# new file: dir2/added
131#
8009d83c 132# Changes not staged for commit:
367c9886 133# (use "git add <file>..." to update what will be committed)
80f537f7 134# (use "git restore <file>..." to discard changes in working directory)
367c9886
JS
135# modified: dir1/modified
136#
137# Untracked files:
138# (use "git add <file>..." to include in what will be committed)
367c9886
JS
139# dir1/untracked
140# dir2/modified
141# dir2/untracked
367c9886 142# untracked
2f0f7f1c 143#
367c9886
JS
144EOF
145
2556b996
MM
146test_expect_success 'status with status.displayCommentPrefix=true' '
147 git -c status.displayCommentPrefix=true status >output &&
1108cea7 148 test_cmp expect output
2556b996
MM
149'
150
151test_expect_success 'status with status.displayCommentPrefix=false' '
152 strip_comments expect &&
153 git -c status.displayCommentPrefix=false status >output &&
1108cea7 154 test_cmp expect output
367c9886
JS
155'
156
f8c65c1f
MG
157test_expect_success 'status -v' '
158 (cat expect && git diff --cached) >expect-with-v &&
159 git status -v >output &&
1108cea7 160 test_cmp expect-with-v output
f8c65c1f
MG
161'
162
40555000
MG
163test_expect_success 'status -v -v' '
164 (cat expect &&
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 &&
1108cea7 171 test_cmp expect-with-v output
40555000
MG
172'
173
2556b996
MM
174test_expect_success 'setup fake editor' '
175 cat >.git/editor <<-\EOF &&
176 #! /bin/sh
177 cp "$1" output
178EOF
179 chmod 755 .git/editor
180'
181
182commit_template_commented () {
183 (
184 EDITOR=.git/editor &&
185 export EDITOR &&
186 # Fails due to empty message
187 test_must_fail git commit
188 ) &&
189 ! grep '^[^#]' output
190}
191
192test_expect_success 'commit ignores status.displayCommentPrefix=false in COMMIT_EDITMSG' '
193 commit_template_commented
194'
195
18f3b5a9 196cat >expect <<\EOF
1e2ae142 197On branch main
75177c85
JK
198Your branch and 'upstream' have diverged,
199and have 1 and 2 different commits each, respectively.
200
1c7969c9
MM
201Changes to be committed:
202 new file: dir2/added
203
204Changes not staged for commit:
205 modified: dir1/modified
206
207Untracked files:
208 dir1/untracked
209 dir2/modified
210 dir2/untracked
1c7969c9 211 untracked
2f0f7f1c 212
18f3b5a9
MG
213EOF
214
cc6658e7 215test_expect_success 'status (advice.statusHints false)' '
c63659dd 216 test_config advice.statusHints false &&
18f3b5a9 217 git status >output &&
1108cea7 218 test_cmp expect output
18f3b5a9
MG
219
220'
221
68cfc6f5 222cat >expect <<\EOF
14ed05dd
MG
223 M dir1/modified
224A dir2/added
225?? dir1/untracked
226?? dir2/modified
227?? dir2/untracked
14ed05dd
MG
228?? untracked
229EOF
230
46077fa5 231test_expect_success 'status -s' '
14ed05dd 232
68cfc6f5 233 git status -s >output &&
14ed05dd
MG
234 test_cmp expect output
235
236'
237
150b493a
JH
238test_expect_success 'status with gitignore' '
239 {
240 echo ".gitignore" &&
f8c65c1f 241 echo "expect*" &&
150b493a
JH
242 echo "output" &&
243 echo "untracked"
244 } >.gitignore &&
245
246 cat >expect <<-\EOF &&
247 M dir1/modified
248 A dir2/added
249 ?? dir2/modified
250 EOF
251 git status -s >output &&
252 test_cmp expect output &&
253
254 cat >expect <<-\EOF &&
255 M dir1/modified
256 A dir2/added
257 ?? dir2/modified
258 !! .gitignore
259 !! dir1/untracked
260 !! dir2/untracked
261 !! expect
f8c65c1f 262 !! expect-with-v
150b493a
JH
263 !! output
264 !! untracked
265 EOF
266 git status -s --ignored >output &&
267 test_cmp expect output &&
268
1c7969c9 269 cat >expect <<\EOF &&
1e2ae142 270On branch main
75177c85
JK
271Your branch and '\''upstream'\'' have diverged,
272and have 1 and 2 different commits each, respectively.
d92304ff 273 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 274
1c7969c9 275Changes to be committed:
80f537f7 276 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
277 new file: dir2/added
278
279Changes not staged for commit:
280 (use "git add <file>..." to update what will be committed)
80f537f7 281 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
282 modified: dir1/modified
283
284Untracked files:
285 (use "git add <file>..." to include in what will be committed)
1c7969c9 286 dir2/modified
2f0f7f1c 287
1c7969c9
MM
288Ignored files:
289 (use "git add -f <file>..." to include in what will be committed)
1c7969c9
MM
290 .gitignore
291 dir1/untracked
292 dir2/untracked
293 expect
f8c65c1f 294 expect-with-v
1c7969c9
MM
295 output
296 untracked
2f0f7f1c 297
1c7969c9 298EOF
150b493a 299 git status --ignored >output &&
1108cea7 300 test_cmp expect output
150b493a
JH
301'
302
303test_expect_success 'status with gitignore (nothing untracked)' '
304 {
305 echo ".gitignore" &&
f8c65c1f 306 echo "expect*" &&
150b493a
JH
307 echo "dir2/modified" &&
308 echo "output" &&
309 echo "untracked"
310 } >.gitignore &&
311
312 cat >expect <<-\EOF &&
313 M dir1/modified
314 A dir2/added
315 EOF
316 git status -s >output &&
317 test_cmp expect output &&
318
319 cat >expect <<-\EOF &&
320 M dir1/modified
321 A dir2/added
322 !! .gitignore
323 !! dir1/untracked
324 !! dir2/modified
325 !! dir2/untracked
326 !! expect
f8c65c1f 327 !! expect-with-v
150b493a
JH
328 !! output
329 !! untracked
330 EOF
331 git status -s --ignored >output &&
332 test_cmp expect output &&
333
1c7969c9 334 cat >expect <<\EOF &&
1e2ae142 335On branch main
75177c85
JK
336Your branch and '\''upstream'\'' have diverged,
337and have 1 and 2 different commits each, respectively.
d92304ff 338 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 339
1c7969c9 340Changes to be committed:
80f537f7 341 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
342 new file: dir2/added
343
344Changes not staged for commit:
345 (use "git add <file>..." to update what will be committed)
80f537f7 346 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
347 modified: dir1/modified
348
349Ignored files:
350 (use "git add -f <file>..." to include in what will be committed)
1c7969c9
MM
351 .gitignore
352 dir1/untracked
353 dir2/modified
354 dir2/untracked
355 expect
f8c65c1f 356 expect-with-v
1c7969c9
MM
357 output
358 untracked
2f0f7f1c 359
1c7969c9 360EOF
150b493a 361 git status --ignored >output &&
1108cea7 362 test_cmp expect output
150b493a
JH
363'
364
ec8a896e
JH
365cat >.gitignore <<\EOF
366.gitignore
367expect*
368output*
369EOF
150b493a 370
46077fa5 371cat >expect <<\EOF
1e2ae142 372## main...upstream [ahead 1, behind 2]
46077fa5
MG
373 M dir1/modified
374A dir2/added
375?? dir1/untracked
376?? dir2/modified
377?? dir2/untracked
46077fa5
MG
378?? untracked
379EOF
380
381test_expect_success 'status -s -b' '
382
383 git status -s -b >output &&
1108cea7 384 test_cmp expect output
46077fa5
MG
385
386'
387
a5985237
JK
388test_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 &&
1108cea7 394 test_cmp expect output
a5985237
JK
395'
396
355ec7a1
ÆAB
397test_expect_success 'setup dir3' '
398 mkdir dir3 &&
399 : >dir3/untracked1 &&
400 : >dir3/untracked2
401'
402
cc6658e7 403test_expect_success 'status -uno' '
1c7969c9 404 cat >expect <<EOF &&
1e2ae142 405On branch main
75177c85
JK
406Your branch and '\''upstream'\'' have diverged,
407and have 1 and 2 different commits each, respectively.
d92304ff 408 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 409
1c7969c9 410Changes to be committed:
80f537f7 411 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
412 new file: dir2/added
413
414Changes not staged for commit:
415 (use "git add <file>..." to update what will be committed)
80f537f7 416 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
417 modified: dir1/modified
418
419Untracked files not listed (use -u option to show untracked files)
420EOF
6c2ce048 421 git status -uno >output &&
1108cea7 422 test_cmp expect output
6c2ce048
MSO
423'
424
cc6658e7 425test_expect_success 'status (status.showUntrackedFiles no)' '
c63659dd 426 test_config status.showuntrackedfiles no &&
d6293d1f 427 git status >output &&
1108cea7 428 test_cmp expect output
d6293d1f
MSO
429'
430
cc6658e7 431test_expect_success 'status -uno (advice.statusHints false)' '
1c7969c9 432 cat >expect <<EOF &&
1e2ae142 433On branch main
75177c85
JK
434Your branch and '\''upstream'\'' have diverged,
435and have 1 and 2 different commits each, respectively.
436
1c7969c9
MM
437Changes to be committed:
438 new file: dir2/added
439
440Changes not staged for commit:
441 modified: dir1/modified
442
443Untracked files not listed
444EOF
c63659dd 445 test_config advice.statusHints false &&
18f3b5a9 446 git status -uno >output &&
1108cea7 447 test_cmp expect output
18f3b5a9 448'
18f3b5a9 449
14ed05dd
MG
450cat >expect << EOF
451 M dir1/modified
452A dir2/added
453EOF
454test_expect_success 'status -s -uno' '
14ed05dd
MG
455 git status -s -uno >output &&
456 test_cmp expect output
457'
458
459test_expect_success 'status -s (status.showUntrackedFiles no)' '
99094a7a 460 git config status.showuntrackedfiles no &&
14ed05dd
MG
461 git status -s >output &&
462 test_cmp expect output
463'
464
cc6658e7 465test_expect_success 'status -unormal' '
1c7969c9 466 cat >expect <<EOF &&
1e2ae142 467On branch main
75177c85
JK
468Your branch and '\''upstream'\'' have diverged,
469and have 1 and 2 different commits each, respectively.
d92304ff 470 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 471
1c7969c9 472Changes to be committed:
80f537f7 473 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
474 new file: dir2/added
475
476Changes not staged for commit:
477 (use "git add <file>..." to update what will be committed)
80f537f7 478 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
479 modified: dir1/modified
480
481Untracked files:
482 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
483 dir1/untracked
484 dir2/modified
485 dir2/untracked
486 dir3/
1c7969c9 487 untracked
2f0f7f1c 488
1c7969c9 489EOF
4bfee30a 490 git status -unormal >output &&
1108cea7 491 test_cmp expect output
4bfee30a
MSO
492'
493
cc6658e7 494test_expect_success 'status (status.showUntrackedFiles normal)' '
99094a7a 495 test_config status.showuntrackedfiles normal &&
d6293d1f 496 git status >output &&
1108cea7 497 test_cmp expect output
d6293d1f
MSO
498'
499
14ed05dd
MG
500cat >expect <<EOF
501 M dir1/modified
502A dir2/added
503?? dir1/untracked
504?? dir2/modified
505?? dir2/untracked
506?? dir3/
14ed05dd
MG
507?? untracked
508EOF
509test_expect_success 'status -s -unormal' '
14ed05dd
MG
510 git status -s -unormal >output &&
511 test_cmp expect output
512'
513
514test_expect_success 'status -s (status.showUntrackedFiles normal)' '
99094a7a 515 git config status.showuntrackedfiles normal &&
14ed05dd
MG
516 git status -s >output &&
517 test_cmp expect output
518'
519
cc6658e7 520test_expect_success 'status -uall' '
1c7969c9 521 cat >expect <<EOF &&
1e2ae142 522On branch main
75177c85
JK
523Your branch and '\''upstream'\'' have diverged,
524and have 1 and 2 different commits each, respectively.
d92304ff 525 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 526
1c7969c9 527Changes to be committed:
80f537f7 528 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
529 new file: dir2/added
530
531Changes not staged for commit:
532 (use "git add <file>..." to update what will be committed)
80f537f7 533 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
534 modified: dir1/modified
535
536Untracked files:
537 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
538 dir1/untracked
539 dir2/modified
540 dir2/untracked
541 dir3/untracked1
542 dir3/untracked2
1c7969c9 543 untracked
2f0f7f1c 544
1c7969c9 545EOF
4bfee30a 546 git status -uall >output &&
1108cea7 547 test_cmp expect output
d6293d1f 548'
cc6658e7
JH
549
550test_expect_success 'status (status.showUntrackedFiles all)' '
99094a7a 551 test_config status.showuntrackedfiles all &&
d6293d1f 552 git status >output &&
1108cea7 553 test_cmp expect output
4bfee30a
MSO
554'
555
355ec7a1
ÆAB
556test_expect_success 'teardown dir3' '
557 rm -rf dir3
558'
559
14ed05dd
MG
560cat >expect <<EOF
561 M dir1/modified
562A dir2/added
563?? dir1/untracked
564?? dir2/modified
565?? dir2/untracked
14ed05dd
MG
566?? untracked
567EOF
568test_expect_success 'status -s -uall' '
a6a4a88a 569 test_unconfig status.showuntrackedfiles &&
14ed05dd
MG
570 git status -s -uall >output &&
571 test_cmp expect output
572'
573test_expect_success 'status -s (status.showUntrackedFiles all)' '
c63659dd 574 test_config status.showuntrackedfiles all &&
14ed05dd
MG
575 git status -s >output &&
576 rm -rf dir3 &&
14ed05dd
MG
577 test_cmp expect output
578'
579
cc6658e7 580test_expect_success 'status with relative paths' '
1c7969c9 581 cat >expect <<\EOF &&
1e2ae142 582On branch main
75177c85
JK
583Your branch and '\''upstream'\'' have diverged,
584and have 1 and 2 different commits each, respectively.
d92304ff 585 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 586
1c7969c9 587Changes to be committed:
80f537f7 588 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
589 new file: ../dir2/added
590
591Changes not staged for commit:
592 (use "git add <file>..." to update what will be committed)
80f537f7 593 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
594 modified: modified
595
596Untracked files:
597 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
598 untracked
599 ../dir2/modified
600 ../dir2/untracked
1c7969c9 601 ../untracked
2f0f7f1c 602
1c7969c9 603EOF
68cfc6f5 604 (cd dir1 && git status) >output &&
1108cea7 605 test_cmp expect output
367c9886
JS
606'
607
68cfc6f5 608cat >expect <<\EOF
14ed05dd
MG
609 M modified
610A ../dir2/added
611?? untracked
612?? ../dir2/modified
613?? ../dir2/untracked
14ed05dd
MG
614?? ../untracked
615EOF
616test_expect_success 'status -s with relative paths' '
617
68cfc6f5 618 (cd dir1 && git status -s) >output &&
14ed05dd
MG
619 test_cmp expect output
620
621'
622
68cfc6f5 623cat >expect <<\EOF
c521bb71
MG
624 M dir1/modified
625A dir2/added
626?? dir1/untracked
627?? dir2/modified
628?? dir2/untracked
c521bb71
MG
629?? untracked
630EOF
631
632test_expect_success 'status --porcelain ignores relative paths setting' '
633
68cfc6f5 634 (cd dir1 && git status --porcelain) >output &&
c521bb71
MG
635 test_cmp expect output
636
637'
638
68cfc6f5
MG
639test_expect_success 'setup unique colors' '
640
1d282327 641 git config status.color.untracked blue &&
93fdf301
SK
642 git config status.color.branch green &&
643 git config status.color.localBranch yellow &&
644 git config status.color.remoteBranch cyan
68cfc6f5
MG
645
646'
647
01c94e90 648test_expect_success TTY 'status with color.ui' '
1c7969c9 649 cat >expect <<\EOF &&
1e2ae142 650On branch <GREEN>main<RESET>
75177c85
JK
651Your branch and '\''upstream'\'' have diverged,
652and have 1 and 2 different commits each, respectively.
d92304ff 653 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 654
1c7969c9 655Changes to be committed:
80f537f7 656 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
657 <GREEN>new file: dir2/added<RESET>
658
659Changes not staged for commit:
660 (use "git add <file>..." to update what will be committed)
80f537f7 661 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
662 <RED>modified: dir1/modified<RESET>
663
664Untracked files:
665 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
666 <BLUE>dir1/untracked<RESET>
667 <BLUE>dir2/modified<RESET>
668 <BLUE>dir2/untracked<RESET>
1c7969c9 669 <BLUE>untracked<RESET>
2f0f7f1c 670
1c7969c9 671EOF
01c94e90
JK
672 test_config color.ui auto &&
673 test_terminal git status | test_decode_color >output &&
1108cea7 674 test_cmp expect output
68cfc6f5
MG
675'
676
01c94e90
JK
677test_expect_success TTY 'status with color.status' '
678 test_config color.status auto &&
679 test_terminal git status | test_decode_color >output &&
1108cea7 680 test_cmp expect output
68cfc6f5
MG
681'
682
683cat >expect <<\EOF
684 <RED>M<RESET> dir1/modified
685<GREEN>A<RESET> dir2/added
686<BLUE>??<RESET> dir1/untracked
687<BLUE>??<RESET> dir2/modified
688<BLUE>??<RESET> dir2/untracked
68cfc6f5
MG
689<BLUE>??<RESET> untracked
690EOF
691
01c94e90 692test_expect_success TTY 'status -s with color.ui' '
68cfc6f5 693
01c94e90
JK
694 git config color.ui auto &&
695 test_terminal git status -s | test_decode_color >output &&
68cfc6f5
MG
696 test_cmp expect output
697
698'
699
01c94e90 700test_expect_success TTY 'status -s with color.status' '
68cfc6f5
MG
701
702 git config --unset color.ui &&
01c94e90
JK
703 git config color.status auto &&
704 test_terminal git status -s | test_decode_color >output &&
68cfc6f5
MG
705 test_cmp expect output
706
707'
708
46077fa5 709cat >expect <<\EOF
1e2ae142 710## <YELLOW>main<RESET>...<CYAN>upstream<RESET> [ahead <YELLOW>1<RESET>, behind <CYAN>2<RESET>]
46077fa5
MG
711 <RED>M<RESET> dir1/modified
712<GREEN>A<RESET> dir2/added
713<BLUE>??<RESET> dir1/untracked
714<BLUE>??<RESET> dir2/modified
715<BLUE>??<RESET> dir2/untracked
46077fa5
MG
716<BLUE>??<RESET> untracked
717EOF
718
01c94e90 719test_expect_success TTY 'status -s -b with color.status' '
46077fa5 720
01c94e90 721 test_terminal git status -s -b | test_decode_color >output &&
1108cea7 722 test_cmp expect output
46077fa5
MG
723
724'
725
68cfc6f5
MG
726cat >expect <<\EOF
727 M dir1/modified
728A dir2/added
729?? dir1/untracked
730?? dir2/modified
731?? dir2/untracked
68cfc6f5
MG
732?? untracked
733EOF
734
01c94e90 735test_expect_success TTY 'status --porcelain ignores color.ui' '
68cfc6f5
MG
736
737 git config --unset color.status &&
01c94e90
JK
738 git config color.ui auto &&
739 test_terminal git status --porcelain | test_decode_color >output &&
68cfc6f5
MG
740 test_cmp expect output
741
742'
743
01c94e90 744test_expect_success TTY 'status --porcelain ignores color.status' '
68cfc6f5
MG
745
746 git config --unset color.ui &&
01c94e90
JK
747 git config color.status auto &&
748 test_terminal git status --porcelain | test_decode_color >output &&
68cfc6f5
MG
749 test_cmp expect output
750
751'
752
753# recover unconditionally from color tests
754git config --unset color.status
755git config --unset color.ui
756
d4a6bf1f 757test_expect_success 'status --porcelain respects -b' '
46077fa5
MG
758
759 git status --porcelain -b >output &&
d4a6bf1f 760 {
1e2ae142 761 echo "## main...upstream [ahead 1, behind 2]" &&
d4a6bf1f
JK
762 cat expect
763 } >tmp &&
764 mv tmp expect &&
46077fa5
MG
765 test_cmp expect output
766
767'
768
46f721c8 769
68cfc6f5 770
cc6658e7 771test_expect_success 'status without relative paths' '
1c7969c9 772 cat >expect <<\EOF &&
1e2ae142 773On branch main
75177c85
JK
774Your branch and '\''upstream'\'' have diverged,
775and have 1 and 2 different commits each, respectively.
d92304ff 776 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 777
1c7969c9 778Changes to be committed:
80f537f7 779 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
780 new file: dir2/added
781
782Changes not staged for commit:
783 (use "git add <file>..." to update what will be committed)
80f537f7 784 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
785 modified: dir1/modified
786
787Untracked files:
788 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
789 dir1/untracked
790 dir2/modified
791 dir2/untracked
1c7969c9 792 untracked
2f0f7f1c 793
1c7969c9 794EOF
c63659dd 795 test_config status.relativePaths false &&
68cfc6f5 796 (cd dir1 && git status) >output &&
1108cea7 797 test_cmp expect output
46f721c8
JK
798
799'
800
68cfc6f5 801cat >expect <<\EOF
14ed05dd
MG
802 M dir1/modified
803A dir2/added
804?? dir1/untracked
805?? dir2/modified
806?? dir2/untracked
14ed05dd
MG
807?? untracked
808EOF
809
810test_expect_success 'status -s without relative paths' '
811
c63659dd 812 test_config status.relativePaths false &&
68cfc6f5 813 (cd dir1 && git status -s) >output &&
14ed05dd
MG
814 test_cmp expect output
815
816'
817
a361dd3f
JH
818cat >expect <<\EOF
819 M dir1/modified
820A dir2/added
821A "file with spaces"
822?? dir1/untracked
823?? dir2/modified
824?? dir2/untracked
825?? "file with spaces 2"
826?? untracked
827EOF
828
829test_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" &&
835
836 git status -s >output &&
837 test_cmp expect output &&
838
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
843'
844
9e4b7ab6 845test_expect_success 'dry-run of partial commit excluding new file in index' '
1c7969c9 846 cat >expect <<EOF &&
1e2ae142 847On branch main
75177c85
JK
848Your branch and '\''upstream'\'' have diverged,
849and have 1 and 2 different commits each, respectively.
75177c85 850
1c7969c9 851Changes to be committed:
80f537f7 852 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
853 modified: dir1/modified
854
855Untracked files:
856 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
857 dir1/untracked
858 dir2/
1c7969c9 859 untracked
2f0f7f1c 860
1c7969c9 861EOF
cc6658e7 862 git commit --dry-run dir1/modified >output &&
1108cea7 863 test_cmp expect output
959ba670
JK
864'
865
4c926b37 866cat >expect <<EOF
a5587b85 867:100644 100644 $EMPTY_BLOB $ZERO_OID M dir1/modified
4c926b37 868EOF
4bb6644d 869test_expect_success 'status refreshes the index' '
4c926b37
MH
870 touch dir2/added &&
871 git status &&
872 git diff-files >output &&
873 test_cmp expect output
874'
875
f24c30e0
JT
876test_expect_success 'status shows detached HEAD properly after checking out non-local upstream branch' '
877 test_when_finished rm -rf upstream downstream actual &&
878
879 test_create_repo upstream &&
880 test_commit -C upstream foo &&
881
882 git clone upstream downstream &&
883 git -C downstream checkout @{u} &&
884 git -C downstream status >actual &&
4da8b2fc 885 grep -E "HEAD detached at [0-9a-f]+" actual
f24c30e0
JT
886'
887
e5e4a7f2
PY
888test_expect_success 'setup status submodule summary' '
889 test_create_repo sm && (
890 cd sm &&
891 >foo &&
892 git add foo &&
893 git commit -m "Add foo"
894 ) &&
895 git add sm
896'
897
cc6658e7 898test_expect_success 'status submodule summary is disabled by default' '
1c7969c9 899 cat >expect <<EOF &&
1e2ae142 900On branch main
75177c85
JK
901Your branch and '\''upstream'\'' have diverged,
902and have 1 and 2 different commits each, respectively.
d92304ff 903 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 904
1c7969c9 905Changes to be committed:
80f537f7 906 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
907 new file: dir2/added
908 new file: sm
909
910Changes not staged for commit:
911 (use "git add <file>..." to update what will be committed)
80f537f7 912 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
913 modified: dir1/modified
914
915Untracked files:
916 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
917 dir1/untracked
918 dir2/modified
919 dir2/untracked
1c7969c9 920 untracked
2f0f7f1c 921
1c7969c9 922EOF
e5e4a7f2 923 git status >output &&
1108cea7 924 test_cmp expect output
e5e4a7f2
PY
925'
926
98fa4738 927# we expect the same as the previous test
cc6658e7 928test_expect_success 'status --untracked-files=all does not show submodule' '
98fa4738 929 git status --untracked-files=all >output &&
1108cea7 930 test_cmp expect output
e5e4a7f2
PY
931'
932
14ed05dd
MG
933cat >expect <<EOF
934 M dir1/modified
935A dir2/added
936A sm
937?? dir1/untracked
938?? dir2/modified
939?? dir2/untracked
14ed05dd
MG
940?? untracked
941EOF
942test_expect_success 'status -s submodule summary is disabled by default' '
943 git status -s >output &&
944 test_cmp expect output
945'
946
947# we expect the same as the previous test
948test_expect_success 'status -s --untracked-files=all does not show submodule' '
949 git status -s --untracked-files=all >output &&
950 test_cmp expect output
951'
952
e5e4a7f2
PY
953head=$(cd sm && git rev-parse --short=7 --verify HEAD)
954
cc6658e7 955test_expect_success 'status submodule summary' '
1c7969c9 956 cat >expect <<EOF &&
1e2ae142 957On branch main
75177c85
JK
958Your branch and '\''upstream'\'' have diverged,
959and have 1 and 2 different commits each, respectively.
d92304ff 960 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 961
1c7969c9 962Changes to be committed:
80f537f7 963 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
964 new file: dir2/added
965 new file: sm
966
967Changes not staged for commit:
968 (use "git add <file>..." to update what will be committed)
80f537f7 969 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
970 modified: dir1/modified
971
972Submodule changes to be committed:
973
974* sm 0000000...$head (1):
975 > Add foo
976
977Untracked files:
978 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
979 dir1/untracked
980 dir2/modified
981 dir2/untracked
1c7969c9 982 untracked
2f0f7f1c 983
1c7969c9 984EOF
e5e4a7f2
PY
985 git config status.submodulesummary 10 &&
986 git status >output &&
1108cea7 987 test_cmp expect output
e5e4a7f2
PY
988'
989
2556b996
MM
990test_expect_success 'status submodule summary with status.displayCommentPrefix=false' '
991 strip_comments expect &&
992 git -c status.displayCommentPrefix=false status >output &&
1108cea7 993 test_cmp expect output
2556b996
MM
994'
995
996test_expect_success 'commit with submodule summary ignores status.displayCommentPrefix' '
997 commit_template_commented
998'
999
14ed05dd
MG
1000cat >expect <<EOF
1001 M dir1/modified
1002A dir2/added
1003A sm
1004?? dir1/untracked
1005?? dir2/modified
1006?? dir2/untracked
14ed05dd
MG
1007?? untracked
1008EOF
1009test_expect_success 'status -s submodule summary' '
1010 git status -s >output &&
1011 test_cmp expect output
1012'
e5e4a7f2 1013
1c7969c9 1014test_expect_success 'status submodule summary (clean submodule): commit' '
b6f3da51 1015 cat >expect-status <<EOF &&
1e2ae142 1016On branch main
75177c85
JK
1017Your branch and '\''upstream'\'' have diverged,
1018and have 2 and 2 different commits each, respectively.
d92304ff 1019 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 1020
1c7969c9
MM
1021Changes not staged for commit:
1022 (use "git add <file>..." to update what will be committed)
80f537f7 1023 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
1024 modified: dir1/modified
1025
1026Untracked files:
1027 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
1028 dir1/untracked
1029 dir2/modified
1030 dir2/untracked
1c7969c9 1031 untracked
2f0f7f1c 1032
e5e4a7f2
PY
1033no changes added to commit (use "git add" and/or "git commit -a")
1034EOF
b6f3da51 1035 sed "/git pull/d" expect-status > expect-commit &&
cc6658e7 1036 git commit -m "commit submodule" &&
e5e4a7f2 1037 git config status.submodulesummary 10 &&
9e4b7ab6 1038 test_must_fail git commit --dry-run >output &&
b6f3da51 1039 test_cmp expect-commit output &&
9e4b7ab6 1040 git status >output &&
b6f3da51 1041 test_cmp expect-status output
e5e4a7f2
PY
1042'
1043
14ed05dd
MG
1044cat >expect <<EOF
1045 M dir1/modified
1046?? dir1/untracked
1047?? dir2/modified
1048?? dir2/untracked
14ed05dd
MG
1049?? untracked
1050EOF
1051test_expect_success 'status -s submodule summary (clean submodule)' '
1052 git status -s >output &&
1053 test_cmp expect output
1054'
1055
000f97bd 1056test_expect_success 'status -z implies porcelain' '
95b9f9f9 1057 git status --porcelain |
94221d22 1058 perl -pe "s/\012/\000/g" >expect &&
95b9f9f9
BC
1059 git status -z >output &&
1060 test_cmp expect output
1061'
1062
cc6658e7 1063test_expect_success 'commit --dry-run submodule summary (--amend)' '
1c7969c9 1064 cat >expect <<EOF &&
1e2ae142 1065On branch main
75177c85
JK
1066Your branch and '\''upstream'\'' have diverged,
1067and have 2 and 2 different commits each, respectively.
75177c85 1068
1c7969c9 1069Changes to be committed:
80f537f7 1070 (use "git restore --source=HEAD^1 --staged <file>..." to unstage)
1c7969c9
MM
1071 new file: dir2/added
1072 new file: sm
1073
1074Changes not staged for commit:
1075 (use "git add <file>..." to update what will be committed)
80f537f7 1076 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
1077 modified: dir1/modified
1078
1079Submodule changes to be committed:
1080
1081* sm 0000000...$head (1):
1082 > Add foo
1083
1084Untracked files:
1085 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
1086 dir1/untracked
1087 dir2/modified
1088 dir2/untracked
1c7969c9 1089 untracked
2f0f7f1c 1090
1c7969c9 1091EOF
e5e4a7f2 1092 git config status.submodulesummary 10 &&
9e4b7ab6 1093 git commit --dry-run --amend >output &&
1108cea7 1094 test_cmp expect output
e5e4a7f2
PY
1095'
1096
c91cfd19 1097test_expect_success POSIXPERM,SANITY 'status succeeds in a read-only repository' '
03771425 1098 test_when_finished "chmod 775 .git" &&
b2f6fd95
MH
1099 (
1100 chmod a-w .git &&
1101 # make dir1/tracked stat-dirty
1102 >dir1/tracked1 && mv -f dir1/tracked1 dir1/tracked &&
1103 git status -s >output &&
1104 ! grep dir1/tracked output &&
1105 # make sure "status" succeeded without writing index out
1106 git diff-files | grep dir1/tracked
1107 )
b2f6fd95
MH
1108'
1109
c2e0940b 1110(cd sm && echo > bar && git add bar && git commit -q -m 'Add bar') && git add sm
aee9c7d6
JL
1111new_head=$(cd sm && git rev-parse --short=7 --verify HEAD)
1112touch .gitmodules
1113
cc6658e7 1114test_expect_success '--ignore-submodules=untracked suppresses submodules with untracked content' '
1c7969c9 1115 cat > expect << EOF &&
1e2ae142 1116On branch main
75177c85
JK
1117Your branch and '\''upstream'\'' have diverged,
1118and have 2 and 2 different commits each, respectively.
d92304ff 1119 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 1120
1c7969c9 1121Changes to be committed:
80f537f7 1122 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
1123 modified: sm
1124
1125Changes not staged for commit:
1126 (use "git add <file>..." to update what will be committed)
80f537f7 1127 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
1128 modified: dir1/modified
1129
1130Submodule changes to be committed:
1131
1132* sm $head...$new_head (1):
1133 > Add bar
1134
1135Untracked files:
1136 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
1137 .gitmodules
1138 dir1/untracked
1139 dir2/modified
1140 dir2/untracked
1c7969c9 1141 untracked
2f0f7f1c 1142
1c7969c9 1143EOF
cc6658e7
JH
1144 echo modified sm/untracked &&
1145 git status --ignore-submodules=untracked >output &&
1108cea7 1146 test_cmp expect output
46a958b3
JL
1147'
1148
cc6658e7 1149test_expect_success '.gitmodules ignore=untracked suppresses submodules with untracked content' '
c63659dd 1150 test_config diff.ignoreSubmodules dirty &&
90e14525 1151 git status >output &&
1108cea7 1152 test_cmp expect output &&
302ad7a9
JL
1153 git config --add -f .gitmodules submodule.subname.ignore untracked &&
1154 git config --add -f .gitmodules submodule.subname.path sm &&
cc6658e7 1155 git status >output &&
1108cea7 1156 test_cmp expect output &&
c63659dd 1157 git config -f .gitmodules --remove-section submodule.subname
302ad7a9
JL
1158'
1159
cc6658e7 1160test_expect_success '.git/config ignore=untracked suppresses submodules with untracked content' '
302ad7a9
JL
1161 git config --add -f .gitmodules submodule.subname.ignore none &&
1162 git config --add -f .gitmodules submodule.subname.path sm &&
aee9c7d6
JL
1163 git config --add submodule.subname.ignore untracked &&
1164 git config --add submodule.subname.path sm &&
cc6658e7 1165 git status >output &&
1108cea7 1166 test_cmp expect output &&
302ad7a9
JL
1167 git config --remove-section submodule.subname &&
1168 git config --remove-section -f .gitmodules submodule.subname
aee9c7d6
JL
1169'
1170
cc6658e7
JH
1171test_expect_success '--ignore-submodules=dirty suppresses submodules with untracked content' '
1172 git status --ignore-submodules=dirty >output &&
1108cea7 1173 test_cmp expect output
46a958b3
JL
1174'
1175
cc6658e7 1176test_expect_success '.gitmodules ignore=dirty suppresses submodules with untracked content' '
c63659dd 1177 test_config diff.ignoreSubmodules dirty &&
90e14525
JL
1178 git status >output &&
1179 ! test -s actual &&
302ad7a9
JL
1180 git config --add -f .gitmodules submodule.subname.ignore dirty &&
1181 git config --add -f .gitmodules submodule.subname.path sm &&
cc6658e7 1182 git status >output &&
1108cea7 1183 test_cmp expect output &&
c63659dd 1184 git config -f .gitmodules --remove-section submodule.subname
302ad7a9
JL
1185'
1186
cc6658e7 1187test_expect_success '.git/config ignore=dirty suppresses submodules with untracked content' '
302ad7a9
JL
1188 git config --add -f .gitmodules submodule.subname.ignore none &&
1189 git config --add -f .gitmodules submodule.subname.path sm &&
aee9c7d6
JL
1190 git config --add submodule.subname.ignore dirty &&
1191 git config --add submodule.subname.path sm &&
cc6658e7 1192 git status >output &&
1108cea7 1193 test_cmp expect output &&
302ad7a9
JL
1194 git config --remove-section submodule.subname &&
1195 git config -f .gitmodules --remove-section submodule.subname
aee9c7d6
JL
1196'
1197
cc6658e7
JH
1198test_expect_success '--ignore-submodules=dirty suppresses submodules with modified content' '
1199 echo modified >sm/foo &&
1200 git status --ignore-submodules=dirty >output &&
1108cea7 1201 test_cmp expect output
46a958b3
JL
1202'
1203
cc6658e7 1204test_expect_success '.gitmodules ignore=dirty suppresses submodules with modified content' '
302ad7a9
JL
1205 git config --add -f .gitmodules submodule.subname.ignore dirty &&
1206 git config --add -f .gitmodules submodule.subname.path sm &&
cc6658e7 1207 git status >output &&
1108cea7 1208 test_cmp expect output &&
302ad7a9
JL
1209 git config -f .gitmodules --remove-section submodule.subname
1210'
1211
cc6658e7 1212test_expect_success '.git/config ignore=dirty suppresses submodules with modified content' '
302ad7a9
JL
1213 git config --add -f .gitmodules submodule.subname.ignore none &&
1214 git config --add -f .gitmodules submodule.subname.path sm &&
aee9c7d6
JL
1215 git config --add submodule.subname.ignore dirty &&
1216 git config --add submodule.subname.path sm &&
cc6658e7 1217 git status >output &&
1108cea7 1218 test_cmp expect output &&
302ad7a9
JL
1219 git config --remove-section submodule.subname &&
1220 git config -f .gitmodules --remove-section submodule.subname
aee9c7d6
JL
1221'
1222
cc6658e7 1223test_expect_success "--ignore-submodules=untracked doesn't suppress submodules with modified content" '
1c7969c9 1224 cat > expect << EOF &&
1e2ae142 1225On branch main
75177c85
JK
1226Your branch and '\''upstream'\'' have diverged,
1227and have 2 and 2 different commits each, respectively.
d92304ff 1228 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 1229
1c7969c9 1230Changes to be committed:
80f537f7 1231 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
1232 modified: sm
1233
1234Changes not staged for commit:
1235 (use "git add <file>..." to update what will be committed)
80f537f7 1236 (use "git restore <file>..." to discard changes in working directory)
1c7969c9 1237 (commit or discard the untracked or modified content in submodules)
1c7969c9
MM
1238 modified: dir1/modified
1239 modified: sm (modified content)
1240
1241Submodule changes to be committed:
1242
1243* sm $head...$new_head (1):
1244 > Add bar
1245
1246Untracked files:
1247 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
1248 .gitmodules
1249 dir1/untracked
1250 dir2/modified
1251 dir2/untracked
1c7969c9 1252 untracked
2f0f7f1c 1253
1c7969c9 1254EOF
46a958b3 1255 git status --ignore-submodules=untracked > output &&
1108cea7 1256 test_cmp expect output
46a958b3
JL
1257'
1258
cc6658e7 1259test_expect_success ".gitmodules ignore=untracked doesn't suppress submodules with modified content" '
302ad7a9
JL
1260 git config --add -f .gitmodules submodule.subname.ignore untracked &&
1261 git config --add -f .gitmodules submodule.subname.path sm &&
cc6658e7 1262 git status >output &&
1108cea7 1263 test_cmp expect output &&
302ad7a9
JL
1264 git config -f .gitmodules --remove-section submodule.subname
1265'
1266
cc6658e7 1267test_expect_success ".git/config ignore=untracked doesn't suppress submodules with modified content" '
302ad7a9
JL
1268 git config --add -f .gitmodules submodule.subname.ignore none &&
1269 git config --add -f .gitmodules submodule.subname.path sm &&
aee9c7d6
JL
1270 git config --add submodule.subname.ignore untracked &&
1271 git config --add submodule.subname.path sm &&
cc6658e7 1272 git status >output &&
1108cea7 1273 test_cmp expect output &&
302ad7a9
JL
1274 git config --remove-section submodule.subname &&
1275 git config -f .gitmodules --remove-section submodule.subname
aee9c7d6
JL
1276'
1277
46a958b3
JL
1278head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --verify HEAD)
1279
cc6658e7 1280test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" '
1c7969c9 1281 cat > expect << EOF &&
1e2ae142 1282On branch main
75177c85
JK
1283Your branch and '\''upstream'\'' have diverged,
1284and have 2 and 2 different commits each, respectively.
d92304ff 1285 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 1286
1c7969c9 1287Changes to be committed:
80f537f7 1288 (use "git restore --staged <file>..." to unstage)
1c7969c9
MM
1289 modified: sm
1290
1291Changes not staged for commit:
1292 (use "git add <file>..." to update what will be committed)
80f537f7 1293 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
1294 modified: dir1/modified
1295 modified: sm (new commits)
1296
1297Submodule changes to be committed:
1298
1299* sm $head...$new_head (1):
1300 > Add bar
1301
1302Submodules changed but not updated:
1303
1304* sm $new_head...$head2 (1):
1305 > 2nd commit
1306
1307Untracked files:
1308 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
1309 .gitmodules
1310 dir1/untracked
1311 dir2/modified
1312 dir2/untracked
1c7969c9 1313 untracked
2f0f7f1c 1314
1c7969c9 1315EOF
46a958b3 1316 git status --ignore-submodules=untracked > output &&
1108cea7 1317 test_cmp expect output
46a958b3
JL
1318'
1319
cc6658e7 1320test_expect_success ".gitmodules ignore=untracked doesn't suppress submodule summary" '
302ad7a9
JL
1321 git config --add -f .gitmodules submodule.subname.ignore untracked &&
1322 git config --add -f .gitmodules submodule.subname.path sm &&
cc6658e7 1323 git status >output &&
1108cea7 1324 test_cmp expect output &&
302ad7a9
JL
1325 git config -f .gitmodules --remove-section submodule.subname
1326'
1327
cc6658e7 1328test_expect_success ".git/config ignore=untracked doesn't suppress submodule summary" '
302ad7a9
JL
1329 git config --add -f .gitmodules submodule.subname.ignore none &&
1330 git config --add -f .gitmodules submodule.subname.path sm &&
aee9c7d6
JL
1331 git config --add submodule.subname.ignore untracked &&
1332 git config --add submodule.subname.path sm &&
cc6658e7 1333 git status >output &&
1108cea7 1334 test_cmp expect output &&
302ad7a9
JL
1335 git config --remove-section submodule.subname &&
1336 git config -f .gitmodules --remove-section submodule.subname
aee9c7d6
JL
1337'
1338
cc6658e7 1339test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summary" '
46a958b3 1340 git status --ignore-submodules=dirty > output &&
1108cea7 1341 test_cmp expect output
46a958b3 1342'
cc6658e7 1343test_expect_success ".gitmodules ignore=dirty doesn't suppress submodule summary" '
302ad7a9
JL
1344 git config --add -f .gitmodules submodule.subname.ignore dirty &&
1345 git config --add -f .gitmodules submodule.subname.path sm &&
cc6658e7 1346 git status >output &&
1108cea7 1347 test_cmp expect output &&
302ad7a9
JL
1348 git config -f .gitmodules --remove-section submodule.subname
1349'
46a958b3 1350
cc6658e7 1351test_expect_success ".git/config ignore=dirty doesn't suppress submodule summary" '
302ad7a9
JL
1352 git config --add -f .gitmodules submodule.subname.ignore none &&
1353 git config --add -f .gitmodules submodule.subname.path sm &&
aee9c7d6
JL
1354 git config --add submodule.subname.ignore dirty &&
1355 git config --add submodule.subname.path sm &&
cc6658e7 1356 git status >output &&
1108cea7 1357 test_cmp expect output &&
302ad7a9
JL
1358 git config --remove-section submodule.subname &&
1359 git config -f .gitmodules --remove-section submodule.subname
aee9c7d6
JL
1360'
1361
eff80a9f 1362cat > expect << EOF
1e2ae142 1363; On branch main
75177c85
JK
1364; Your branch and 'upstream' have diverged,
1365; and have 2 and 2 different commits each, respectively.
d92304ff 1366; (use "git pull" if you want to integrate the remote branch with yours)
75177c85 1367;
eff80a9f 1368; Changes to be committed:
80f537f7 1369; (use "git restore --staged <file>..." to unstage)
eff80a9f
JH
1370; modified: sm
1371;
1372; Changes not staged for commit:
1373; (use "git add <file>..." to update what will be committed)
80f537f7 1374; (use "git restore <file>..." to discard changes in working directory)
eff80a9f
JH
1375; modified: dir1/modified
1376; modified: sm (new commits)
1377;
1378; Submodule changes to be committed:
1379;
1380; * sm $head...$new_head (1):
1381; > Add bar
1382;
1383; Submodules changed but not updated:
1384;
1385; * sm $new_head...$head2 (1):
1386; > 2nd commit
1387;
1388; Untracked files:
1389; (use "git add <file>..." to include in what will be committed)
eff80a9f
JH
1390; .gitmodules
1391; dir1/untracked
1392; dir2/modified
1393; dir2/untracked
eff80a9f 1394; untracked
2f0f7f1c 1395;
eff80a9f
JH
1396EOF
1397
1398test_expect_success "status (core.commentchar with submodule summary)" '
c63659dd 1399 test_config core.commentchar ";" &&
1c7969c9 1400 git -c status.displayCommentPrefix=true status >output &&
1108cea7 1401 test_cmp expect output
eff80a9f
JH
1402'
1403
1404test_expect_success "status (core.commentchar with two chars with submodule summary)" '
c63659dd 1405 test_config core.commentchar ";;" &&
50b54fd7 1406 test_must_fail git -c status.displayCommentPrefix=true status
eff80a9f
JH
1407'
1408
1c7969c9
MM
1409test_expect_success "--ignore-submodules=all suppresses submodule summary" '
1410 cat > expect << EOF &&
1e2ae142 1411On branch main
75177c85
JK
1412Your branch and '\''upstream'\'' have diverged,
1413and have 2 and 2 different commits each, respectively.
d92304ff 1414 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 1415
1c7969c9
MM
1416Changes not staged for commit:
1417 (use "git add <file>..." to update what will be committed)
80f537f7 1418 (use "git restore <file>..." to discard changes in working directory)
1c7969c9
MM
1419 modified: dir1/modified
1420
1421Untracked files:
1422 (use "git add <file>..." to include in what will be committed)
1c7969c9
MM
1423 .gitmodules
1424 dir1/untracked
1425 dir2/modified
1426 dir2/untracked
1c7969c9 1427 untracked
2f0f7f1c 1428
46a958b3
JL
1429no changes added to commit (use "git add" and/or "git commit -a")
1430EOF
46a958b3 1431 git status --ignore-submodules=all > output &&
1108cea7 1432 test_cmp expect output
46a958b3
JL
1433'
1434
1d2f393a
JL
1435test_expect_success '.gitmodules ignore=all suppresses unstaged submodule summary' '
1436 cat > expect << EOF &&
1e2ae142 1437On branch main
75177c85
JK
1438Your branch and '\''upstream'\'' have diverged,
1439and have 2 and 2 different commits each, respectively.
d92304ff 1440 (use "git pull" if you want to integrate the remote branch with yours)
75177c85 1441
1d2f393a 1442Changes to be committed:
80f537f7 1443 (use "git restore --staged <file>..." to unstage)
1d2f393a
JL
1444 modified: sm
1445
1446Changes not staged for commit:
1447 (use "git add <file>..." to update what will be committed)
80f537f7 1448 (use "git restore <file>..." to discard changes in working directory)
1d2f393a
JL
1449 modified: dir1/modified
1450
1451Untracked files:
1452 (use "git add <file>..." to include in what will be committed)
1d2f393a
JL
1453 .gitmodules
1454 dir1/untracked
1455 dir2/modified
1456 dir2/untracked
1d2f393a
JL
1457 untracked
1458
1459EOF
302ad7a9
JL
1460 git config --add -f .gitmodules submodule.subname.ignore all &&
1461 git config --add -f .gitmodules submodule.subname.path sm &&
1462 git status > output &&
1108cea7 1463 test_cmp expect output &&
302ad7a9
JL
1464 git config -f .gitmodules --remove-section submodule.subname
1465'
1466
1d2f393a 1467test_expect_success '.git/config ignore=all suppresses unstaged submodule summary' '
302ad7a9
JL
1468 git config --add -f .gitmodules submodule.subname.ignore none &&
1469 git config --add -f .gitmodules submodule.subname.path sm &&
aee9c7d6
JL
1470 git config --add submodule.subname.ignore all &&
1471 git config --add submodule.subname.path sm &&
1472 git status > output &&
1108cea7 1473 test_cmp expect output &&
302ad7a9
JL
1474 git config --remove-section submodule.subname &&
1475 git config -f .gitmodules --remove-section submodule.subname
aee9c7d6
JL
1476'
1477
4fb5166a
JJGG
1478test_expect_success 'setup of test environment' '
1479 git config status.showUntrackedFiles no &&
1480 git status -s >expected_short &&
1481 git status --no-short >expected_noshort
1482'
1483
1484test_expect_success '"status.short=true" same as "-s"' '
1485 git -c status.short=true status >actual &&
1486 test_cmp expected_short actual
1487'
1488
1489test_expect_success '"status.short=true" weaker than "--no-short"' '
1490 git -c status.short=true status --no-short >actual &&
1491 test_cmp expected_noshort actual
1492'
1493
1494test_expect_success '"status.short=false" same as "--no-short"' '
1495 git -c status.short=false status >actual &&
1496 test_cmp expected_noshort actual
1497'
1498
1499test_expect_success '"status.short=false" weaker than "-s"' '
1500 git -c status.short=false status -s >actual &&
1501 test_cmp expected_short actual
1502'
1503
ec85d070
JJGG
1504test_expect_success '"status.branch=true" same as "-b"' '
1505 git status -sb >expected_branch &&
1506 git -c status.branch=true status -s >actual &&
1507 test_cmp expected_branch actual
1508'
1509
1510test_expect_success '"status.branch=true" different from "--no-branch"' '
1511 git status -s --no-branch >expected_nobranch &&
1512 git -c status.branch=true status -s >actual &&
e8a5f07d 1513 ! test_cmp expected_nobranch actual
ec85d070
JJGG
1514'
1515
1516test_expect_success '"status.branch=true" weaker than "--no-branch"' '
1517 git -c status.branch=true status -s --no-branch >actual &&
1518 test_cmp expected_nobranch actual
1519'
1520
84b4202d 1521test_expect_success '"status.branch=true" weaker than "--porcelain"' '
a6171e14
JC
1522 git -c status.branch=true status --porcelain >actual &&
1523 test_cmp expected_nobranch actual
84b4202d
JH
1524'
1525
ec85d070
JJGG
1526test_expect_success '"status.branch=false" same as "--no-branch"' '
1527 git -c status.branch=false status -s >actual &&
1528 test_cmp expected_nobranch actual
1529'
1530
1531test_expect_success '"status.branch=false" weaker than "-b"' '
1532 git -c status.branch=false status -sb >actual &&
1533 test_cmp expected_branch actual
1534'
1535
4fb5166a
JJGG
1536test_expect_success 'Restore default test environment' '
1537 git config --unset status.showUntrackedFiles
1538'
1539
1d2f393a
JL
1540test_expect_success 'git commit will commit a staged but ignored submodule' '
1541 git config --add -f .gitmodules submodule.subname.ignore all &&
1542 git config --add -f .gitmodules submodule.subname.path sm &&
1543 git config --add submodule.subname.ignore all &&
1544 git status -s --ignore-submodules=dirty >output &&
6789275d 1545 test_grep "^M. sm" output &&
1d2f393a
JL
1546 GIT_EDITOR="echo hello >>\"\$1\"" &&
1547 export GIT_EDITOR &&
1548 git commit -uno &&
1549 git status -s --ignore-submodules=dirty >output &&
6789275d 1550 test_grep ! "^M. sm" output
1d2f393a
JL
1551'
1552
1553test_expect_success 'git commit --dry-run will show a staged but ignored submodule' '
1554 git reset HEAD^ &&
1555 git add sm &&
1556 cat >expect << EOF &&
1e2ae142 1557On branch main
75177c85
JK
1558Your branch and '\''upstream'\'' have diverged,
1559and have 2 and 2 different commits each, respectively.
75177c85 1560
1d2f393a 1561Changes to be committed:
80f537f7 1562 (use "git restore --staged <file>..." to unstage)
1d2f393a
JL
1563 modified: sm
1564
1565Changes not staged for commit:
1566 (use "git add <file>..." to update what will be committed)
80f537f7 1567 (use "git restore <file>..." to discard changes in working directory)
1d2f393a
JL
1568 modified: dir1/modified
1569
1570Untracked files not listed (use -u option to show untracked files)
1571EOF
1572 git commit -uno --dry-run >output &&
1108cea7 1573 test_cmp expect output &&
1d2f393a 1574 git status -s --ignore-submodules=dirty >output &&
6789275d 1575 test_grep "^M. sm" output
1d2f393a
JL
1576'
1577
c215d3d2 1578test_expect_success 'git commit -m will commit a staged but ignored submodule' '
1d2f393a
JL
1579 git commit -uno -m message &&
1580 git status -s --ignore-submodules=dirty >output &&
6789275d 1581 test_grep ! "^M. sm" output &&
1d2f393a
JL
1582 git config --remove-section submodule.subname &&
1583 git config -f .gitmodules --remove-section submodule.subname
1584'
1585
c1b5d019
LB
1586test_expect_success 'show stash info with "--show-stash"' '
1587 git reset --hard &&
1588 git stash clear &&
1589 echo 1 >file &&
1590 git add file &&
1591 git stash &&
1592 git status >expected_default &&
1593 git status --show-stash >expected_with_stash &&
6789275d 1594 test_grep "^Your stash currently has 1 entry$" expected_with_stash
c1b5d019
LB
1595'
1596
1597test_expect_success 'no stash info with "--show-stash --no-show-stash"' '
1598 git status --show-stash --no-show-stash >expected_without_stash &&
1599 test_cmp expected_default expected_without_stash
1600'
1601
1602test_expect_success '"status.showStash=false" weaker than "--show-stash"' '
1603 git -c status.showStash=false status --show-stash >actual &&
1604 test_cmp expected_with_stash actual
1605'
1606
1607test_expect_success '"status.showStash=true" weaker than "--no-show-stash"' '
1608 git -c status.showStash=true status --no-show-stash >actual &&
1609 test_cmp expected_without_stash actual
1610'
1611
4dc8b1c1 1612test_expect_success 'no additional info if no stash entries' '
c1b5d019
LB
1613 git stash clear &&
1614 git -c status.showStash=true status >actual &&
1615 test_cmp expected_without_stash actual
1616'
1617
4ddb1354
KS
1618test_expect_success '"No commits yet" should be noted in status output' '
1619 git checkout --orphan empty-branch-1 &&
1620 git status >output &&
6789275d 1621 test_grep "No commits yet" output
4ddb1354
KS
1622'
1623
1624test_expect_success '"No commits yet" should not be noted in status output' '
1625 git checkout --orphan empty-branch-2 &&
1626 test_commit test-commit-1 &&
1627 git status >output &&
6789275d 1628 test_grep ! "No commits yet" output
4ddb1354
KS
1629'
1630
1631test_expect_success '"Initial commit" should be noted in commit template' '
1632 git checkout --orphan empty-branch-3 &&
1633 touch to_be_committed_1 &&
1634 git add to_be_committed_1 &&
1635 git commit --dry-run >output &&
6789275d 1636 test_grep "Initial commit" output
4ddb1354
KS
1637'
1638
1639test_expect_success '"Initial commit" should not be noted in commit template' '
1640 git checkout --orphan empty-branch-4 &&
1641 test_commit test-commit-2 &&
1642 touch to_be_committed_2 &&
1643 git add to_be_committed_2 &&
1644 git commit --dry-run >output &&
6789275d 1645 test_grep ! "Initial commit" output
4ddb1354
KS
1646'
1647
27344d6a 1648test_expect_success '--no-optional-locks prevents index update' '
0275e4da 1649 test_set_magic_mtime .git/index &&
27344d6a 1650 git --no-optional-locks status &&
0275e4da 1651 test_is_magic_mtime .git/index &&
27344d6a 1652 git status &&
0275e4da 1653 ! test_is_magic_mtime .git/index
27344d6a
JK
1654'
1655
9b71efd0
MS
1656test_expect_success 'racy timestamps will be fixed for clean worktree' '
1657 echo content >racy-dirty &&
1658 echo content >racy-racy &&
1659 git add racy* &&
1660 git commit -m "racy test files" &&
1661 # let status rewrite the index, if necessary; after that we expect
1662 # no more index writes unless caused by racy timestamps; note that
1663 # timestamps may already be racy now (depending on previous tests)
1664 git status &&
1665 test_set_magic_mtime .git/index &&
1666 git status &&
1667 ! test_is_magic_mtime .git/index
1668'
1669
1670test_expect_success 'racy timestamps will be fixed for dirty worktree' '
1671 echo content2 >racy-dirty &&
1672 git status &&
1673 test_set_magic_mtime .git/index &&
1674 git status &&
1675 ! test_is_magic_mtime .git/index
1676'
1677
ecbc23e4
RR
1678test_expect_success 'setup slow status advice' '
1679 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main git init slowstatus &&
1680 (
1681 cd slowstatus &&
1682 cat >.gitignore <<-\EOF &&
1683 /actual
1684 /expected
1685 /out
1686 EOF
1687 git add .gitignore &&
1688 git commit -m "Add .gitignore" &&
1689 git config advice.statusuoption true
1690 )
1691'
1692
1693test_expect_success 'slow status advice when core.untrackedCache and fsmonitor are unset' '
1694 (
1695 cd slowstatus &&
1696 git config core.untrackedCache false &&
1697 git config core.fsmonitor false &&
1698 GIT_TEST_UF_DELAY_WARNING=1 git status >actual &&
1699 cat >expected <<-\EOF &&
1700 On branch main
1701
1702 It took 3.25 seconds to enumerate untracked files.
1703 See '\''git help status'\'' for information on how to improve this.
1704
1705 nothing to commit, working tree clean
1706 EOF
1707 test_cmp expected actual
1708 )
1709'
1710
1711test_expect_success 'slow status advice when core.untrackedCache true, but not fsmonitor' '
1712 (
1713 cd slowstatus &&
1714 git config core.untrackedCache true &&
1715 git config core.fsmonitor false &&
1716 GIT_TEST_UF_DELAY_WARNING=1 git status >actual &&
1717 cat >expected <<-\EOF &&
1718 On branch main
1719
1720 It took 3.25 seconds to enumerate untracked files.
1721 See '\''git help status'\'' for information on how to improve this.
1722
1723 nothing to commit, working tree clean
1724 EOF
1725 test_cmp expected actual
1726 )
1727'
1728
1729test_expect_success 'slow status advice when core.untrackedCache true, and fsmonitor' '
1730 (
1731 cd slowstatus &&
1732 git config core.untrackedCache true &&
1733 git config core.fsmonitor true &&
1734 GIT_TEST_UF_DELAY_WARNING=1 git status >actual &&
1735 cat >expected <<-\EOF &&
1736 On branch main
1737
1738 It took 3.25 seconds to enumerate untracked files,
1739 but the results were cached, and subsequent runs may be faster.
1740 See '\''git help status'\'' for information on how to improve this.
1741
1742 nothing to commit, working tree clean
1743 EOF
1744 test_cmp expected actual
1745 )
1746'
1747
5143ac07
JH
1748test_expect_success EXPENSIVE 'status does not re-read unchanged 4 or 8 GiB file' '
1749 (
1750 mkdir large-file &&
1751 cd large-file &&
1752 # Files are 2 GiB, 4 GiB, and 8 GiB sparse files.
1753 test-tool truncate file-a 0x080000000 &&
1754 test-tool truncate file-b 0x100000000 &&
1755 test-tool truncate file-c 0x200000000 &&
1756 # This will be slow.
1757 git add file-a file-b file-c &&
1758 git commit -m "add large files" &&
1759 git diff-index HEAD file-a file-b file-c >actual &&
1760 test_must_be_empty actual
1761 )
1762'
1763
367c9886 1764test_done