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