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 --abort" to cancel the cherry-pick operation)
737
738Unmerged paths:
739 (use "git add <file>..." to mark resolution)
740 both modified: main.txt
741
742no changes added to commit (use "git add" and/or "git commit -a")
743EOF
744 git status --untracked-files=no >actual &&
745 test_i18ncmp expected actual
746'
747
748
749test_expect_success 'status when cherry-picking after resolving conflicts' '
750 git reset --hard cherry_branch &&
751 test_when_finished "git cherry-pick --abort" &&
752 test_must_fail git cherry-pick cherry_branch_second &&
753 TO_CHERRY_PICK=$(git rev-parse --short CHERRY_PICK_HEAD) &&
754 echo end >main.txt &&
755 git add main.txt &&
756 cat >expected <<EOF &&
757On branch cherry_branch
758You are currently cherry-picking commit $TO_CHERRY_PICK.
759 (all conflicts fixed: run "git cherry-pick --continue")
760 (use "git cherry-pick --abort" to cancel the cherry-pick operation)
761
762Changes to be committed:
763 modified: main.txt
764
765Untracked files not listed (use -u option to show untracked files)
766EOF
767 git status --untracked-files=no >actual &&
768 test_i18ncmp expected actual
769'
770
771test_expect_success 'status when cherry-picking after committing conflict resolution' '
772 git reset --hard cherry_branch &&
773 test_when_finished "git cherry-pick --abort" &&
774 test_must_fail git cherry-pick cherry_branch_second one_cherry &&
775 echo end >main.txt &&
776 git commit -a &&
777 cat >expected <<EOF &&
778On branch cherry_branch
779Cherry-pick currently in progress.
780 (run "git cherry-pick --continue" to continue)
781 (use "git cherry-pick --abort" to cancel the cherry-pick operation)
782
783nothing to commit (use -u to show untracked files)
784EOF
785 git status --untracked-files=no >actual &&
786 test_i18ncmp expected actual
787'
788
789test_expect_success 'status shows cherry-pick with invalid oid' '
790 mkdir .git/sequencer &&
791 test_write_lines "pick invalid-oid" >.git/sequencer/todo &&
792 git status --untracked-files=no >actual 2>err &&
793 git cherry-pick --quit &&
794 test_must_be_empty err &&
795 test_i18ncmp expected actual
796'
797
798test_expect_success 'status does not show error if .git/sequencer is a file' '
799 test_when_finished "rm .git/sequencer" &&
800 test_write_lines hello >.git/sequencer &&
801 git status --untracked-files=no 2>err &&
802 test_must_be_empty err
803'
804
805test_expect_success 'status showing detached at and from a tag' '
806 test_commit atag tagging &&
807 git checkout atag &&
808 cat >expected <<\EOF &&
809HEAD detached at atag
810nothing to commit (use -u to show untracked files)
811EOF
812 git status --untracked-files=no >actual &&
813 test_i18ncmp expected actual &&
814
815 git reset --hard HEAD^ &&
816 cat >expected <<\EOF &&
817HEAD detached from atag
818nothing to commit (use -u to show untracked files)
819EOF
820 git status --untracked-files=no >actual &&
821 test_i18ncmp expected actual
822'
823
824test_expect_success 'status while reverting commit (conflicts)' '
825 git checkout master &&
826 echo before >to-revert.txt &&
827 test_commit before to-revert.txt &&
828 echo old >to-revert.txt &&
829 test_commit old to-revert.txt &&
830 echo new >to-revert.txt &&
831 test_commit new to-revert.txt &&
832 TO_REVERT=$(git rev-parse --short HEAD^) &&
833 test_must_fail git revert $TO_REVERT &&
834 cat >expected <<EOF &&
835On branch master
836You are currently reverting commit $TO_REVERT.
837 (fix conflicts and run "git revert --continue")
838 (use "git revert --abort" to cancel the revert operation)
839
840Unmerged paths:
841 (use "git restore --staged <file>..." to unstage)
842 (use "git add <file>..." to mark resolution)
843 both modified: to-revert.txt
844
845no changes added to commit (use "git add" and/or "git commit -a")
846EOF
847 git status --untracked-files=no >actual &&
848 test_i18ncmp expected actual
849'
850
851test_expect_success 'status while reverting commit (conflicts resolved)' '
852 echo reverted >to-revert.txt &&
853 git add to-revert.txt &&
854 cat >expected <<EOF &&
855On branch master
856You are currently reverting commit $TO_REVERT.
857 (all conflicts fixed: run "git revert --continue")
858 (use "git revert --abort" to cancel the revert operation)
859
860Changes to be committed:
861 (use "git restore --staged <file>..." to unstage)
862 modified: to-revert.txt
863
864Untracked files not listed (use -u option to show untracked files)
865EOF
866 git status --untracked-files=no >actual &&
867 test_i18ncmp expected actual
868'
869
870test_expect_success 'status after reverting commit' '
871 git revert --continue &&
872 cat >expected <<\EOF &&
873On branch master
874nothing to commit (use -u to show untracked files)
875EOF
876 git status --untracked-files=no >actual &&
877 test_i18ncmp expected actual
878'
879
880test_expect_success 'status while reverting after committing conflict resolution' '
881 test_when_finished "git revert --abort" &&
882 git reset --hard new &&
883 test_must_fail git revert old new &&
884 echo reverted >to-revert.txt &&
885 git commit -a &&
886 cat >expected <<EOF &&
887On branch master
888Revert currently in progress.
889 (run "git revert --continue" to continue)
890 (use "git revert --abort" to cancel the revert operation)
891
892nothing to commit (use -u to show untracked files)
893EOF
894 git status --untracked-files=no >actual &&
895 test_i18ncmp expected actual
896'
897
898test_expect_success 'prepare for different number of commits rebased' '
899 git reset --hard master &&
900 git checkout -b several_commits &&
901 test_commit one_commit main.txt one &&
902 test_commit two_commit main.txt two &&
903 test_commit three_commit main.txt three &&
904 test_commit four_commit main.txt four
905'
906
907test_expect_success 'status: one command done nothing remaining' '
908 FAKE_LINES="exec_exit_15" &&
909 export FAKE_LINES &&
910 test_when_finished "git rebase --abort" &&
911 ONTO=$(git rev-parse --short HEAD~3) &&
912 test_must_fail git rebase -i HEAD~3 &&
913 cat >expected <<EOF &&
914interactive rebase in progress; onto $ONTO
915Last command done (1 command done):
916 exec exit 15
917No commands remaining.
918You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
919 (use "git commit --amend" to amend the current commit)
920 (use "git rebase --continue" once you are satisfied with your changes)
921
922nothing to commit (use -u to show untracked files)
923EOF
924 git status --untracked-files=no >actual &&
925 test_i18ncmp expected actual
926'
927
928test_expect_success 'status: two commands done with some white lines in done file' '
929 FAKE_LINES="1 > exec_exit_15 2 3" &&
930 export FAKE_LINES &&
931 test_when_finished "git rebase --abort" &&
932 ONTO=$(git rev-parse --short HEAD~3) &&
933 COMMIT4=$(git rev-parse --short HEAD) &&
934 COMMIT3=$(git rev-parse --short HEAD^) &&
935 COMMIT2=$(git rev-parse --short HEAD^^) &&
936 test_must_fail git rebase -i HEAD~3 &&
937 cat >expected <<EOF &&
938interactive rebase in progress; onto $ONTO
939Last commands done (2 commands done):
940 pick $COMMIT2 two_commit
941 exec exit 15
942Next commands to do (2 remaining commands):
943 pick $COMMIT3 three_commit
944 pick $COMMIT4 four_commit
945 (use "git rebase --edit-todo" to view and edit)
946You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
947 (use "git commit --amend" to amend the current commit)
948 (use "git rebase --continue" once you are satisfied with your changes)
949
950nothing to commit (use -u to show untracked files)
951EOF
952 git status --untracked-files=no >actual &&
953 test_i18ncmp expected actual
954'
955
956test_expect_success 'status: two remaining commands with some white lines in todo file' '
957 FAKE_LINES="1 2 exec_exit_15 3 > 4" &&
958 export FAKE_LINES &&
959 test_when_finished "git rebase --abort" &&
960 ONTO=$(git rev-parse --short HEAD~4) &&
961 COMMIT4=$(git rev-parse --short HEAD) &&
962 COMMIT3=$(git rev-parse --short HEAD^) &&
963 COMMIT2=$(git rev-parse --short HEAD^^) &&
964 test_must_fail git rebase -i HEAD~4 &&
965 cat >expected <<EOF &&
966interactive rebase in progress; onto $ONTO
967Last commands done (3 commands done):
968 pick $COMMIT2 two_commit
969 exec exit 15
970 (see more in file .git/rebase-merge/done)
971Next commands to do (2 remaining commands):
972 pick $COMMIT3 three_commit
973 pick $COMMIT4 four_commit
974 (use "git rebase --edit-todo" to view and edit)
975You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
976 (use "git commit --amend" to amend the current commit)
977 (use "git rebase --continue" once you are satisfied with your changes)
978
979nothing to commit (use -u to show untracked files)
980EOF
981 git status --untracked-files=no >actual &&
982 test_i18ncmp expected actual
983'
984
985test_expect_success 'status: handle not-yet-started rebase -i gracefully' '
986 ONTO=$(git rev-parse --short HEAD^) &&
987 COMMIT=$(git rev-parse --short HEAD) &&
988 EDITOR="git status --untracked-files=no >actual" git rebase -i HEAD^ &&
989 cat >expected <<EOF &&
990On branch several_commits
991No commands done.
992Next command to do (1 remaining command):
993 pick $COMMIT four_commit
994 (use "git rebase --edit-todo" to view and edit)
995You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
996 (use "git commit --amend" to amend the current commit)
997 (use "git rebase --continue" once you are satisfied with your changes)
998
999nothing to commit (use -u to show untracked files)
1000EOF
1001 test_i18ncmp expected actual
1002'
1003
1004test_done