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