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