]> git.ipfire.org Git - thirdparty/git.git/blob - t/t7512-status-help.sh
hashmap: use *_entry APIs for iteration
[thirdparty/git.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 . ./test-lib.sh
11
12 . "$TEST_DIRECTORY"/lib-rebase.sh
13
14 set_fake_editor
15
16 test_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
26 test_expect_success 'status when conflicts unresolved' '
27 test_must_fail git merge master &&
28 cat >expected <<\EOF &&
29 On branch conflicts
30 You have unmerged paths.
31 (fix conflicts and run "git commit")
32 (use "git merge --abort" to abort the merge)
33
34 Unmerged paths:
35 (use "git add <file>..." to mark resolution)
36 both modified: main.txt
37
38 no changes added to commit (use "git add" and/or "git commit -a")
39 EOF
40 git status --untracked-files=no >actual &&
41 test_i18ncmp expected actual
42 '
43
44
45 test_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 &&
51 On branch conflicts
52 All conflicts fixed but you are still merging.
53 (use "git commit" to conclude merge)
54
55 Changes to be committed:
56 modified: main.txt
57
58 Untracked files not listed (use -u option to show untracked files)
59 EOF
60 git status --untracked-files=no >actual &&
61 test_i18ncmp expected actual
62 '
63
64
65 test_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
74 test_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 &&
79 rebase in progress; onto $ONTO
80 You 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
85 Unmerged paths:
86 (use "git restore --staged <file>..." to unstage)
87 (use "git add <file>..." to mark resolution)
88 both modified: main.txt
89
90 no changes added to commit (use "git add" and/or "git commit -a")
91 EOF
92 git status --untracked-files=no >actual &&
93 test_i18ncmp expected actual
94 '
95
96
97 test_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 &&
105 rebase in progress; onto $ONTO
106 You are currently rebasing branch '\''rebase_conflicts'\'' on '\''$ONTO'\''.
107 (all conflicts fixed: run "git rebase --continue")
108
109 Changes to be committed:
110 (use "git restore --staged <file>..." to unstage)
111 modified: main.txt
112
113 Untracked files not listed (use -u option to show untracked files)
114 EOF
115 git status --untracked-files=no >actual &&
116 test_i18ncmp expected actual
117 '
118
119
120 test_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
131 test_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 &&
137 interactive rebase in progress; onto $ONTO
138 Last command done (1 command done):
139 pick $LAST_COMMIT one_second
140 No commands remaining.
141 You 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
146 Unmerged paths:
147 (use "git restore --staged <file>..." to unstage)
148 (use "git add <file>..." to mark resolution)
149 both modified: main.txt
150
151 no changes added to commit (use "git add" and/or "git commit -a")
152 EOF
153 git status --untracked-files=no >actual &&
154 test_i18ncmp expected actual
155 '
156
157
158 test_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 &&
166 interactive rebase in progress; onto $ONTO
167 Last command done (1 command done):
168 pick $LAST_COMMIT one_second
169 No commands remaining.
170 You are currently rebasing branch '\''rebase_i_conflicts_second'\'' on '\''$ONTO'\''.
171 (all conflicts fixed: run "git rebase --continue")
172
173 Changes to be committed:
174 (use "git restore --staged <file>..." to unstage)
175 modified: main.txt
176
177 Untracked files not listed (use -u option to show untracked files)
178 EOF
179 git status --untracked-files=no >actual &&
180 test_i18ncmp expected actual
181 '
182
183
184 test_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 &&
198 interactive rebase in progress; onto $ONTO
199 Last commands done (2 commands done):
200 pick $COMMIT2 two_rebase_i
201 edit $COMMIT3 three_rebase_i
202 No commands remaining.
203 You 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
207 nothing to commit (use -u to show untracked files)
208 EOF
209 git status --untracked-files=no >actual &&
210 test_i18ncmp expected actual
211 '
212
213
214 test_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 &&
231 interactive rebase in progress; onto $ONTO
232 Last commands done (2 commands done):
233 pick $COMMIT2 two_split
234 edit $COMMIT3 three_split
235 Next command to do (1 remaining command):
236 pick $COMMIT4 four_split
237 (use "git rebase --edit-todo" to view and edit)
238 You are currently splitting a commit while rebasing branch '\''split_commit'\'' on '\''$ONTO'\''.
239 (Once your working directory is clean, run "git rebase --continue")
240
241 Changes 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
246 no changes added to commit (use "git add" and/or "git commit -a")
247 EOF
248 git status --untracked-files=no >actual &&
249 test_i18ncmp expected actual
250 '
251
252
253 test_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 &&
269 interactive rebase in progress; onto $ONTO
270 Last commands done (3 commands done):
271 pick $COMMIT3 three_amend
272 edit $COMMIT4 four_amend
273 (see more in file .git/rebase-merge/done)
274 No commands remaining.
275 You 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
279 nothing to commit (use -u to show untracked files)
280 EOF
281 git status --untracked-files=no >actual &&
282 test_i18ncmp expected actual
283 '
284
285
286 test_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
296 test_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 &&
307 interactive rebase in progress; onto $ONTO
308 Last commands done (2 commands done):
309 edit $COMMIT2 two_edits
310 edit $COMMIT3 three_edits
311 Next command to do (1 remaining command):
312 pick $COMMIT4 four_edits
313 (use "git rebase --edit-todo" to view and edit)
314 You 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
318 nothing to commit (use -u to show untracked files)
319 EOF
320 git status --untracked-files=no >actual &&
321 test_i18ncmp expected actual
322 '
323
324
325 test_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 &&
338 interactive rebase in progress; onto $ONTO
339 Last commands done (2 commands done):
340 edit $COMMIT2 two_edits
341 edit $COMMIT3 three_edits
342 Next command to do (1 remaining command):
343 pick $COMMIT4 four_edits
344 (use "git rebase --edit-todo" to view and edit)
345 You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
346 (Once your working directory is clean, run "git rebase --continue")
347
348 Changes 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
353 no changes added to commit (use "git add" and/or "git commit -a")
354 EOF
355 git status --untracked-files=no >actual &&
356 test_i18ncmp expected actual
357 '
358
359
360 test_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 &&
373 interactive rebase in progress; onto $ONTO
374 Last commands done (2 commands done):
375 edit $COMMIT2 two_edits
376 edit $COMMIT3 three_edits
377 Next command to do (1 remaining command):
378 pick $COMMIT4 four_edits
379 (use "git rebase --edit-todo" to view and edit)
380 You 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
384 nothing to commit (use -u to show untracked files)
385 EOF
386 git status --untracked-files=no >actual &&
387 test_i18ncmp expected actual
388 '
389
390
391 test_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 &&
404 interactive rebase in progress; onto $ONTO
405 Last commands done (2 commands done):
406 edit $COMMIT2 two_edits
407 edit $COMMIT3 three_edits
408 Next command to do (1 remaining command):
409 pick $COMMIT4 four_edits
410 (use "git rebase --edit-todo" to view and edit)
411 You 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
415 nothing to commit (use -u to show untracked files)
416 EOF
417 git status --untracked-files=no >actual &&
418 test_i18ncmp expected actual
419 '
420
421
422 test_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 &&
436 interactive rebase in progress; onto $ONTO
437 Last commands done (2 commands done):
438 edit $COMMIT2 two_edits
439 edit $COMMIT3 three_edits
440 Next command to do (1 remaining command):
441 pick $COMMIT4 four_edits
442 (use "git rebase --edit-todo" to view and edit)
443 You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
444 (Once your working directory is clean, run "git rebase --continue")
445
446 Changes 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
451 no changes added to commit (use "git add" and/or "git commit -a")
452 EOF
453 git status --untracked-files=no >actual &&
454 test_i18ncmp expected actual
455 '
456
457
458 test_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 &&
472 interactive rebase in progress; onto $ONTO
473 Last commands done (2 commands done):
474 edit $COMMIT2 two_edits
475 edit $COMMIT3 three_edits
476 Next command to do (1 remaining command):
477 pick $COMMIT4 four_edits
478 (use "git rebase --edit-todo" to view and edit)
479 You 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
483 nothing to commit (use -u to show untracked files)
484 EOF
485 git status --untracked-files=no >actual &&
486 test_i18ncmp expected actual
487 '
488
489
490 test_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 &&
505 interactive rebase in progress; onto $ONTO
506 Last commands done (2 commands done):
507 edit $COMMIT2 two_edits
508 edit $COMMIT3 three_edits
509 Next command to do (1 remaining command):
510 pick $COMMIT4 four_edits
511 (use "git rebase --edit-todo" to view and edit)
512 You 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
516 nothing to commit (use -u to show untracked files)
517 EOF
518 git status --untracked-files=no >actual &&
519 test_i18ncmp expected actual
520 '
521
522
523 test_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 &&
539 interactive rebase in progress; onto $ONTO
540 Last commands done (2 commands done):
541 edit $COMMIT2 two_edits
542 edit $COMMIT3 three_edits
543 Next command to do (1 remaining command):
544 pick $COMMIT4 four_edits
545 (use "git rebase --edit-todo" to view and edit)
546 You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
547 (Once your working directory is clean, run "git rebase --continue")
548
549 Changes 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
554 no changes added to commit (use "git add" and/or "git commit -a")
555 EOF
556 git status --untracked-files=no >actual &&
557 test_i18ncmp expected actual
558 '
559
560
561 test_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 &&
577 interactive rebase in progress; onto $ONTO
578 Last commands done (2 commands done):
579 edit $COMMIT2 two_edits
580 edit $COMMIT3 three_edits
581 Next command to do (1 remaining command):
582 pick $COMMIT4 four_edits
583 (use "git rebase --edit-todo" to view and edit)
584 You 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
588 nothing to commit (use -u to show untracked files)
589 EOF
590 git status --untracked-files=no >actual &&
591 test_i18ncmp expected actual
592 '
593
594
595 test_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
604 test_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 &&
610 On branch am_already_exists
611 You 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
616 nothing to commit (use -u to show untracked files)
617 EOF
618 git status --untracked-files=no >actual &&
619 test_i18ncmp expected actual
620 '
621
622
623 test_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 &&
632 On branch am_not_exists
633 You 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
638 nothing to commit (use -u to show untracked files)
639 EOF
640 git status --untracked-files=no >actual &&
641 test_i18ncmp expected actual
642 '
643
644
645 test_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 &&
655 On branch am_empty
656 You are in the middle of an am session.
657 The current patch is empty.
658 (use "git am --skip" to skip this patch)
659 (use "git am --abort" to restore the original branch)
660
661 nothing to commit (use -u to show untracked files)
662 EOF
663 git status --untracked-files=no >actual &&
664 test_i18ncmp expected actual
665 '
666
667
668 test_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 &&
680 HEAD detached at $TGT
681 You are currently bisecting, started from branch '\''bisect'\''.
682 (use "git bisect reset" to get back to the original branch)
683
684 nothing to commit (use -u to show untracked files)
685 EOF
686 git status --untracked-files=no >actual &&
687 test_i18ncmp expected actual
688 '
689
690
691 test_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 &&
703 rebase in progress; onto $ONTO
704 You are currently rebasing branch '\''statushints_disabled'\'' on '\''$ONTO'\''.
705
706 Unmerged paths:
707 both modified: main.txt
708
709 no changes added to commit
710 EOF
711 git status --untracked-files=no >actual &&
712 test_i18ncmp expected actual
713 '
714
715
716 test_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
728 test_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 &&
733 On branch cherry_branch
734 You 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
738 Unmerged paths:
739 (use "git add <file>..." to mark resolution)
740 both modified: main.txt
741
742 no changes added to commit (use "git add" and/or "git commit -a")
743 EOF
744 git status --untracked-files=no >actual &&
745 test_i18ncmp expected actual
746 '
747
748
749 test_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 &&
757 On branch cherry_branch
758 You 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
762 Changes to be committed:
763 modified: main.txt
764
765 Untracked files not listed (use -u option to show untracked files)
766 EOF
767 git status --untracked-files=no >actual &&
768 test_i18ncmp expected actual
769 '
770
771 test_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 &&
778 On branch cherry_branch
779 Cherry-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
783 nothing to commit (use -u to show untracked files)
784 EOF
785 git status --untracked-files=no >actual &&
786 test_i18ncmp expected actual
787 '
788
789 test_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
798 test_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
805 test_expect_success 'status showing detached at and from a tag' '
806 test_commit atag tagging &&
807 git checkout atag &&
808 cat >expected <<\EOF &&
809 HEAD detached at atag
810 nothing to commit (use -u to show untracked files)
811 EOF
812 git status --untracked-files=no >actual &&
813 test_i18ncmp expected actual &&
814
815 git reset --hard HEAD^ &&
816 cat >expected <<\EOF &&
817 HEAD detached from atag
818 nothing to commit (use -u to show untracked files)
819 EOF
820 git status --untracked-files=no >actual &&
821 test_i18ncmp expected actual
822 '
823
824 test_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 &&
835 On branch master
836 You 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
840 Unmerged paths:
841 (use "git restore --staged <file>..." to unstage)
842 (use "git add <file>..." to mark resolution)
843 both modified: to-revert.txt
844
845 no changes added to commit (use "git add" and/or "git commit -a")
846 EOF
847 git status --untracked-files=no >actual &&
848 test_i18ncmp expected actual
849 '
850
851 test_expect_success 'status while reverting commit (conflicts resolved)' '
852 echo reverted >to-revert.txt &&
853 git add to-revert.txt &&
854 cat >expected <<EOF &&
855 On branch master
856 You 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
860 Changes to be committed:
861 (use "git restore --staged <file>..." to unstage)
862 modified: to-revert.txt
863
864 Untracked files not listed (use -u option to show untracked files)
865 EOF
866 git status --untracked-files=no >actual &&
867 test_i18ncmp expected actual
868 '
869
870 test_expect_success 'status after reverting commit' '
871 git revert --continue &&
872 cat >expected <<\EOF &&
873 On branch master
874 nothing to commit (use -u to show untracked files)
875 EOF
876 git status --untracked-files=no >actual &&
877 test_i18ncmp expected actual
878 '
879
880 test_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 &&
887 On branch master
888 Revert currently in progress.
889 (run "git revert --continue" to continue)
890 (use "git revert --abort" to cancel the revert operation)
891
892 nothing to commit (use -u to show untracked files)
893 EOF
894 git status --untracked-files=no >actual &&
895 test_i18ncmp expected actual
896 '
897
898 test_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
907 test_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 &&
914 interactive rebase in progress; onto $ONTO
915 Last command done (1 command done):
916 exec exit 15
917 No commands remaining.
918 You 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
922 nothing to commit (use -u to show untracked files)
923 EOF
924 git status --untracked-files=no >actual &&
925 test_i18ncmp expected actual
926 '
927
928 test_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 &&
938 interactive rebase in progress; onto $ONTO
939 Last commands done (2 commands done):
940 pick $COMMIT2 two_commit
941 exec exit 15
942 Next 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)
946 You 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
950 nothing to commit (use -u to show untracked files)
951 EOF
952 git status --untracked-files=no >actual &&
953 test_i18ncmp expected actual
954 '
955
956 test_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 &&
966 interactive rebase in progress; onto $ONTO
967 Last commands done (3 commands done):
968 pick $COMMIT2 two_commit
969 exec exit 15
970 (see more in file .git/rebase-merge/done)
971 Next 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)
975 You 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
979 nothing to commit (use -u to show untracked files)
980 EOF
981 git status --untracked-files=no >actual &&
982 test_i18ncmp expected actual
983 '
984
985 test_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 &&
990 On branch several_commits
991 No commands done.
992 Next command to do (1 remaining command):
993 pick $COMMIT four_commit
994 (use "git rebase --edit-todo" to view and edit)
995 You 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
999 nothing to commit (use -u to show untracked files)
1000 EOF
1001 test_i18ncmp expected actual
1002 '
1003
1004 test_done