Skip to content

Commit

Permalink
rebase -i: fix post-rewrite hook with failed exec command
Browse files Browse the repository at this point in the history
Usually, when 'git rebase' stops before completing the rebase, it is to
give the user an opportunity to edit a commit (e.g. with the 'edit'
command). In such cases, 'git rebase' leaves the sha1 of the commit being
rewritten in "$state_dir"/stopped-sha, and subsequent 'git rebase
--continue' will call the post-rewrite hook with this sha1 as <old-sha1>
argument to the post-rewrite hook.

The case of 'git rebase' stopping because of a failed 'exec' command is
different: it gives the opportunity to the user to examine or fix the
failure, but does not stop saying "here's a commit to edit, use
--continue when you're done". So, there's no reason to call the
post-rewrite hook for 'exec' commands. If the user did rewrite the
commit, it would be with 'git commit --amend' which already called the
post-rewrite hook.

Fix the behavior to leave no stopped-sha file in case of failed exec
command, and teach 'git rebase --continue' to skip record_in_rewritten if
no stopped-sha file is found.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
moy authored and gitster committed May 22, 2015
1 parent 1d968ca commit b12d3e9
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 6 deletions.
10 changes: 5 additions & 5 deletions git-rebase--interactive.sh
Expand Up @@ -486,7 +486,7 @@ do_pick () {
}

do_next () {
rm -f "$msg" "$author_script" "$amend" || exit
rm -f "$msg" "$author_script" "$amend" "$state_dir"/stopped-sha || exit
read -r command sha1 rest < "$todo"
case "$command" in
"$comment_char"*|''|noop)
Expand Down Expand Up @@ -576,9 +576,6 @@ do_next () {
read -r command rest < "$todo"
mark_action_done
printf 'Executing: %s\n' "$rest"
# "exec" command doesn't take a sha1 in the todo-list.
# => can't just use $sha1 here.
git rev-parse --verify HEAD > "$state_dir"/stopped-sha
${SHELL:-@SHELL_PATH@} -c "$rest" # Actual execution
status=$?
# Run in subshell because require_clean_work_tree can die.
Expand Down Expand Up @@ -874,7 +871,10 @@ first and then run 'git rebase --continue' again."
fi
fi

record_in_rewritten "$(cat "$state_dir"/stopped-sha)"
if test -r "$state_dir"/stopped-sha
then
record_in_rewritten "$(cat "$state_dir"/stopped-sha)"
fi

require_clean_work_tree "rebase"
do_rest
Expand Down
2 changes: 1 addition & 1 deletion t/t5407-post-rewrite-hook.sh
Expand Up @@ -212,7 +212,7 @@ EOF
verify_hook_input
'

test_expect_failure 'git rebase -i (exec)' '
test_expect_success 'git rebase -i (exec)' '
git reset --hard D &&
clear_hook_input &&
FAKE_LINES="edit 1 exec_false 2" git rebase -i B &&
Expand Down

0 comments on commit b12d3e9

Please sign in to comment.