cf67fe3a4a07181640e2c5074e6b86188efe1e74
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Johannes E. Schindelin
4 #
6 test_description='git status'
8 . ./test-lib.sh
10 test_expect_success 'setup' '
11 : >tracked &&
12 : >modified &&
13 mkdir dir1 &&
14 : >dir1/tracked &&
15 : >dir1/modified &&
16 mkdir dir2 &&
17 : >dir1/tracked &&
18 : >dir1/modified &&
19 git add . &&
21 git status >output &&
23 test_tick &&
24 git commit -m initial &&
25 : >untracked &&
26 : >dir1/untracked &&
27 : >dir2/untracked &&
28 echo 1 >dir1/modified &&
29 echo 2 >dir2/modified &&
30 echo 3 >dir2/added &&
31 git add dir2/added
32 '
34 test_expect_success 'status (1)' '
36 grep "use \"git rm --cached <file>\.\.\.\" to unstage" output
38 '
40 cat >expect <<\EOF
41 # On branch master
42 # Changes to be committed:
43 # (use "git reset HEAD <file>..." to unstage)
44 #
45 # new file: dir2/added
46 #
47 # Changed but not updated:
48 # (use "git add <file>..." to update what will be committed)
49 # (use "git checkout -- <file>..." to discard changes in working directory)
50 #
51 # modified: dir1/modified
52 #
53 # Untracked files:
54 # (use "git add <file>..." to include in what will be committed)
55 #
56 # dir1/untracked
57 # dir2/modified
58 # dir2/untracked
59 # expect
60 # output
61 # untracked
62 EOF
64 test_expect_success 'status (2)' '
66 git status >output &&
67 test_cmp expect output
69 '
71 cat >expect <<\EOF
72 M dir1/modified
73 A dir2/added
74 ?? dir1/untracked
75 ?? dir2/modified
76 ?? dir2/untracked
77 ?? expect
78 ?? output
79 ?? untracked
80 EOF
82 test_expect_success 'status -s (2)' '
84 git status -s >output &&
85 test_cmp expect output
87 '
89 cat >expect <<EOF
90 # On branch master
91 # Changes to be committed:
92 # (use "git reset HEAD <file>..." to unstage)
93 #
94 # new file: dir2/added
95 #
96 # Changed but not updated:
97 # (use "git add <file>..." to update what will be committed)
98 # (use "git checkout -- <file>..." to discard changes in working directory)
99 #
100 # modified: dir1/modified
101 #
102 # Untracked files not listed (use -u option to show untracked files)
103 EOF
104 test_expect_success 'status -uno' '
105 mkdir dir3 &&
106 : >dir3/untracked1 &&
107 : >dir3/untracked2 &&
108 git status -uno >output &&
109 test_cmp expect output
110 '
112 test_expect_success 'status (status.showUntrackedFiles no)' '
113 git config status.showuntrackedfiles no
114 git status >output &&
115 test_cmp expect output
116 '
118 cat >expect << EOF
119 M dir1/modified
120 A dir2/added
121 EOF
122 test_expect_success 'status -s -uno' '
123 git config --unset status.showuntrackedfiles
124 git status -s -uno >output &&
125 test_cmp expect output
126 '
128 test_expect_success 'status -s (status.showUntrackedFiles no)' '
129 git config status.showuntrackedfiles no
130 git status -s >output &&
131 test_cmp expect output
132 '
134 cat >expect <<EOF
135 # On branch master
136 # Changes to be committed:
137 # (use "git reset HEAD <file>..." to unstage)
138 #
139 # new file: dir2/added
140 #
141 # Changed but not updated:
142 # (use "git add <file>..." to update what will be committed)
143 # (use "git checkout -- <file>..." to discard changes in working directory)
144 #
145 # modified: dir1/modified
146 #
147 # Untracked files:
148 # (use "git add <file>..." to include in what will be committed)
149 #
150 # dir1/untracked
151 # dir2/modified
152 # dir2/untracked
153 # dir3/
154 # expect
155 # output
156 # untracked
157 EOF
158 test_expect_success 'status -unormal' '
159 git status -unormal >output &&
160 test_cmp expect output
161 '
163 test_expect_success 'status (status.showUntrackedFiles normal)' '
164 git config status.showuntrackedfiles normal
165 git status >output &&
166 test_cmp expect output
167 '
169 cat >expect <<EOF
170 M dir1/modified
171 A dir2/added
172 ?? dir1/untracked
173 ?? dir2/modified
174 ?? dir2/untracked
175 ?? dir3/
176 ?? expect
177 ?? output
178 ?? untracked
179 EOF
180 test_expect_success 'status -s -unormal' '
181 git config --unset status.showuntrackedfiles
182 git status -s -unormal >output &&
183 test_cmp expect output
184 '
186 test_expect_success 'status -s (status.showUntrackedFiles normal)' '
187 git config status.showuntrackedfiles normal
188 git status -s >output &&
189 test_cmp expect output
190 '
192 cat >expect <<EOF
193 # On branch master
194 # Changes to be committed:
195 # (use "git reset HEAD <file>..." to unstage)
196 #
197 # new file: dir2/added
198 #
199 # Changed but not updated:
200 # (use "git add <file>..." to update what will be committed)
201 # (use "git checkout -- <file>..." to discard changes in working directory)
202 #
203 # modified: dir1/modified
204 #
205 # Untracked files:
206 # (use "git add <file>..." to include in what will be committed)
207 #
208 # dir1/untracked
209 # dir2/modified
210 # dir2/untracked
211 # dir3/untracked1
212 # dir3/untracked2
213 # expect
214 # output
215 # untracked
216 EOF
217 test_expect_success 'status -uall' '
218 git status -uall >output &&
219 test_cmp expect output
220 '
221 test_expect_success 'status (status.showUntrackedFiles all)' '
222 git config status.showuntrackedfiles all
223 git status >output &&
224 rm -rf dir3 &&
225 git config --unset status.showuntrackedfiles &&
226 test_cmp expect output
227 '
229 cat >expect <<EOF
230 M dir1/modified
231 A dir2/added
232 ?? dir1/untracked
233 ?? dir2/modified
234 ?? dir2/untracked
235 ?? expect
236 ?? output
237 ?? untracked
238 EOF
239 test_expect_success 'status -s -uall' '
240 git config --unset status.showuntrackedfiles
241 git status -s -uall >output &&
242 test_cmp expect output
243 '
244 test_expect_success 'status -s (status.showUntrackedFiles all)' '
245 git config status.showuntrackedfiles all
246 git status -s >output &&
247 rm -rf dir3 &&
248 git config --unset status.showuntrackedfiles &&
249 test_cmp expect output
250 '
252 cat >expect <<\EOF
253 # On branch master
254 # Changes to be committed:
255 # (use "git reset HEAD <file>..." to unstage)
256 #
257 # new file: ../dir2/added
258 #
259 # Changed but not updated:
260 # (use "git add <file>..." to update what will be committed)
261 # (use "git checkout -- <file>..." to discard changes in working directory)
262 #
263 # modified: modified
264 #
265 # Untracked files:
266 # (use "git add <file>..." to include in what will be committed)
267 #
268 # untracked
269 # ../dir2/modified
270 # ../dir2/untracked
271 # ../expect
272 # ../output
273 # ../untracked
274 EOF
276 test_expect_success 'status with relative paths' '
278 (cd dir1 && git status) >output &&
279 test_cmp expect output
281 '
283 cat >expect <<\EOF
284 M modified
285 A ../dir2/added
286 ?? untracked
287 ?? ../dir2/modified
288 ?? ../dir2/untracked
289 ?? ../expect
290 ?? ../output
291 ?? ../untracked
292 EOF
293 test_expect_success 'status -s with relative paths' '
295 (cd dir1 && git status -s) >output &&
296 test_cmp expect output
298 '
300 cat >expect <<\EOF
301 M dir1/modified
302 A dir2/added
303 ?? dir1/untracked
304 ?? dir2/modified
305 ?? dir2/untracked
306 ?? expect
307 ?? output
308 ?? untracked
309 EOF
311 test_expect_success 'status --porcelain ignores relative paths setting' '
313 (cd dir1 && git status --porcelain) >output &&
314 test_cmp expect output
316 '
318 test_expect_success 'setup unique colors' '
320 git config status.color.untracked blue
322 '
324 cat >expect <<\EOF
325 # On branch master
326 # Changes to be committed:
327 # (use "git reset HEAD <file>..." to unstage)
328 #
329 # <GREEN>new file: dir2/added<RESET>
330 #
331 # Changed but not updated:
332 # (use "git add <file>..." to update what will be committed)
333 # (use "git checkout -- <file>..." to discard changes in working directory)
334 #
335 # <RED>modified: dir1/modified<RESET>
336 #
337 # Untracked files:
338 # (use "git add <file>..." to include in what will be committed)
339 #
340 # <BLUE>dir1/untracked<RESET>
341 # <BLUE>dir2/modified<RESET>
342 # <BLUE>dir2/untracked<RESET>
343 # <BLUE>expect<RESET>
344 # <BLUE>output<RESET>
345 # <BLUE>untracked<RESET>
346 EOF
348 test_expect_success 'status with color.ui' '
350 git config color.ui always &&
351 git status | test_decode_color >output &&
352 test_cmp expect output
354 '
356 test_expect_success 'status with color.status' '
358 git config --unset color.ui &&
359 git config color.status always &&
360 git status | test_decode_color >output &&
361 test_cmp expect output
363 '
365 cat >expect <<\EOF
366 <RED>M<RESET> dir1/modified
367 <GREEN>A<RESET> dir2/added
368 <BLUE>??<RESET> dir1/untracked
369 <BLUE>??<RESET> dir2/modified
370 <BLUE>??<RESET> dir2/untracked
371 <BLUE>??<RESET> expect
372 <BLUE>??<RESET> output
373 <BLUE>??<RESET> untracked
374 EOF
376 test_expect_success 'status -s with color.ui' '
378 git config --unset color.status &&
379 git config color.ui always &&
380 git status -s | test_decode_color >output &&
381 test_cmp expect output
383 '
385 test_expect_success 'status -s with color.status' '
387 git config --unset color.ui &&
388 git config color.status always &&
389 git status -s | test_decode_color >output &&
390 test_cmp expect output
392 '
394 cat >expect <<\EOF
395 M dir1/modified
396 A dir2/added
397 ?? dir1/untracked
398 ?? dir2/modified
399 ?? dir2/untracked
400 ?? expect
401 ?? output
402 ?? untracked
403 EOF
405 test_expect_success 'status --porcelain ignores color.ui' '
407 git config --unset color.status &&
408 git config color.ui always &&
409 git status --porcelain | test_decode_color >output &&
410 test_cmp expect output
412 '
414 test_expect_success 'status --porcelain ignores color.status' '
416 git config --unset color.ui &&
417 git config color.status always &&
418 git status --porcelain | test_decode_color >output &&
419 test_cmp expect output
421 '
423 # recover unconditionally from color tests
424 git config --unset color.status
425 git config --unset color.ui
427 cat >expect <<\EOF
428 # On branch master
429 # Changes to be committed:
430 # (use "git reset HEAD <file>..." to unstage)
431 #
432 # new file: dir2/added
433 #
434 # Changed but not updated:
435 # (use "git add <file>..." to update what will be committed)
436 # (use "git checkout -- <file>..." to discard changes in working directory)
437 #
438 # modified: dir1/modified
439 #
440 # Untracked files:
441 # (use "git add <file>..." to include in what will be committed)
442 #
443 # dir1/untracked
444 # dir2/modified
445 # dir2/untracked
446 # expect
447 # output
448 # untracked
449 EOF
452 test_expect_success 'status without relative paths' '
454 git config status.relativePaths false
455 (cd dir1 && git status) >output &&
456 test_cmp expect output
458 '
460 cat >expect <<\EOF
461 M dir1/modified
462 A dir2/added
463 ?? dir1/untracked
464 ?? dir2/modified
465 ?? dir2/untracked
466 ?? expect
467 ?? output
468 ?? untracked
469 EOF
471 test_expect_success 'status -s without relative paths' '
473 (cd dir1 && git status -s) >output &&
474 test_cmp expect output
476 '
478 cat <<EOF >expect
479 # On branch master
480 # Changes to be committed:
481 # (use "git reset HEAD <file>..." to unstage)
482 #
483 # modified: dir1/modified
484 #
485 # Untracked files:
486 # (use "git add <file>..." to include in what will be committed)
487 #
488 # dir1/untracked
489 # dir2/
490 # expect
491 # output
492 # untracked
493 EOF
494 test_expect_success 'dry-run of partial commit excluding new file in index' '
495 git commit --dry-run dir1/modified >output &&
496 test_cmp expect output
497 '
499 test_expect_success 'setup status submodule summary' '
500 test_create_repo sm && (
501 cd sm &&
502 >foo &&
503 git add foo &&
504 git commit -m "Add foo"
505 ) &&
506 git add sm
507 '
509 cat >expect <<EOF
510 # On branch master
511 # Changes to be committed:
512 # (use "git reset HEAD <file>..." to unstage)
513 #
514 # new file: dir2/added
515 # new file: sm
516 #
517 # Changed but not updated:
518 # (use "git add <file>..." to update what will be committed)
519 # (use "git checkout -- <file>..." to discard changes in working directory)
520 #
521 # modified: dir1/modified
522 #
523 # Untracked files:
524 # (use "git add <file>..." to include in what will be committed)
525 #
526 # dir1/untracked
527 # dir2/modified
528 # dir2/untracked
529 # expect
530 # output
531 # untracked
532 EOF
533 test_expect_success 'status submodule summary is disabled by default' '
534 git status >output &&
535 test_cmp expect output
536 '
538 # we expect the same as the previous test
539 test_expect_success 'status --untracked-files=all does not show submodule' '
540 git status --untracked-files=all >output &&
541 test_cmp expect output
542 '
544 cat >expect <<EOF
545 M dir1/modified
546 A dir2/added
547 A sm
548 ?? dir1/untracked
549 ?? dir2/modified
550 ?? dir2/untracked
551 ?? expect
552 ?? output
553 ?? untracked
554 EOF
555 test_expect_success 'status -s submodule summary is disabled by default' '
556 git status -s >output &&
557 test_cmp expect output
558 '
560 # we expect the same as the previous test
561 test_expect_success 'status -s --untracked-files=all does not show submodule' '
562 git status -s --untracked-files=all >output &&
563 test_cmp expect output
564 '
566 head=$(cd sm && git rev-parse --short=7 --verify HEAD)
568 cat >expect <<EOF
569 # On branch master
570 # Changes to be committed:
571 # (use "git reset HEAD <file>..." to unstage)
572 #
573 # new file: dir2/added
574 # new file: sm
575 #
576 # Changed but not updated:
577 # (use "git add <file>..." to update what will be committed)
578 # (use "git checkout -- <file>..." to discard changes in working directory)
579 #
580 # modified: dir1/modified
581 #
582 # Modified submodules:
583 #
584 # * sm 0000000...$head (1):
585 # > Add foo
586 #
587 # Untracked files:
588 # (use "git add <file>..." to include in what will be committed)
589 #
590 # dir1/untracked
591 # dir2/modified
592 # dir2/untracked
593 # expect
594 # output
595 # untracked
596 EOF
597 test_expect_success 'status submodule summary' '
598 git config status.submodulesummary 10 &&
599 git status >output &&
600 test_cmp expect output
601 '
603 cat >expect <<EOF
604 M dir1/modified
605 A dir2/added
606 A sm
607 ?? dir1/untracked
608 ?? dir2/modified
609 ?? dir2/untracked
610 ?? expect
611 ?? output
612 ?? untracked
613 EOF
614 test_expect_success 'status -s submodule summary' '
615 git status -s >output &&
616 test_cmp expect output
617 '
619 cat >expect <<EOF
620 # On branch master
621 # Changed but not updated:
622 # (use "git add <file>..." to update what will be committed)
623 # (use "git checkout -- <file>..." to discard changes in working directory)
624 #
625 # modified: dir1/modified
626 #
627 # Untracked files:
628 # (use "git add <file>..." to include in what will be committed)
629 #
630 # dir1/untracked
631 # dir2/modified
632 # dir2/untracked
633 # expect
634 # output
635 # untracked
636 no changes added to commit (use "git add" and/or "git commit -a")
637 EOF
638 test_expect_success 'status submodule summary (clean submodule)' '
639 git commit -m "commit submodule" &&
640 git config status.submodulesummary 10 &&
641 test_must_fail git commit --dry-run >output &&
642 test_cmp expect output &&
643 git status >output &&
644 test_cmp expect output
645 '
647 cat >expect <<EOF
648 M dir1/modified
649 ?? dir1/untracked
650 ?? dir2/modified
651 ?? dir2/untracked
652 ?? expect
653 ?? output
654 ?? untracked
655 EOF
656 test_expect_success 'status -s submodule summary (clean submodule)' '
657 git status -s >output &&
658 test_cmp expect output
659 '
661 cat >expect <<EOF
662 # On branch master
663 # Changes to be committed:
664 # (use "git reset HEAD^1 <file>..." to unstage)
665 #
666 # new file: dir2/added
667 # new file: sm
668 #
669 # Changed but not updated:
670 # (use "git add <file>..." to update what will be committed)
671 # (use "git checkout -- <file>..." to discard changes in working directory)
672 #
673 # modified: dir1/modified
674 #
675 # Modified submodules:
676 #
677 # * sm 0000000...$head (1):
678 # > Add foo
679 #
680 # Untracked files:
681 # (use "git add <file>..." to include in what will be committed)
682 #
683 # dir1/untracked
684 # dir2/modified
685 # dir2/untracked
686 # expect
687 # output
688 # untracked
689 EOF
690 test_expect_success 'commit --dry-run submodule summary (--amend)' '
691 git config status.submodulesummary 10 &&
692 git commit --dry-run --amend >output &&
693 test_cmp expect output
694 '
696 test_done