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 M dir1/modified
73A dir2/added
74?? dir1/untracked
75?? dir2/modified
76?? dir2/untracked
77?? expect
78?? output
79?? untracked
80EOF
81
82test_expect_success 'status -s (2)' '
83
84 git status -s >output &&
85 test_cmp expect output
86
87'
88
89cat >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)
103EOF
104test_expect_success 'status -uno' '
105 mkdir dir3 &&
106 : >dir3/untracked1 &&
107 : >dir3/untracked2 &&
108 git status -uno >output &&
109 test_cmp expect output
110'
111
112test_expect_success 'status (status.showUntrackedFiles no)' '
113 git config status.showuntrackedfiles no
114 git status >output &&
115 test_cmp expect output
116'
117
118cat >expect << EOF
119 M dir1/modified
120A dir2/added
121EOF
122test_expect_success 'status -s -uno' '
123 git config --unset status.showuntrackedfiles
124 git status -s -uno >output &&
125 test_cmp expect output
126'
127
128test_expect_success 'status -s (status.showUntrackedFiles no)' '
129 git config status.showuntrackedfiles no
130 git status -s >output &&
131 test_cmp expect output
132'
133
134cat >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
157EOF
158test_expect_success 'status -unormal' '
159 git status -unormal >output &&
160 test_cmp expect output
161'
162
163test_expect_success 'status (status.showUntrackedFiles normal)' '
164 git config status.showuntrackedfiles normal
165 git status >output &&
166 test_cmp expect output
167'
168
169cat >expect <<EOF
170 M dir1/modified
171A dir2/added
172?? dir1/untracked
173?? dir2/modified
174?? dir2/untracked
175?? dir3/
176?? expect
177?? output
178?? untracked
179EOF
180test_expect_success 'status -s -unormal' '
181 git config --unset status.showuntrackedfiles
182 git status -s -unormal >output &&
183 test_cmp expect output
184'
185
186test_expect_success 'status -s (status.showUntrackedFiles normal)' '
187 git config status.showuntrackedfiles normal
188 git status -s >output &&
189 test_cmp expect output
190'
191
192cat >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
216EOF
217test_expect_success 'status -uall' '
218 git status -uall >output &&
219 test_cmp expect output
220'
221test_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'
228
229cat >expect <<EOF
230 M dir1/modified
231A dir2/added
232?? dir1/untracked
233?? dir2/modified
234?? dir2/untracked
235?? expect
236?? output
237?? untracked
238EOF
239test_expect_success 'status -s -uall' '
240 git config --unset status.showuntrackedfiles
241 git status -s -uall >output &&
242 test_cmp expect output
243'
244test_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'
251
252cat >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
274EOF
275
276test_expect_success 'status with relative paths' '
277
278 (cd dir1 && git status) >output &&
279 test_cmp expect output
280
281'
282
283cat >expect <<\EOF
284 M modified
285A ../dir2/added
286?? untracked
287?? ../dir2/modified
288?? ../dir2/untracked
289?? ../expect
290?? ../output
291?? ../untracked
292EOF
293test_expect_success 'status -s with relative paths' '
294
295 (cd dir1 && git status -s) >output &&
296 test_cmp expect output
297
298'
299
300cat >expect <<\EOF
301 M dir1/modified
302A dir2/added
303?? dir1/untracked
304?? dir2/modified
305?? dir2/untracked
306?? expect
307?? output
308?? untracked
309EOF
310
311test_expect_success 'status --porcelain ignores relative paths setting' '
312
313 (cd dir1 && git status --porcelain) >output &&
314 test_cmp expect output
315
316'
317
318test_expect_success 'setup unique colors' '
319
320 git config status.color.untracked blue
321
322'
323
324cat >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>
346EOF
347
348test_expect_success 'status with color.ui' '
349
350 git config color.ui always &&
351 git status | test_decode_color >output &&
352 test_cmp expect output
353
354'
355
356test_expect_success 'status with color.status' '
357
358 git config --unset color.ui &&
359 git config color.status always &&
360 git status | test_decode_color >output &&
361 test_cmp expect output
362
363'
364
365cat >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
374EOF
375
376test_expect_success 'status -s with color.ui' '
377
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
382
383'
384
385test_expect_success 'status -s with color.status' '
386
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
391
392'
393
394cat >expect <<\EOF
395 M dir1/modified
396A dir2/added
397?? dir1/untracked
398?? dir2/modified
399?? dir2/untracked
400?? expect
401?? output
402?? untracked
403EOF
404
405test_expect_success 'status --porcelain ignores color.ui' '
406
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
411
412'
413
414test_expect_success 'status --porcelain ignores color.status' '
415
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
420
421'
422
423# recover unconditionally from color tests
424git config --unset color.status
425git config --unset color.ui
426
427cat >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
449EOF
450
451
452test_expect_success 'status without relative paths' '
453
454 git config status.relativePaths false
455 (cd dir1 && git status) >output &&
456 test_cmp expect output
457
458'
459
460cat >expect <<\EOF
461 M dir1/modified
462A dir2/added
463?? dir1/untracked
464?? dir2/modified
465?? dir2/untracked
466?? expect
467?? output
468?? untracked
469EOF
470
471test_expect_success 'status -s without relative paths' '
472
473 (cd dir1 && git status -s) >output &&
474 test_cmp expect output
475
476'
477
478cat <<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
493EOF
494test_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'
498
499cat >expect <<EOF
500:100644 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 M dir1/modified
501EOF
502test_expect_success 'status refreshes the index' '
503 touch dir2/added &&
504 git status &&
505 git diff-files >output &&
506 test_cmp expect output
507'
508
509test_expect_success 'setup status submodule summary' '
510 test_create_repo sm && (
511 cd sm &&
512 >foo &&
513 git add foo &&
514 git commit -m "Add foo"
515 ) &&
516 git add sm
517'
518
519cat >expect <<EOF
520# On branch master
521# Changes to be committed:
522# (use "git reset HEAD <file>..." to unstage)
523#
524# new file: dir2/added
525# new file: sm
526#
527# Changed but not updated:
528# (use "git add <file>..." to update what will be committed)
529# (use "git checkout -- <file>..." to discard changes in working directory)
530#
531# modified: dir1/modified
532#
533# Untracked files:
534# (use "git add <file>..." to include in what will be committed)
535#
536# dir1/untracked
537# dir2/modified
538# dir2/untracked
539# expect
540# output
541# untracked
542EOF
543test_expect_success 'status submodule summary is disabled by default' '
544 git status >output &&
545 test_cmp expect output
546'
547
548# we expect the same as the previous test
549test_expect_success 'status --untracked-files=all does not show submodule' '
550 git status --untracked-files=all >output &&
551 test_cmp expect output
552'
553
554cat >expect <<EOF
555 M dir1/modified
556A dir2/added
557A sm
558?? dir1/untracked
559?? dir2/modified
560?? dir2/untracked
561?? expect
562?? output
563?? untracked
564EOF
565test_expect_success 'status -s submodule summary is disabled by default' '
566 git status -s >output &&
567 test_cmp expect output
568'
569
570# we expect the same as the previous test
571test_expect_success 'status -s --untracked-files=all does not show submodule' '
572 git status -s --untracked-files=all >output &&
573 test_cmp expect output
574'
575
576head=$(cd sm && git rev-parse --short=7 --verify HEAD)
577
578cat >expect <<EOF
579# On branch master
580# Changes to be committed:
581# (use "git reset HEAD <file>..." to unstage)
582#
583# new file: dir2/added
584# new file: sm
585#
586# Changed but not updated:
587# (use "git add <file>..." to update what will be committed)
588# (use "git checkout -- <file>..." to discard changes in working directory)
589#
590# modified: dir1/modified
591#
592# Submodule changes to be committed:
593#
594# * sm 0000000...$head (1):
595# > Add foo
596#
597# Untracked files:
598# (use "git add <file>..." to include in what will be committed)
599#
600# dir1/untracked
601# dir2/modified
602# dir2/untracked
603# expect
604# output
605# untracked
606EOF
607test_expect_success 'status submodule summary' '
608 git config status.submodulesummary 10 &&
609 git status >output &&
610 test_cmp expect output
611'
612
613cat >expect <<EOF
614 M dir1/modified
615A dir2/added
616A sm
617?? dir1/untracked
618?? dir2/modified
619?? dir2/untracked
620?? expect
621?? output
622?? untracked
623EOF
624test_expect_success 'status -s submodule summary' '
625 git status -s >output &&
626 test_cmp expect output
627'
628
629cat >expect <<EOF
630# On branch master
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# Untracked files:
638# (use "git add <file>..." to include in what will be committed)
639#
640# dir1/untracked
641# dir2/modified
642# dir2/untracked
643# expect
644# output
645# untracked
646no changes added to commit (use "git add" and/or "git commit -a")
647EOF
648test_expect_success 'status submodule summary (clean submodule)' '
649 git commit -m "commit submodule" &&
650 git config status.submodulesummary 10 &&
651 test_must_fail git commit --dry-run >output &&
652 test_cmp expect output &&
653 git status >output &&
654 test_cmp expect output
655'
656
657cat >expect <<EOF
658 M dir1/modified
659?? dir1/untracked
660?? dir2/modified
661?? dir2/untracked
662?? expect
663?? output
664?? untracked
665EOF
666test_expect_success 'status -s submodule summary (clean submodule)' '
667 git status -s >output &&
668 test_cmp expect output
669'
670
671cat >expect <<EOF
672# On branch master
673# Changes to be committed:
674# (use "git reset HEAD^1 <file>..." to unstage)
675#
676# new file: dir2/added
677# new file: sm
678#
679# Changed but not updated:
680# (use "git add <file>..." to update what will be committed)
681# (use "git checkout -- <file>..." to discard changes in working directory)
682#
683# modified: dir1/modified
684#
685# Submodule changes to be committed:
686#
687# * sm 0000000...$head (1):
688# > Add foo
689#
690# Untracked files:
691# (use "git add <file>..." to include in what will be committed)
692#
693# dir1/untracked
694# dir2/modified
695# dir2/untracked
696# expect
697# output
698# untracked
699EOF
700test_expect_success 'commit --dry-run submodule summary (--amend)' '
701 git config status.submodulesummary 10 &&
702 git commit --dry-run --amend >output &&
703 test_cmp expect output
704'
705
706test_expect_success POSIXPERM 'status succeeds in a read-only repository' '
707 (
708 chmod a-w .git &&
709 # make dir1/tracked stat-dirty
710 >dir1/tracked1 && mv -f dir1/tracked1 dir1/tracked &&
711 git status -s >output &&
712 ! grep dir1/tracked output &&
713 # make sure "status" succeeded without writing index out
714 git diff-files | grep dir1/tracked
715 )
716 status=$?
717 chmod 775 .git
718 (exit $status)
719'
720
721test_done