]> git.ipfire.org Git - thirdparty/git.git/blob - t/t7508-status.sh
git status --ignored: tests and docs
[thirdparty/git.git] / t / t7508-status.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Johannes E. Schindelin
4 #
5
6 test_description='git status'
7
8 . ./test-lib.sh
9
10 test_expect_success 'setup' '
11 : >tracked &&
12 : >modified &&
13 mkdir dir1 &&
14 : >dir1/tracked &&
15 : >dir1/modified &&
16 mkdir dir2 &&
17 : >dir1/tracked &&
18 : >dir1/modified &&
19 git add . &&
20
21 git status >output &&
22
23 test_tick &&
24 git commit -m initial &&
25 : >untracked &&
26 : >dir1/untracked &&
27 : >dir2/untracked &&
28 echo 1 >dir1/modified &&
29 echo 2 >dir2/modified &&
30 echo 3 >dir2/added &&
31 git add dir2/added
32 '
33
34 test_expect_success 'status (1)' '
35
36 grep "use \"git rm --cached <file>\.\.\.\" to unstage" output
37
38 '
39
40 cat >expect <<\EOF
41 # On branch master
42 # Changes to be committed:
43 # (use "git reset HEAD <file>..." to unstage)
44 #
45 # new file: dir2/added
46 #
47 # Changed but not updated:
48 # (use "git add <file>..." to update what will be committed)
49 # (use "git checkout -- <file>..." to discard changes in working directory)
50 #
51 # modified: dir1/modified
52 #
53 # Untracked files:
54 # (use "git add <file>..." to include in what will be committed)
55 #
56 # dir1/untracked
57 # dir2/modified
58 # dir2/untracked
59 # expect
60 # output
61 # untracked
62 EOF
63
64 test_expect_success 'status (2)' '
65
66 git status >output &&
67 test_cmp expect output
68
69 '
70
71 cat >expect <<\EOF
72 M dir1/modified
73 A dir2/added
74 ?? dir1/untracked
75 ?? dir2/modified
76 ?? dir2/untracked
77 ?? expect
78 ?? output
79 ?? untracked
80 EOF
81
82 test_expect_success 'status -s (2)' '
83
84 git status -s >output &&
85 test_cmp expect output
86
87 '
88
89 test_expect_success 'status with gitignore' '
90 {
91 echo ".gitignore" &&
92 echo "expect" &&
93 echo "output" &&
94 echo "untracked"
95 } >.gitignore &&
96
97 cat >expect <<-\EOF &&
98 M dir1/modified
99 A dir2/added
100 ?? dir2/modified
101 EOF
102 git status -s >output &&
103 test_cmp expect output &&
104
105 cat >expect <<-\EOF &&
106 M dir1/modified
107 A dir2/added
108 ?? dir2/modified
109 !! .gitignore
110 !! dir1/untracked
111 !! dir2/untracked
112 !! expect
113 !! output
114 !! untracked
115 EOF
116 git status -s --ignored >output &&
117 test_cmp expect output &&
118
119 cat >expect <<-\EOF &&
120 # On branch master
121 # Changes to be committed:
122 # (use "git reset HEAD <file>..." to unstage)
123 #
124 # new file: dir2/added
125 #
126 # Changed but not updated:
127 # (use "git add <file>..." to update what will be committed)
128 # (use "git checkout -- <file>..." to discard changes in working directory)
129 #
130 # modified: dir1/modified
131 #
132 # Untracked files:
133 # (use "git add <file>..." to include in what will be committed)
134 #
135 # dir2/modified
136 # Ignored files:
137 # (use "git add -f <file>..." to include in what will be committed)
138 #
139 # .gitignore
140 # dir1/untracked
141 # dir2/untracked
142 # expect
143 # output
144 # untracked
145 EOF
146 git status --ignored >output &&
147 test_cmp expect output
148 '
149
150 test_expect_success 'status with gitignore (nothing untracked)' '
151 {
152 echo ".gitignore" &&
153 echo "expect" &&
154 echo "dir2/modified" &&
155 echo "output" &&
156 echo "untracked"
157 } >.gitignore &&
158
159 cat >expect <<-\EOF &&
160 M dir1/modified
161 A dir2/added
162 EOF
163 git status -s >output &&
164 test_cmp expect output &&
165
166 cat >expect <<-\EOF &&
167 M dir1/modified
168 A dir2/added
169 !! .gitignore
170 !! dir1/untracked
171 !! dir2/modified
172 !! dir2/untracked
173 !! expect
174 !! output
175 !! untracked
176 EOF
177 git status -s --ignored >output &&
178 test_cmp expect output &&
179
180 cat >expect <<-\EOF &&
181 # On branch master
182 # Changes to be committed:
183 # (use "git reset HEAD <file>..." to unstage)
184 #
185 # new file: dir2/added
186 #
187 # Changed but not updated:
188 # (use "git add <file>..." to update what will be committed)
189 # (use "git checkout -- <file>..." to discard changes in working directory)
190 #
191 # modified: dir1/modified
192 #
193 # Ignored files:
194 # (use "git add -f <file>..." to include in what will be committed)
195 #
196 # .gitignore
197 # dir1/untracked
198 # dir2/modified
199 # dir2/untracked
200 # expect
201 # output
202 # untracked
203 EOF
204 git status --ignored >output &&
205 test_cmp expect output
206 '
207
208 rm -f .gitignore
209
210 cat >expect <<EOF
211 # On branch master
212 # Changes to be committed:
213 # (use "git reset HEAD <file>..." to unstage)
214 #
215 # new file: dir2/added
216 #
217 # Changed but not updated:
218 # (use "git add <file>..." to update what will be committed)
219 # (use "git checkout -- <file>..." to discard changes in working directory)
220 #
221 # modified: dir1/modified
222 #
223 # Untracked files not listed (use -u option to show untracked files)
224 EOF
225 test_expect_success 'status -uno' '
226 mkdir dir3 &&
227 : >dir3/untracked1 &&
228 : >dir3/untracked2 &&
229 git status -uno >output &&
230 test_cmp expect output
231 '
232
233 test_expect_success 'status (status.showUntrackedFiles no)' '
234 git config status.showuntrackedfiles no
235 git status >output &&
236 test_cmp expect output
237 '
238
239 cat >expect << EOF
240 M dir1/modified
241 A dir2/added
242 EOF
243 test_expect_success 'status -s -uno' '
244 git config --unset status.showuntrackedfiles
245 git status -s -uno >output &&
246 test_cmp expect output
247 '
248
249 test_expect_success 'status -s (status.showUntrackedFiles no)' '
250 git config status.showuntrackedfiles no
251 git status -s >output &&
252 test_cmp expect output
253 '
254
255 cat >expect <<EOF
256 # On branch master
257 # Changes to be committed:
258 # (use "git reset HEAD <file>..." to unstage)
259 #
260 # new file: dir2/added
261 #
262 # Changed but not updated:
263 # (use "git add <file>..." to update what will be committed)
264 # (use "git checkout -- <file>..." to discard changes in working directory)
265 #
266 # modified: dir1/modified
267 #
268 # Untracked files:
269 # (use "git add <file>..." to include in what will be committed)
270 #
271 # dir1/untracked
272 # dir2/modified
273 # dir2/untracked
274 # dir3/
275 # expect
276 # output
277 # untracked
278 EOF
279 test_expect_success 'status -unormal' '
280 git status -unormal >output &&
281 test_cmp expect output
282 '
283
284 test_expect_success 'status (status.showUntrackedFiles normal)' '
285 git config status.showuntrackedfiles normal
286 git status >output &&
287 test_cmp expect output
288 '
289
290 cat >expect <<EOF
291 M dir1/modified
292 A dir2/added
293 ?? dir1/untracked
294 ?? dir2/modified
295 ?? dir2/untracked
296 ?? dir3/
297 ?? expect
298 ?? output
299 ?? untracked
300 EOF
301 test_expect_success 'status -s -unormal' '
302 git config --unset status.showuntrackedfiles
303 git status -s -unormal >output &&
304 test_cmp expect output
305 '
306
307 test_expect_success 'status -s (status.showUntrackedFiles normal)' '
308 git config status.showuntrackedfiles normal
309 git status -s >output &&
310 test_cmp expect output
311 '
312
313 cat >expect <<EOF
314 # On branch master
315 # Changes to be committed:
316 # (use "git reset HEAD <file>..." to unstage)
317 #
318 # new file: dir2/added
319 #
320 # Changed but not updated:
321 # (use "git add <file>..." to update what will be committed)
322 # (use "git checkout -- <file>..." to discard changes in working directory)
323 #
324 # modified: dir1/modified
325 #
326 # Untracked files:
327 # (use "git add <file>..." to include in what will be committed)
328 #
329 # dir1/untracked
330 # dir2/modified
331 # dir2/untracked
332 # dir3/untracked1
333 # dir3/untracked2
334 # expect
335 # output
336 # untracked
337 EOF
338 test_expect_success 'status -uall' '
339 git status -uall >output &&
340 test_cmp expect output
341 '
342 test_expect_success 'status (status.showUntrackedFiles all)' '
343 git config status.showuntrackedfiles all
344 git status >output &&
345 rm -rf dir3 &&
346 git config --unset status.showuntrackedfiles &&
347 test_cmp expect output
348 '
349
350 cat >expect <<EOF
351 M dir1/modified
352 A dir2/added
353 ?? dir1/untracked
354 ?? dir2/modified
355 ?? dir2/untracked
356 ?? expect
357 ?? output
358 ?? untracked
359 EOF
360 test_expect_success 'status -s -uall' '
361 git config --unset status.showuntrackedfiles
362 git status -s -uall >output &&
363 test_cmp expect output
364 '
365 test_expect_success 'status -s (status.showUntrackedFiles all)' '
366 git config status.showuntrackedfiles all
367 git status -s >output &&
368 rm -rf dir3 &&
369 git config --unset status.showuntrackedfiles &&
370 test_cmp expect output
371 '
372
373 cat >expect <<\EOF
374 # On branch master
375 # Changes to be committed:
376 # (use "git reset HEAD <file>..." to unstage)
377 #
378 # new file: ../dir2/added
379 #
380 # Changed but not updated:
381 # (use "git add <file>..." to update what will be committed)
382 # (use "git checkout -- <file>..." to discard changes in working directory)
383 #
384 # modified: modified
385 #
386 # Untracked files:
387 # (use "git add <file>..." to include in what will be committed)
388 #
389 # untracked
390 # ../dir2/modified
391 # ../dir2/untracked
392 # ../expect
393 # ../output
394 # ../untracked
395 EOF
396
397 test_expect_success 'status with relative paths' '
398
399 (cd dir1 && git status) >output &&
400 test_cmp expect output
401
402 '
403
404 cat >expect <<\EOF
405 M modified
406 A ../dir2/added
407 ?? untracked
408 ?? ../dir2/modified
409 ?? ../dir2/untracked
410 ?? ../expect
411 ?? ../output
412 ?? ../untracked
413 EOF
414 test_expect_success 'status -s with relative paths' '
415
416 (cd dir1 && git status -s) >output &&
417 test_cmp expect output
418
419 '
420
421 cat >expect <<\EOF
422 M dir1/modified
423 A dir2/added
424 ?? dir1/untracked
425 ?? dir2/modified
426 ?? dir2/untracked
427 ?? expect
428 ?? output
429 ?? untracked
430 EOF
431
432 test_expect_success 'status --porcelain ignores relative paths setting' '
433
434 (cd dir1 && git status --porcelain) >output &&
435 test_cmp expect output
436
437 '
438
439 test_expect_success 'setup unique colors' '
440
441 git config status.color.untracked blue
442
443 '
444
445 cat >expect <<\EOF
446 # On branch master
447 # Changes to be committed:
448 # (use "git reset HEAD <file>..." to unstage)
449 #
450 # <GREEN>new file: dir2/added<RESET>
451 #
452 # Changed but not updated:
453 # (use "git add <file>..." to update what will be committed)
454 # (use "git checkout -- <file>..." to discard changes in working directory)
455 #
456 # <RED>modified: dir1/modified<RESET>
457 #
458 # Untracked files:
459 # (use "git add <file>..." to include in what will be committed)
460 #
461 # <BLUE>dir1/untracked<RESET>
462 # <BLUE>dir2/modified<RESET>
463 # <BLUE>dir2/untracked<RESET>
464 # <BLUE>expect<RESET>
465 # <BLUE>output<RESET>
466 # <BLUE>untracked<RESET>
467 EOF
468
469 test_expect_success 'status with color.ui' '
470
471 git config color.ui always &&
472 git status | test_decode_color >output &&
473 test_cmp expect output
474
475 '
476
477 test_expect_success 'status with color.status' '
478
479 git config --unset color.ui &&
480 git config color.status always &&
481 git status | test_decode_color >output &&
482 test_cmp expect output
483
484 '
485
486 cat >expect <<\EOF
487 <RED>M<RESET> dir1/modified
488 <GREEN>A<RESET> dir2/added
489 <BLUE>??<RESET> dir1/untracked
490 <BLUE>??<RESET> dir2/modified
491 <BLUE>??<RESET> dir2/untracked
492 <BLUE>??<RESET> expect
493 <BLUE>??<RESET> output
494 <BLUE>??<RESET> untracked
495 EOF
496
497 test_expect_success 'status -s with color.ui' '
498
499 git config --unset color.status &&
500 git config color.ui always &&
501 git status -s | test_decode_color >output &&
502 test_cmp expect output
503
504 '
505
506 test_expect_success 'status -s with color.status' '
507
508 git config --unset color.ui &&
509 git config color.status always &&
510 git status -s | test_decode_color >output &&
511 test_cmp expect output
512
513 '
514
515 cat >expect <<\EOF
516 M dir1/modified
517 A dir2/added
518 ?? dir1/untracked
519 ?? dir2/modified
520 ?? dir2/untracked
521 ?? expect
522 ?? output
523 ?? untracked
524 EOF
525
526 test_expect_success 'status --porcelain ignores color.ui' '
527
528 git config --unset color.status &&
529 git config color.ui always &&
530 git status --porcelain | test_decode_color >output &&
531 test_cmp expect output
532
533 '
534
535 test_expect_success 'status --porcelain ignores color.status' '
536
537 git config --unset color.ui &&
538 git config color.status always &&
539 git status --porcelain | test_decode_color >output &&
540 test_cmp expect output
541
542 '
543
544 # recover unconditionally from color tests
545 git config --unset color.status
546 git config --unset color.ui
547
548 cat >expect <<\EOF
549 # On branch master
550 # Changes to be committed:
551 # (use "git reset HEAD <file>..." to unstage)
552 #
553 # new file: dir2/added
554 #
555 # Changed but not updated:
556 # (use "git add <file>..." to update what will be committed)
557 # (use "git checkout -- <file>..." to discard changes in working directory)
558 #
559 # modified: dir1/modified
560 #
561 # Untracked files:
562 # (use "git add <file>..." to include in what will be committed)
563 #
564 # dir1/untracked
565 # dir2/modified
566 # dir2/untracked
567 # expect
568 # output
569 # untracked
570 EOF
571
572
573 test_expect_success 'status without relative paths' '
574
575 git config status.relativePaths false
576 (cd dir1 && git status) >output &&
577 test_cmp expect output
578
579 '
580
581 cat >expect <<\EOF
582 M dir1/modified
583 A dir2/added
584 ?? dir1/untracked
585 ?? dir2/modified
586 ?? dir2/untracked
587 ?? expect
588 ?? output
589 ?? untracked
590 EOF
591
592 test_expect_success 'status -s without relative paths' '
593
594 (cd dir1 && git status -s) >output &&
595 test_cmp expect output
596
597 '
598
599 cat <<EOF >expect
600 # On branch master
601 # Changes to be committed:
602 # (use "git reset HEAD <file>..." to unstage)
603 #
604 # modified: dir1/modified
605 #
606 # Untracked files:
607 # (use "git add <file>..." to include in what will be committed)
608 #
609 # dir1/untracked
610 # dir2/
611 # expect
612 # output
613 # untracked
614 EOF
615 test_expect_success 'dry-run of partial commit excluding new file in index' '
616 git commit --dry-run dir1/modified >output &&
617 test_cmp expect output
618 '
619
620 test_expect_success 'setup status submodule summary' '
621 test_create_repo sm && (
622 cd sm &&
623 >foo &&
624 git add foo &&
625 git commit -m "Add foo"
626 ) &&
627 git add sm
628 '
629
630 cat >expect <<EOF
631 # On branch master
632 # Changes to be committed:
633 # (use "git reset HEAD <file>..." to unstage)
634 #
635 # new file: dir2/added
636 # new file: sm
637 #
638 # Changed but not updated:
639 # (use "git add <file>..." to update what will be committed)
640 # (use "git checkout -- <file>..." to discard changes in working directory)
641 #
642 # modified: dir1/modified
643 #
644 # Untracked files:
645 # (use "git add <file>..." to include in what will be committed)
646 #
647 # dir1/untracked
648 # dir2/modified
649 # dir2/untracked
650 # expect
651 # output
652 # untracked
653 EOF
654 test_expect_success 'status submodule summary is disabled by default' '
655 git status >output &&
656 test_cmp expect output
657 '
658
659 # we expect the same as the previous test
660 test_expect_success 'status --untracked-files=all does not show submodule' '
661 git status --untracked-files=all >output &&
662 test_cmp expect output
663 '
664
665 cat >expect <<EOF
666 M dir1/modified
667 A dir2/added
668 A sm
669 ?? dir1/untracked
670 ?? dir2/modified
671 ?? dir2/untracked
672 ?? expect
673 ?? output
674 ?? untracked
675 EOF
676 test_expect_success 'status -s submodule summary is disabled by default' '
677 git status -s >output &&
678 test_cmp expect output
679 '
680
681 # we expect the same as the previous test
682 test_expect_success 'status -s --untracked-files=all does not show submodule' '
683 git status -s --untracked-files=all >output &&
684 test_cmp expect output
685 '
686
687 head=$(cd sm && git rev-parse --short=7 --verify HEAD)
688
689 cat >expect <<EOF
690 # On branch master
691 # Changes to be committed:
692 # (use "git reset HEAD <file>..." to unstage)
693 #
694 # new file: dir2/added
695 # new file: sm
696 #
697 # Changed but not updated:
698 # (use "git add <file>..." to update what will be committed)
699 # (use "git checkout -- <file>..." to discard changes in working directory)
700 #
701 # modified: dir1/modified
702 #
703 # Submodule changes to be committed:
704 #
705 # * sm 0000000...$head (1):
706 # > Add foo
707 #
708 # Untracked files:
709 # (use "git add <file>..." to include in what will be committed)
710 #
711 # dir1/untracked
712 # dir2/modified
713 # dir2/untracked
714 # expect
715 # output
716 # untracked
717 EOF
718 test_expect_success 'status submodule summary' '
719 git config status.submodulesummary 10 &&
720 git status >output &&
721 test_cmp expect output
722 '
723
724 cat >expect <<EOF
725 M dir1/modified
726 A dir2/added
727 A sm
728 ?? dir1/untracked
729 ?? dir2/modified
730 ?? dir2/untracked
731 ?? expect
732 ?? output
733 ?? untracked
734 EOF
735 test_expect_success 'status -s submodule summary' '
736 git status -s >output &&
737 test_cmp expect output
738 '
739
740 cat >expect <<EOF
741 # On branch master
742 # Changed but not updated:
743 # (use "git add <file>..." to update what will be committed)
744 # (use "git checkout -- <file>..." to discard changes in working directory)
745 #
746 # modified: dir1/modified
747 #
748 # Untracked files:
749 # (use "git add <file>..." to include in what will be committed)
750 #
751 # dir1/untracked
752 # dir2/modified
753 # dir2/untracked
754 # expect
755 # output
756 # untracked
757 no changes added to commit (use "git add" and/or "git commit -a")
758 EOF
759 test_expect_success 'status submodule summary (clean submodule)' '
760 git commit -m "commit submodule" &&
761 git config status.submodulesummary 10 &&
762 test_must_fail git commit --dry-run >output &&
763 test_cmp expect output &&
764 git status >output &&
765 test_cmp expect output
766 '
767
768 cat >expect <<EOF
769 M dir1/modified
770 ?? dir1/untracked
771 ?? dir2/modified
772 ?? dir2/untracked
773 ?? expect
774 ?? output
775 ?? untracked
776 EOF
777 test_expect_success 'status -s submodule summary (clean submodule)' '
778 git status -s >output &&
779 test_cmp expect output
780 '
781
782 cat >expect <<EOF
783 # On branch master
784 # Changes to be committed:
785 # (use "git reset HEAD^1 <file>..." to unstage)
786 #
787 # new file: dir2/added
788 # new file: sm
789 #
790 # Changed but not updated:
791 # (use "git add <file>..." to update what will be committed)
792 # (use "git checkout -- <file>..." to discard changes in working directory)
793 #
794 # modified: dir1/modified
795 #
796 # Submodule changes to be committed:
797 #
798 # * sm 0000000...$head (1):
799 # > Add foo
800 #
801 # Untracked files:
802 # (use "git add <file>..." to include in what will be committed)
803 #
804 # dir1/untracked
805 # dir2/modified
806 # dir2/untracked
807 # expect
808 # output
809 # untracked
810 EOF
811 test_expect_success 'commit --dry-run submodule summary (--amend)' '
812 git config status.submodulesummary 10 &&
813 git commit --dry-run --amend >output &&
814 test_cmp expect output
815 '
816
817 test_done