rebase -i: clean error message for --continue after failed exec

After an "exec false" stops the rebase and gives the control back to the user, if changes are added to the index, "rebase --continue" fails with this message, which may technically be correct, but does not point at the real problem: .../git-rebase--interactive: line 774: .../.git/rebase-merge/author-script: No such file or directory We could try auto-amending HEAD, but this goes against the logic of .git/rebase-merge/author-script (see also the testcase 'auto-amend only edited commits after "edit"' in t3404-rebase-interactive.sh) to auto-amend something the user hasn't explicitely asked to edit. Instead of doing anything automatically, detect the situation and give a clean error message. While we're there, also clarify the error message in case '. "$author_script"' fails, which now corresponds to really weird senario where the author script exists but can't be read. Test-case-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Matthieu Moy committed Aug 24, 2011 at 16:01 UTC ffaaed88aed2e9b7936a0c5b43c1b198db0dc2ab
2 files changed +31 -1
git-rebase--interactive.sh
+17 -1
@@ -647,8 +647,24 @@ continue)
647 then
648 : Nothing to commit -- skip this
649 else
650 + if ! test -f "$author_script"
651 + then
652 + die "You have staged changes in your working tree. If these changes are meant to be
653 +squashed into the previous commit, run:
654 +
655 + git commit --amend
656 +
657 +If they are meant to go into a new commit, run:
658 +
659 + git commit
660 +
661 +In both case, once you're done, continue with:
662 +
663 + git rebase --continue
664 +"
665 + fi
666 . "$author_script" ||
651 - die "Cannot find the author identity"
667 + die "Error trying to find the author identity to amend commit"
668 current_head=
669 if test -f "$amend"
670 then
t/t3404-rebase-interactive.sh
+14
@@ -527,6 +527,20 @@ test_expect_success 'auto-amend only edited commits after "edit"' '
527 git rebase --abort
528 '
529
530 +test_expect_success 'clean error after failed "exec"' '
531 + test_tick &&
532 + test_when_finished "git rebase --abort || :" &&
533 + (
534 + FAKE_LINES="1 exec_false" &&
535 + export FAKE_LINES &&
536 + test_must_fail git rebase -i HEAD^
537 + ) &&
538 + echo "edited again" > file7 &&
539 + git add file7 &&
540 + test_must_fail git rebase --continue 2>error &&
541 + grep "You have staged changes in your working tree." error
542 +'
543 +
544 test_expect_success 'rebase a detached HEAD' '
545 grandparent=$(git rev-parse HEAD~2) &&
546 git checkout $(git rev-parse HEAD) &&