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