1#!/bin/sh
2#
3# Copyright (c) 2012 Valentin Duperray, Lucien Kong, Franck Jonas,
4#		     Thomas Nguy, Khoi Nguyen
5#		     Grenoble INP Ensimag
6#
7
8test_description='git status advice'
9
10. ./test-lib.sh
11
12. "$TEST_DIRECTORY"/lib-rebase.sh
13
14set_fake_editor
15
16test_expect_success 'prepare for conflicts' '
17	git config --global advice.statusuoption false &&
18	test_commit init main.txt init &&
19	git branch conflicts &&
20	test_commit on_master main.txt on_master &&
21	git checkout conflicts &&
22	test_commit on_conflicts main.txt on_conflicts
23'
24
25
26test_expect_success 'status when conflicts unresolved' '
27	test_must_fail git merge master &&
28	cat >expected <<\EOF &&
29On branch conflicts
30You have unmerged paths.
31  (fix conflicts and run "git commit")
32  (use "git merge --abort" to abort the merge)
33
34Unmerged paths:
35  (use "git add <file>..." to mark resolution)
36	both modified:   main.txt
37
38no changes added to commit (use "git add" and/or "git commit -a")
39EOF
40	git status --untracked-files=no >actual &&
41	test_i18ncmp expected actual
42'
43
44
45test_expect_success 'status when conflicts resolved before commit' '
46	git reset --hard conflicts &&
47	test_must_fail git merge master &&
48	echo one >main.txt &&
49	git add main.txt &&
50	cat >expected <<\EOF &&
51On branch conflicts
52All conflicts fixed but you are still merging.
53  (use "git commit" to conclude merge)
54
55Changes to be committed:
56	modified:   main.txt
57
58Untracked files not listed (use -u option to show untracked files)
59EOF
60	git status --untracked-files=no >actual &&
61	test_i18ncmp expected actual
62'
63
64
65test_expect_success 'prepare for rebase conflicts' '
66	git reset --hard master &&
67	git checkout -b rebase_conflicts &&
68	test_commit one_rebase main.txt one &&
69	test_commit two_rebase main.txt two &&
70	test_commit three_rebase main.txt three
71'
72
73
74test_expect_success 'status when rebase in progress before resolving conflicts' '
75	test_when_finished "git rebase --abort" &&
76	ONTO=$(git rev-parse --short HEAD^^) &&
77	test_must_fail git rebase HEAD^ --onto HEAD^^ &&
78	cat >expected <<EOF &&
79rebase in progress; onto $ONTO
80You are currently rebasing branch '\''rebase_conflicts'\'' on '\''$ONTO'\''.
81  (fix conflicts and then run "git rebase --continue")
82  (use "git rebase --skip" to skip this patch)
83  (use "git rebase --abort" to check out the original branch)
84
85Unmerged paths:
86  (use "git restore --staged <file>..." to unstage)
87  (use "git add <file>..." to mark resolution)
88	both modified:   main.txt
89
90no changes added to commit (use "git add" and/or "git commit -a")
91EOF
92	git status --untracked-files=no >actual &&
93	test_i18ncmp expected actual
94'
95
96
97test_expect_success 'status when rebase in progress before rebase --continue' '
98	git reset --hard rebase_conflicts &&
99	test_when_finished "git rebase --abort" &&
100	ONTO=$(git rev-parse --short HEAD^^) &&
101	test_must_fail git rebase HEAD^ --onto HEAD^^ &&
102	echo three >main.txt &&
103	git add main.txt &&
104	cat >expected <<EOF &&
105rebase in progress; onto $ONTO
106You are currently rebasing branch '\''rebase_conflicts'\'' on '\''$ONTO'\''.
107  (all conflicts fixed: run "git rebase --continue")
108
109Changes to be committed:
110  (use "git restore --staged <file>..." to unstage)
111	modified:   main.txt
112
113Untracked files not listed (use -u option to show untracked files)
114EOF
115	git status --untracked-files=no >actual &&
116	test_i18ncmp expected actual
117'
118
119
120test_expect_success 'prepare for rebase_i_conflicts' '
121	git reset --hard master &&
122	git checkout -b rebase_i_conflicts &&
123	test_commit one_unmerge main.txt one_unmerge &&
124	git branch rebase_i_conflicts_second &&
125	test_commit one_master main.txt one_master &&
126	git checkout rebase_i_conflicts_second &&
127	test_commit one_second main.txt one_second
128'
129
130
131test_expect_success 'status during rebase -i when conflicts unresolved' '
132	test_when_finished "git rebase --abort" &&
133	ONTO=$(git rev-parse --short rebase_i_conflicts) &&
134	LAST_COMMIT=$(git rev-parse --short rebase_i_conflicts_second) &&
135	test_must_fail git rebase -i rebase_i_conflicts &&
136	cat >expected <<EOF &&
137interactive rebase in progress; onto $ONTO
138Last command done (1 command done):
139   pick $LAST_COMMIT one_second
140No commands remaining.
141You are currently rebasing branch '\''rebase_i_conflicts_second'\'' on '\''$ONTO'\''.
142  (fix conflicts and then run "git rebase --continue")
143  (use "git rebase --skip" to skip this patch)
144  (use "git rebase --abort" to check out the original branch)
145
146Unmerged paths:
147  (use "git restore --staged <file>..." to unstage)
148  (use "git add <file>..." to mark resolution)
149	both modified:   main.txt
150
151no changes added to commit (use "git add" and/or "git commit -a")
152EOF
153	git status --untracked-files=no >actual &&
154	test_i18ncmp expected actual
155'
156
157
158test_expect_success 'status during rebase -i after resolving conflicts' '
159	git reset --hard rebase_i_conflicts_second &&
160	test_when_finished "git rebase --abort" &&
161	ONTO=$(git rev-parse --short rebase_i_conflicts) &&
162	LAST_COMMIT=$(git rev-parse --short rebase_i_conflicts_second) &&
163	test_must_fail git rebase -i rebase_i_conflicts &&
164	git add main.txt &&
165	cat >expected <<EOF &&
166interactive rebase in progress; onto $ONTO
167Last command done (1 command done):
168   pick $LAST_COMMIT one_second
169No commands remaining.
170You are currently rebasing branch '\''rebase_i_conflicts_second'\'' on '\''$ONTO'\''.
171  (all conflicts fixed: run "git rebase --continue")
172
173Changes to be committed:
174  (use "git restore --staged <file>..." to unstage)
175	modified:   main.txt
176
177Untracked files not listed (use -u option to show untracked files)
178EOF
179	git status --untracked-files=no >actual &&
180	test_i18ncmp expected actual
181'
182
183
184test_expect_success 'status when rebasing -i in edit mode' '
185	git reset --hard master &&
186	git checkout -b rebase_i_edit &&
187	test_commit one_rebase_i main.txt one &&
188	test_commit two_rebase_i main.txt two &&
189	COMMIT2=$(git rev-parse --short rebase_i_edit) &&
190	test_commit three_rebase_i main.txt three &&
191	COMMIT3=$(git rev-parse --short rebase_i_edit) &&
192	FAKE_LINES="1 edit 2" &&
193	export FAKE_LINES &&
194	test_when_finished "git rebase --abort" &&
195	ONTO=$(git rev-parse --short HEAD~2) &&
196	git rebase -i HEAD~2 &&
197	cat >expected <<EOF &&
198interactive rebase in progress; onto $ONTO
199Last commands done (2 commands done):
200   pick $COMMIT2 two_rebase_i
201   edit $COMMIT3 three_rebase_i
202No commands remaining.
203You are currently editing a commit while rebasing branch '\''rebase_i_edit'\'' on '\''$ONTO'\''.
204  (use "git commit --amend" to amend the current commit)
205  (use "git rebase --continue" once you are satisfied with your changes)
206
207nothing to commit (use -u to show untracked files)
208EOF
209	git status --untracked-files=no >actual &&
210	test_i18ncmp expected actual
211'
212
213
214test_expect_success 'status when splitting a commit' '
215	git reset --hard master &&
216	git checkout -b split_commit &&
217	test_commit one_split main.txt one &&
218	test_commit two_split main.txt two &&
219	COMMIT2=$(git rev-parse --short split_commit) &&
220	test_commit three_split main.txt three &&
221	COMMIT3=$(git rev-parse --short split_commit) &&
222	test_commit four_split main.txt four &&
223	COMMIT4=$(git rev-parse --short split_commit) &&
224	FAKE_LINES="1 edit 2 3" &&
225	export FAKE_LINES &&
226	test_when_finished "git rebase --abort" &&
227	ONTO=$(git rev-parse --short HEAD~3) &&
228	git rebase -i HEAD~3 &&
229	git reset HEAD^ &&
230	cat >expected <<EOF &&
231interactive rebase in progress; onto $ONTO
232Last commands done (2 commands done):
233   pick $COMMIT2 two_split
234   edit $COMMIT3 three_split
235Next command to do (1 remaining command):
236   pick $COMMIT4 four_split
237  (use "git rebase --edit-todo" to view and edit)
238You are currently splitting a commit while rebasing branch '\''split_commit'\'' on '\''$ONTO'\''.
239  (Once your working directory is clean, run "git rebase --continue")
240
241Changes not staged for commit:
242  (use "git add <file>..." to update what will be committed)
243  (use "git restore <file>..." to discard changes in working directory)
244	modified:   main.txt
245
246no changes added to commit (use "git add" and/or "git commit -a")
247EOF
248	git status --untracked-files=no >actual &&
249	test_i18ncmp expected actual
250'
251
252
253test_expect_success 'status after editing the last commit with --amend during a rebase -i' '
254	git reset --hard master &&
255	git checkout -b amend_last &&
256	test_commit one_amend main.txt one &&
257	test_commit two_amend main.txt two &&
258	test_commit three_amend main.txt three &&
259	COMMIT3=$(git rev-parse --short amend_last) &&
260	test_commit four_amend main.txt four &&
261	COMMIT4=$(git rev-parse --short amend_last) &&
262	FAKE_LINES="1 2 edit 3" &&
263	export FAKE_LINES &&
264	test_when_finished "git rebase --abort" &&
265	ONTO=$(git rev-parse --short HEAD~3) &&
266	git rebase -i HEAD~3 &&
267	git commit --amend -m "foo" &&
268	cat >expected <<EOF &&
269interactive rebase in progress; onto $ONTO
270Last commands done (3 commands done):
271   pick $COMMIT3 three_amend
272   edit $COMMIT4 four_amend
273  (see more in file .git/rebase-merge/done)
274No commands remaining.
275You are currently editing a commit while rebasing branch '\''amend_last'\'' on '\''$ONTO'\''.
276  (use "git commit --amend" to amend the current commit)
277  (use "git rebase --continue" once you are satisfied with your changes)
278
279nothing to commit (use -u to show untracked files)
280EOF
281	git status --untracked-files=no >actual &&
282	test_i18ncmp expected actual
283'
284
285
286test_expect_success 'prepare for several edits' '
287	git reset --hard master &&
288	git checkout -b several_edits &&
289	test_commit one_edits main.txt one &&
290	test_commit two_edits main.txt two &&
291	test_commit three_edits main.txt three &&
292	test_commit four_edits main.txt four
293'
294
295
296test_expect_success 'status: (continue first edit) second edit' '
297	FAKE_LINES="edit 1 edit 2 3" &&
298	export FAKE_LINES &&
299	test_when_finished "git rebase --abort" &&
300	COMMIT2=$(git rev-parse --short several_edits^^) &&
301	COMMIT3=$(git rev-parse --short several_edits^) &&
302	COMMIT4=$(git rev-parse --short several_edits) &&
303	ONTO=$(git rev-parse --short HEAD~3) &&
304	git rebase -i HEAD~3 &&
305	git rebase --continue &&
306	cat >expected <<EOF &&
307interactive rebase in progress; onto $ONTO
308Last commands done (2 commands done):
309   edit $COMMIT2 two_edits
310   edit $COMMIT3 three_edits
311Next command to do (1 remaining command):
312   pick $COMMIT4 four_edits
313  (use "git rebase --edit-todo" to view and edit)
314You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
315  (use "git commit --amend" to amend the current commit)
316  (use "git rebase --continue" once you are satisfied with your changes)
317
318nothing to commit (use -u to show untracked files)
319EOF
320	git status --untracked-files=no >actual &&
321	test_i18ncmp expected actual
322'
323
324
325test_expect_success 'status: (continue first edit) second edit and split' '
326	git reset --hard several_edits &&
327	FAKE_LINES="edit 1 edit 2 3" &&
328	export FAKE_LINES &&
329	test_when_finished "git rebase --abort" &&
330	COMMIT2=$(git rev-parse --short several_edits^^) &&
331	COMMIT3=$(git rev-parse --short several_edits^) &&
332	COMMIT4=$(git rev-parse --short several_edits) &&
333	ONTO=$(git rev-parse --short HEAD~3) &&
334	git rebase -i HEAD~3 &&
335	git rebase --continue &&
336	git reset HEAD^ &&
337	cat >expected <<EOF &&
338interactive rebase in progress; onto $ONTO
339Last commands done (2 commands done):
340   edit $COMMIT2 two_edits
341   edit $COMMIT3 three_edits
342Next command to do (1 remaining command):
343   pick $COMMIT4 four_edits
344  (use "git rebase --edit-todo" to view and edit)
345You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
346  (Once your working directory is clean, run "git rebase --continue")
347
348Changes not staged for commit:
349  (use "git add <file>..." to update what will be committed)
350  (use "git restore <file>..." to discard changes in working directory)
351	modified:   main.txt
352
353no changes added to commit (use "git add" and/or "git commit -a")
354EOF
355	git status --untracked-files=no >actual &&
356	test_i18ncmp expected actual
357'
358
359
360test_expect_success 'status: (continue first edit) second edit and amend' '
361	git reset --hard several_edits &&
362	FAKE_LINES="edit 1 edit 2 3" &&
363	export FAKE_LINES &&
364	test_when_finished "git rebase --abort" &&
365	COMMIT2=$(git rev-parse --short several_edits^^) &&
366	COMMIT3=$(git rev-parse --short several_edits^) &&
367	COMMIT4=$(git rev-parse --short several_edits) &&
368	ONTO=$(git rev-parse --short HEAD~3) &&
369	git rebase -i HEAD~3 &&
370	git rebase --continue &&
371	git commit --amend -m "foo" &&
372	cat >expected <<EOF &&
373interactive rebase in progress; onto $ONTO
374Last commands done (2 commands done):
375   edit $COMMIT2 two_edits
376   edit $COMMIT3 three_edits
377Next command to do (1 remaining command):
378   pick $COMMIT4 four_edits
379  (use "git rebase --edit-todo" to view and edit)
380You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
381  (use "git commit --amend" to amend the current commit)
382  (use "git rebase --continue" once you are satisfied with your changes)
383
384nothing to commit (use -u to show untracked files)
385EOF
386	git status --untracked-files=no >actual &&
387	test_i18ncmp expected actual
388'
389
390
391test_expect_success 'status: (amend first edit) second edit' '
392	git reset --hard several_edits &&
393	FAKE_LINES="edit 1 edit 2 3" &&
394	export FAKE_LINES &&
395	test_when_finished "git rebase --abort" &&
396	COMMIT2=$(git rev-parse --short several_edits^^) &&
397	COMMIT3=$(git rev-parse --short several_edits^) &&
398	COMMIT4=$(git rev-parse --short several_edits) &&
399	ONTO=$(git rev-parse --short HEAD~3) &&
400	git rebase -i HEAD~3 &&
401	git commit --amend -m "a" &&
402	git rebase --continue &&
403	cat >expected <<EOF &&
404interactive rebase in progress; onto $ONTO
405Last commands done (2 commands done):
406   edit $COMMIT2 two_edits
407   edit $COMMIT3 three_edits
408Next command to do (1 remaining command):
409   pick $COMMIT4 four_edits
410  (use "git rebase --edit-todo" to view and edit)
411You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
412  (use "git commit --amend" to amend the current commit)
413  (use "git rebase --continue" once you are satisfied with your changes)
414
415nothing to commit (use -u to show untracked files)
416EOF
417	git status --untracked-files=no >actual &&
418	test_i18ncmp expected actual
419'
420
421
422test_expect_success 'status: (amend first edit) second edit and split' '
423	git reset --hard several_edits &&
424	FAKE_LINES="edit 1 edit 2 3" &&
425	export FAKE_LINES &&
426	test_when_finished "git rebase --abort" &&
427	ONTO=$(git rev-parse --short HEAD~3) &&
428	COMMIT2=$(git rev-parse --short several_edits^^) &&
429	COMMIT3=$(git rev-parse --short several_edits^) &&
430	COMMIT4=$(git rev-parse --short several_edits) &&
431	git rebase -i HEAD~3 &&
432	git commit --amend -m "b" &&
433	git rebase --continue &&
434	git reset HEAD^ &&
435	cat >expected <<EOF &&
436interactive rebase in progress; onto $ONTO
437Last commands done (2 commands done):
438   edit $COMMIT2 two_edits
439   edit $COMMIT3 three_edits
440Next command to do (1 remaining command):
441   pick $COMMIT4 four_edits
442  (use "git rebase --edit-todo" to view and edit)
443You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
444  (Once your working directory is clean, run "git rebase --continue")
445
446Changes not staged for commit:
447  (use "git add <file>..." to update what will be committed)
448  (use "git restore <file>..." to discard changes in working directory)
449	modified:   main.txt
450
451no changes added to commit (use "git add" and/or "git commit -a")
452EOF
453	git status --untracked-files=no >actual &&
454	test_i18ncmp expected actual
455'
456
457
458test_expect_success 'status: (amend first edit) second edit and amend' '
459	git reset --hard several_edits &&
460	FAKE_LINES="edit 1 edit 2 3" &&
461	export FAKE_LINES &&
462	test_when_finished "git rebase --abort" &&
463	COMMIT2=$(git rev-parse --short several_edits^^) &&
464	COMMIT3=$(git rev-parse --short several_edits^) &&
465	COMMIT4=$(git rev-parse --short several_edits) &&
466	ONTO=$(git rev-parse --short HEAD~3) &&
467	git rebase -i HEAD~3 &&
468	git commit --amend -m "c" &&
469	git rebase --continue &&
470	git commit --amend -m "d" &&
471	cat >expected <<EOF &&
472interactive rebase in progress; onto $ONTO
473Last commands done (2 commands done):
474   edit $COMMIT2 two_edits
475   edit $COMMIT3 three_edits
476Next command to do (1 remaining command):
477   pick $COMMIT4 four_edits
478  (use "git rebase --edit-todo" to view and edit)
479You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
480  (use "git commit --amend" to amend the current commit)
481  (use "git rebase --continue" once you are satisfied with your changes)
482
483nothing to commit (use -u to show untracked files)
484EOF
485	git status --untracked-files=no >actual &&
486	test_i18ncmp expected actual
487'
488
489
490test_expect_success 'status: (split first edit) second edit' '
491	git reset --hard several_edits &&
492	FAKE_LINES="edit 1 edit 2 3" &&
493	export FAKE_LINES &&
494	test_when_finished "git rebase --abort" &&
495	COMMIT2=$(git rev-parse --short several_edits^^) &&
496	COMMIT3=$(git rev-parse --short several_edits^) &&
497	COMMIT4=$(git rev-parse --short several_edits) &&
498	ONTO=$(git rev-parse --short HEAD~3) &&
499	git rebase -i HEAD~3 &&
500	git reset HEAD^ &&
501	git add main.txt &&
502	git commit -m "e" &&
503	git rebase --continue &&
504	cat >expected <<EOF &&
505interactive rebase in progress; onto $ONTO
506Last commands done (2 commands done):
507   edit $COMMIT2 two_edits
508   edit $COMMIT3 three_edits
509Next command to do (1 remaining command):
510   pick $COMMIT4 four_edits
511  (use "git rebase --edit-todo" to view and edit)
512You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
513  (use "git commit --amend" to amend the current commit)
514  (use "git rebase --continue" once you are satisfied with your changes)
515
516nothing to commit (use -u to show untracked files)
517EOF
518	git status --untracked-files=no >actual &&
519	test_i18ncmp expected actual
520'
521
522
523test_expect_success 'status: (split first edit) second edit and split' '
524	git reset --hard several_edits &&
525	FAKE_LINES="edit 1 edit 2 3" &&
526	export FAKE_LINES &&
527	test_when_finished "git rebase --abort" &&
528	COMMIT2=$(git rev-parse --short several_edits^^) &&
529	COMMIT3=$(git rev-parse --short several_edits^) &&
530	COMMIT4=$(git rev-parse --short several_edits) &&
531	ONTO=$(git rev-parse --short HEAD~3) &&
532	git rebase -i HEAD~3 &&
533	git reset HEAD^ &&
534	git add main.txt &&
535	git commit --amend -m "f" &&
536	git rebase --continue &&
537	git reset HEAD^ &&
538	cat >expected <<EOF &&
539interactive rebase in progress; onto $ONTO
540Last commands done (2 commands done):
541   edit $COMMIT2 two_edits
542   edit $COMMIT3 three_edits
543Next command to do (1 remaining command):
544   pick $COMMIT4 four_edits
545  (use "git rebase --edit-todo" to view and edit)
546You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
547  (Once your working directory is clean, run "git rebase --continue")
548
549Changes not staged for commit:
550  (use "git add <file>..." to update what will be committed)
551  (use "git restore <file>..." to discard changes in working directory)
552	modified:   main.txt
553
554no changes added to commit (use "git add" and/or "git commit -a")
555EOF
556	git status --untracked-files=no >actual &&
557	test_i18ncmp expected actual
558'
559
560
561test_expect_success 'status: (split first edit) second edit and amend' '
562	git reset --hard several_edits &&
563	FAKE_LINES="edit 1 edit 2 3" &&
564	export FAKE_LINES &&
565	test_when_finished "git rebase --abort" &&
566	COMMIT2=$(git rev-parse --short several_edits^^) &&
567	COMMIT3=$(git rev-parse --short several_edits^) &&
568	COMMIT4=$(git rev-parse --short several_edits) &&
569	ONTO=$(git rev-parse --short HEAD~3) &&
570	git rebase -i HEAD~3 &&
571	git reset HEAD^ &&
572	git add main.txt &&
573	git commit --amend -m "g" &&
574	git rebase --continue &&
575	git commit --amend -m "h" &&
576	cat >expected <<EOF &&
577interactive rebase in progress; onto $ONTO
578Last commands done (2 commands done):
579   edit $COMMIT2 two_edits
580   edit $COMMIT3 three_edits
581Next command to do (1 remaining command):
582   pick $COMMIT4 four_edits
583  (use "git rebase --edit-todo" to view and edit)
584You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
585  (use "git commit --amend" to amend the current commit)
586  (use "git rebase --continue" once you are satisfied with your changes)
587
588nothing to commit (use -u to show untracked files)
589EOF
590	git status --untracked-files=no >actual &&
591	test_i18ncmp expected actual
592'
593
594
595test_expect_success 'prepare am_session' '
596	git reset --hard master &&
597	git checkout -b am_session &&
598	test_commit one_am one.txt "one" &&
599	test_commit two_am two.txt "two" &&
600	test_commit three_am three.txt "three"
601'
602
603
604test_expect_success 'status in an am session: file already exists' '
605	git checkout -b am_already_exists &&
606	test_when_finished "rm Maildir/* && git am --abort" &&
607	git format-patch -1 -oMaildir &&
608	test_must_fail git am Maildir/*.patch &&
609	cat >expected <<\EOF &&
610On branch am_already_exists
611You are in the middle of an am session.
612  (fix conflicts and then run "git am --continue")
613  (use "git am --skip" to skip this patch)
614  (use "git am --abort" to restore the original branch)
615
616nothing to commit (use -u to show untracked files)
617EOF
618	git status --untracked-files=no >actual &&
619	test_i18ncmp expected actual
620'
621
622
623test_expect_success 'status in an am session: file does not exist' '
624	git reset --hard am_session &&
625	git checkout -b am_not_exists &&
626	git rm three.txt &&
627	git commit -m "delete three.txt" &&
628	test_when_finished "rm Maildir/* && git am --abort" &&
629	git format-patch -1 -oMaildir &&
630	test_must_fail git am Maildir/*.patch &&
631	cat >expected <<\EOF &&
632On branch am_not_exists
633You are in the middle of an am session.
634  (fix conflicts and then run "git am --continue")
635  (use "git am --skip" to skip this patch)
636  (use "git am --abort" to restore the original branch)
637
638nothing to commit (use -u to show untracked files)
639EOF
640	git status --untracked-files=no >actual &&
641	test_i18ncmp expected actual
642'
643
644
645test_expect_success 'status in an am session: empty patch' '
646	git reset --hard am_session &&
647	git checkout -b am_empty &&
648	test_when_finished "rm Maildir/* && git am --abort" &&
649	git format-patch -3 -oMaildir &&
650	git rm one.txt two.txt three.txt &&
651	git commit -m "delete all am_empty" &&
652	echo error >Maildir/0002-two_am.patch &&
653	test_must_fail git am Maildir/*.patch &&
654	cat >expected <<\EOF &&
655On branch am_empty
656You are in the middle of an am session.
657The current patch is empty.
658  (use "git am --skip" to skip this patch)
659  (use "git am --abort" to restore the original branch)
660
661nothing to commit (use -u to show untracked files)
662EOF
663	git status --untracked-files=no >actual &&
664	test_i18ncmp expected actual
665'
666
667
668test_expect_success 'status when bisecting' '
669	git reset --hard master &&
670	git checkout -b bisect &&
671	test_commit one_bisect main.txt one &&
672	test_commit two_bisect main.txt two &&
673	test_commit three_bisect main.txt three &&
674	test_when_finished "git bisect reset" &&
675	git bisect start &&
676	git bisect bad &&
677	git bisect good one_bisect &&
678	TGT=$(git rev-parse --short two_bisect) &&
679	cat >expected <<EOF &&
680HEAD detached at $TGT
681You are currently bisecting, started from branch '\''bisect'\''.
682  (use "git bisect reset" to get back to the original branch)
683
684nothing to commit (use -u to show untracked files)
685EOF
686	git status --untracked-files=no >actual &&
687	test_i18ncmp expected actual
688'
689
690
691test_expect_success 'status when rebase conflicts with statushints disabled' '
692	git reset --hard master &&
693	git checkout -b statushints_disabled &&
694	test_when_finished "git config --local advice.statushints true" &&
695	git config --local advice.statushints false &&
696	test_commit one_statushints main.txt one &&
697	test_commit two_statushints main.txt two &&
698	test_commit three_statushints main.txt three &&
699	test_when_finished "git rebase --abort" &&
700	ONTO=$(git rev-parse --short HEAD^^) &&
701	test_must_fail git rebase HEAD^ --onto HEAD^^ &&
702	cat >expected <<EOF &&
703rebase in progress; onto $ONTO
704You are currently rebasing branch '\''statushints_disabled'\'' on '\''$ONTO'\''.
705
706Unmerged paths:
707	both modified:   main.txt
708
709no changes added to commit
710EOF
711	git status --untracked-files=no >actual &&
712	test_i18ncmp expected actual
713'
714
715
716test_expect_success 'prepare for cherry-pick conflicts' '
717	git reset --hard master &&
718	git checkout -b cherry_branch &&
719	test_commit one_cherry main.txt one &&
720	test_commit two_cherries main.txt two &&
721	git checkout -b cherry_branch_second &&
722	test_commit second_cherry main.txt second &&
723	git checkout cherry_branch &&
724	test_commit three_cherries main.txt three
725'
726
727
728test_expect_success 'status when cherry-picking before resolving conflicts' '
729	test_when_finished "git cherry-pick --abort" &&
730	test_must_fail git cherry-pick cherry_branch_second &&
731	TO_CHERRY_PICK=$(git rev-parse --short CHERRY_PICK_HEAD) &&
732	cat >expected <<EOF &&
733On branch cherry_branch
734You are currently cherry-picking commit $TO_CHERRY_PICK.
735  (fix conflicts and run "git cherry-pick --continue")
736  (use "git cherry-pick --skip" to skip this patch)
737  (use "git cherry-pick --abort" to cancel the cherry-pick operation)
738
739Unmerged paths:
740  (use "git add <file>..." to mark resolution)
741	both modified:   main.txt
742
743no changes added to commit (use "git add" and/or "git commit -a")
744EOF
745	git status --untracked-files=no >actual &&
746	test_i18ncmp expected actual
747'
748
749
750test_expect_success 'status when cherry-picking after resolving conflicts' '
751	git reset --hard cherry_branch &&
752	test_when_finished "git cherry-pick --abort" &&
753	test_must_fail git cherry-pick cherry_branch_second &&
754	TO_CHERRY_PICK=$(git rev-parse --short CHERRY_PICK_HEAD) &&
755	echo end >main.txt &&
756	git add main.txt &&
757	cat >expected <<EOF &&
758On branch cherry_branch
759You are currently cherry-picking commit $TO_CHERRY_PICK.
760  (all conflicts fixed: run "git cherry-pick --continue")
761  (use "git cherry-pick --skip" to skip this patch)
762  (use "git cherry-pick --abort" to cancel the cherry-pick operation)
763
764Changes to be committed:
765	modified:   main.txt
766
767Untracked files not listed (use -u option to show untracked files)
768EOF
769	git status --untracked-files=no >actual &&
770	test_i18ncmp expected actual
771'
772
773test_expect_success 'status when cherry-picking after committing conflict resolution' '
774	git reset --hard cherry_branch &&
775	test_when_finished "git cherry-pick --abort" &&
776	test_must_fail git cherry-pick cherry_branch_second one_cherry &&
777	echo end >main.txt &&
778	git commit -a &&
779	cat >expected <<EOF &&
780On branch cherry_branch
781Cherry-pick currently in progress.
782  (run "git cherry-pick --continue" to continue)
783  (use "git cherry-pick --skip" to skip this patch)
784  (use "git cherry-pick --abort" to cancel the cherry-pick operation)
785
786nothing to commit (use -u to show untracked files)
787EOF
788	git status --untracked-files=no >actual &&
789	test_i18ncmp expected actual
790'
791
792test_expect_success 'status shows cherry-pick with invalid oid' '
793	mkdir .git/sequencer &&
794	test_write_lines "pick invalid-oid" >.git/sequencer/todo &&
795	git status --untracked-files=no >actual 2>err &&
796	git cherry-pick --quit &&
797	test_must_be_empty err &&
798	test_i18ncmp expected actual
799'
800
801test_expect_success 'status does not show error if .git/sequencer is a file' '
802	test_when_finished "rm .git/sequencer" &&
803	test_write_lines hello >.git/sequencer &&
804	git status --untracked-files=no 2>err &&
805	test_must_be_empty err
806'
807
808test_expect_success 'status showing detached at and from a tag' '
809	test_commit atag tagging &&
810	git checkout atag &&
811	cat >expected <<\EOF &&
812HEAD detached at atag
813nothing to commit (use -u to show untracked files)
814EOF
815	git status --untracked-files=no >actual &&
816	test_i18ncmp expected actual &&
817
818	git reset --hard HEAD^ &&
819	cat >expected <<\EOF &&
820HEAD detached from atag
821nothing to commit (use -u to show untracked files)
822EOF
823	git status --untracked-files=no >actual &&
824	test_i18ncmp expected actual
825'
826
827test_expect_success 'status while reverting commit (conflicts)' '
828	git checkout master &&
829	echo before >to-revert.txt &&
830	test_commit before to-revert.txt &&
831	echo old >to-revert.txt &&
832	test_commit old to-revert.txt &&
833	echo new >to-revert.txt &&
834	test_commit new to-revert.txt &&
835	TO_REVERT=$(git rev-parse --short HEAD^) &&
836	test_must_fail git revert $TO_REVERT &&
837	cat >expected <<EOF &&
838On branch master
839You are currently reverting commit $TO_REVERT.
840  (fix conflicts and run "git revert --continue")
841  (use "git revert --skip" to skip this patch)
842  (use "git revert --abort" to cancel the revert operation)
843
844Unmerged paths:
845  (use "git restore --staged <file>..." to unstage)
846  (use "git add <file>..." to mark resolution)
847	both modified:   to-revert.txt
848
849no changes added to commit (use "git add" and/or "git commit -a")
850EOF
851	git status --untracked-files=no >actual &&
852	test_i18ncmp expected actual
853'
854
855test_expect_success 'status while reverting commit (conflicts resolved)' '
856	echo reverted >to-revert.txt &&
857	git add to-revert.txt &&
858	cat >expected <<EOF &&
859On branch master
860You are currently reverting commit $TO_REVERT.
861  (all conflicts fixed: run "git revert --continue")
862  (use "git revert --skip" to skip this patch)
863  (use "git revert --abort" to cancel the revert operation)
864
865Changes to be committed:
866  (use "git restore --staged <file>..." to unstage)
867	modified:   to-revert.txt
868
869Untracked files not listed (use -u option to show untracked files)
870EOF
871	git status --untracked-files=no >actual &&
872	test_i18ncmp expected actual
873'
874
875test_expect_success 'status after reverting commit' '
876	git revert --continue &&
877	cat >expected <<\EOF &&
878On branch master
879nothing to commit (use -u to show untracked files)
880EOF
881	git status --untracked-files=no >actual &&
882	test_i18ncmp expected actual
883'
884
885test_expect_success 'status while reverting after committing conflict resolution' '
886	test_when_finished "git revert --abort" &&
887	git reset --hard new &&
888	test_must_fail git revert old new &&
889	echo reverted >to-revert.txt &&
890	git commit -a &&
891	cat >expected <<EOF &&
892On branch master
893Revert currently in progress.
894  (run "git revert --continue" to continue)
895  (use "git revert --skip" to skip this patch)
896  (use "git revert --abort" to cancel the revert operation)
897
898nothing to commit (use -u to show untracked files)
899EOF
900	git status --untracked-files=no >actual &&
901	test_i18ncmp expected actual
902'
903
904test_expect_success 'prepare for different number of commits rebased' '
905	git reset --hard master &&
906	git checkout -b several_commits &&
907	test_commit one_commit main.txt one &&
908	test_commit two_commit main.txt two &&
909	test_commit three_commit main.txt three &&
910	test_commit four_commit main.txt four
911'
912
913test_expect_success 'status: one command done nothing remaining' '
914	FAKE_LINES="exec_exit_15" &&
915	export FAKE_LINES &&
916	test_when_finished "git rebase --abort" &&
917	ONTO=$(git rev-parse --short HEAD~3) &&
918	test_must_fail git rebase -i HEAD~3 &&
919	cat >expected <<EOF &&
920interactive rebase in progress; onto $ONTO
921Last command done (1 command done):
922   exec exit 15
923No commands remaining.
924You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
925  (use "git commit --amend" to amend the current commit)
926  (use "git rebase --continue" once you are satisfied with your changes)
927
928nothing to commit (use -u to show untracked files)
929EOF
930	git status --untracked-files=no >actual &&
931	test_i18ncmp expected actual
932'
933
934test_expect_success 'status: two commands done with some white lines in done file' '
935	FAKE_LINES="1 > exec_exit_15  2 3" &&
936	export FAKE_LINES &&
937	test_when_finished "git rebase --abort" &&
938	ONTO=$(git rev-parse --short HEAD~3) &&
939	COMMIT4=$(git rev-parse --short HEAD) &&
940	COMMIT3=$(git rev-parse --short HEAD^) &&
941	COMMIT2=$(git rev-parse --short HEAD^^) &&
942	test_must_fail git rebase -i HEAD~3 &&
943	cat >expected <<EOF &&
944interactive rebase in progress; onto $ONTO
945Last commands done (2 commands done):
946   pick $COMMIT2 two_commit
947   exec exit 15
948Next commands to do (2 remaining commands):
949   pick $COMMIT3 three_commit
950   pick $COMMIT4 four_commit
951  (use "git rebase --edit-todo" to view and edit)
952You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
953  (use "git commit --amend" to amend the current commit)
954  (use "git rebase --continue" once you are satisfied with your changes)
955
956nothing to commit (use -u to show untracked files)
957EOF
958	git status --untracked-files=no >actual &&
959	test_i18ncmp expected actual
960'
961
962test_expect_success 'status: two remaining commands with some white lines in todo file' '
963	FAKE_LINES="1 2 exec_exit_15 3 > 4" &&
964	export FAKE_LINES &&
965	test_when_finished "git rebase --abort" &&
966	ONTO=$(git rev-parse --short HEAD~4) &&
967	COMMIT4=$(git rev-parse --short HEAD) &&
968	COMMIT3=$(git rev-parse --short HEAD^) &&
969	COMMIT2=$(git rev-parse --short HEAD^^) &&
970	test_must_fail git rebase -i HEAD~4 &&
971	cat >expected <<EOF &&
972interactive rebase in progress; onto $ONTO
973Last commands done (3 commands done):
974   pick $COMMIT2 two_commit
975   exec exit 15
976  (see more in file .git/rebase-merge/done)
977Next commands to do (2 remaining commands):
978   pick $COMMIT3 three_commit
979   pick $COMMIT4 four_commit
980  (use "git rebase --edit-todo" to view and edit)
981You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
982  (use "git commit --amend" to amend the current commit)
983  (use "git rebase --continue" once you are satisfied with your changes)
984
985nothing to commit (use -u to show untracked files)
986EOF
987	git status --untracked-files=no >actual &&
988	test_i18ncmp expected actual
989'
990
991test_expect_success 'status: handle not-yet-started rebase -i gracefully' '
992	ONTO=$(git rev-parse --short HEAD^) &&
993	COMMIT=$(git rev-parse --short HEAD) &&
994	EDITOR="git status --untracked-files=no >actual" git rebase -i HEAD^ &&
995	cat >expected <<EOF &&
996On branch several_commits
997No commands done.
998Next command to do (1 remaining command):
999   pick $COMMIT four_commit
1000  (use "git rebase --edit-todo" to view and edit)
1001You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
1002  (use "git commit --amend" to amend the current commit)
1003  (use "git rebase --continue" once you are satisfied with your changes)
1004
1005nothing to commit (use -u to show untracked files)
1006EOF
1007	test_i18ncmp expected actual
1008'
1009
1010test_done
1011