git-rebase--interactive prints summary messages of the commits it
creates in the final history only if the `--verbose` option is
specified by the user and suppresses them otherwise. This behaviour
is implemented by wrapping git-commit calls in a shell function named
`output` which redirects stderr to stdout, captures stdout in a shell
variable and ignores its contents unless the command exits with an
error status.

The command lines used to implement the to-do list commands `reword`
and `squash` print diagnostic messages even in non-verbose mode. The
reason for this inconsistency is that both commands launch the log
message editor `GIT_EDITOR` which usually requires a working terminal
attached to stdin. Wrapping the `reword` and `squash` command lines
in `output` would seemingly freeze the terminal (see commit 7725cb5,
"rebase -i: fix reword when using a terminal editor"). Temporarily
redirect the `GIT_EDITOR` output to a third file descriptor in order
to ship it around the capture stream. Wrap the remaining git-commit
command lines in the new `output`. At the moment, it is still no
alternative to pass the `--quiet` option in non-verbose mode because
git-merge-recursive for instance prints some messages regardless of
the verbosity level.

In order to temporarily redirect the editor output, the new
definition of `output` creates a wrapper script in the state
directory to be used as `GIT_EDITOR`. Make sure the state directory
exists before `output` is called for the first time.

Signed-off-by: Fabian Ruch <baf...@gmail.com>
---
 git-rebase--interactive.sh |  9 +++++----
 git-rebase.sh              | 13 +++++++++++--
 t/t3406-rebase-message.sh  | 18 ++++++++++++++++++
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index eb1dcda..cebe742 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -504,7 +504,7 @@ do_next () {
 
                mark_action_done
                do_pick $sha1 "$rest"
-               git commit --allow-empty --amend --no-post-rewrite 
${gpg_sign_opt:+"$gpg_sign_opt"} || {
+               output git commit --allow-empty --amend --no-post-rewrite 
${gpg_sign_opt:+"$gpg_sign_opt"} || {
                        warn "Could not amend commit after successfully picking 
$sha1... $rest"
                        warn "This is most likely due to an empty commit 
message, or the pre-commit hook"
                        warn "failed. If the pre-commit hook failed, you may 
need to resolve the issue before"
@@ -558,14 +558,14 @@ do_next () {
                        # This is the final command of this squash/fixup group
                        if test -f "$fixup_msg"
                        then
-                               do_with_author git commit --allow-empty-message 
--allow-empty \
+                               do_with_author output git commit 
--allow-empty-message --allow-empty \
                                        --amend --no-verify -F "$fixup_msg" \
                                        ${gpg_sign_opt:+"$gpg_sign_opt"} ||
                                        die_failed_squash $sha1 "$rest"
                        else
                                cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
                                rm -f "$GIT_DIR"/MERGE_MSG
-                               do_with_author git commit --allow-empty --amend 
--no-verify -F "$GIT_DIR"/SQUASH_MSG -e \
+                               do_with_author output git commit --allow-empty 
--amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \
                                        ${gpg_sign_opt:+"$gpg_sign_opt"} ||
                                        die_failed_squash $sha1 "$rest"
                        fi
@@ -923,6 +923,8 @@ EOF
        ;;
 esac
 
+mkdir -p "$state_dir" || die "Could not create temporary $state_dir"
+
 git var GIT_COMMITTER_IDENT >/dev/null ||
        die "You need to set your committer info first"
 
@@ -938,7 +940,6 @@ then
 fi
 
 orig_head=$(git rev-parse --verify HEAD) || die "No HEAD?"
-mkdir -p "$state_dir" || die "Could not create temporary $state_dir"
 
 : > "$state_dir"/interactive || die "Could not mark as interactive"
 write_basic_state
diff --git a/git-rebase.sh b/git-rebase.sh
index 55da9db..46141b8 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -131,9 +131,18 @@ write_basic_state () {
 output () {
        case "$verbose" in
        '')
-               output=$("$@" 2>&1 )
+               cat >"$state_dir"/editor.sh <<-EOF
+               #!/bin/sh
+               $(git var GIT_EDITOR) "\$@" >&3
+               EOF
+               chmod +x "$state_dir"/editor.sh
+               (
+                       GIT_EDITOR=$(git rev-parse --sq-quote 
"$state_dir"/editor.sh)
+                       export GIT_EDITOR
+                       "$@" 3>&1 1>"$state_dir"/output 2>&1
+               )
                status=$?
-               test $status != 0 && printf "%s\n" "$output"
+               test $status != 0 && cat "$state_dir"/output
                return $status
                ;;
        *)
diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh
index 0392e36..d7003a9 100755
--- a/t/t3406-rebase-message.sh
+++ b/t/t3406-rebase-message.sh
@@ -4,6 +4,8 @@ test_description='messages from rebase operation'
 
 . ./test-lib.sh
 
+. "$TEST_DIRECTORY"/lib-rebase.sh
+
 test_expect_success 'setup' '
        test_commit O fileO &&
        test_commit X fileX &&
@@ -84,4 +86,20 @@ test_expect_success 'rebase --onto outputs the invalid ref' '
        test_i18ngrep "invalid-ref" err
 '
 
+test_expect_success 'commit summary is suppressed in non-verbose mode' '
+       git checkout --detach Y &&
+       cat >expected.out <<-EOF &&
+       Rebasing (1/5)\r
+       Rebasing (2/5)\r
+       Rebasing (3/5)\r
+       Rebasing (4/5)\r
+       Rebasing (5/5)\r
+       EOF
+       set_fake_editor &&
+       FAKE_LINES="reword 1 fixup 2 fixup 3 4 squash 5" \
+       git rebase -i --root >actual.out.tmp &&
+       sed -e "s/\r/\\\\r\n/g" <actual.out.tmp >actual.out &&
+       test_cmp expected.out actual.out
+'
+
 test_done
-- 
2.0.1

--
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

Reply via email to