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