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