[PATCH 2/2] rebase -i: fix post-rewrite hook with failed exec command

2015-05-22 Thread Matthieu Moy
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.
---
 git-rebase--interactive.sh   | 10 +-
 t/t5407-post-rewrite-hook.sh |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 08e5d86..1c321e4 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -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)
@@ -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.
@@ -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
diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh
index 53a4062..06ffad6 100755
--- a/t/t5407-post-rewrite-hook.sh
+++ b/t/t5407-post-rewrite-hook.sh
@@ -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 

---
https://github.com/git/git/pull/138

[PATCH 2/2] rebase -i: fix post-rewrite hook with failed exec command

2015-05-21 Thread Matthieu Moy
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@imag.fr
---
I'm afraid I'm the one to blame for the bug :-(.

 git-rebase--interactive.sh   | 10 +-
 t/t5407-post-rewrite-hook.sh |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 08e5d86..1c321e4 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -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)
@@ -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.
@@ -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
diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh
index ecef820..24ba796 100755
--- a/t/t5407-post-rewrite-hook.sh
+++ b/t/t5407-post-rewrite-hook.sh
@@ -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
-- 
2.4.1.171.g060e6ae.dirty

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html