`do_pick` is the git-cherry-pick wrapper in git-rebase--interactive
that is used to implement the to-do list command `pick`. To cater for
the different pick behaviours (like `reword`), `do_pick` accepts
several options not only from the git-cherry-pick but also the
git-commit interface. Add the common option `--edit` to let the user
edit the log message of the named commit.

Loop over `$@` to parse the `do_pick` arguments. Assign the local
variable `edit` if one of the options is `--edit` so that the
remainder of `do_pick` can easily check whether the client code asked
to edit the commit message. If one of the options is unknown, mention
it on the console and `die`. Break the loop on the first non-option
and do some sanity checking to ensure that there exactly two
non-options, which are interpreted by the remainder as `<commit>` and
`<title>` like before.

`do_pick` ought to act as a wrapper around `cherry-pick`.
Unfortunately, it cannot just forward `--edit` to the `cherry-pick`
command line. The assembled command line is executed within a command
substitution for controlling the verbosity of `rebase--interactive`.
Passing `--edit` would either hang the terminal or clutter the
substituted command output with control sequences. Execute the
`reword` code from `do_next` instead if the option `--edit` is
specified.

Signed-off-by: Fabian Ruch <baf...@gmail.com>
---
 git-rebase--interactive.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index b50770d..e06d9b6 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -461,7 +461,42 @@ record_in_rewritten() {
        esac
 }
 
+# Apply the changes introduced by the given commit to the current head.
+#
+# do_pick [--edit] <commit> <title>
+#
+# Wrapper around git-cherry-pick.
+#
+# -e, --edit
+#     After picking <commit>, open an editor and let the user edit the
+#     commit message. The editor contents becomes the commit message of
+#     the new head. This creates a fresh commit.
+#
+# <commit>
+#     The commit to cherry-pick.
+#
+# <title>
+#     The commit message title of <commit>. Used for information
+#     purposes only.
 do_pick () {
+       edit=
+       while test $# -gt 0
+       do
+               case "$1" in
+               -e|--edit)
+                       edit=y
+                       ;;
+               -*)
+                       die "do_pick: unrecognized option -- $1"
+                       ;;
+               *)
+                       break
+                       ;;
+               esac
+               shift
+       done
+       test $# -ne 2 && die "do_pick: wrong number of arguments"
+
        if test "$(git rev-parse HEAD)" = "$squash_onto"
        then
                # Set the correct commit message and author info on the
@@ -483,6 +518,23 @@ do_pick () {
                pick_one $1 ||
                        die_with_patch $1 "Could not apply $1... $2"
        fi
+
+       if test -n "$edit"
+       then
+               # TODO: Work around the fact that git-commit lets us
+               # disable either both the pre-commit and the commit-msg
+               # hook or none. Disable the pre-commit hook because the
+               # tree is left unchanged but run the commit-msg hook
+               # from here because the log message is altered.
+               git commit --allow-empty --amend --no-post-rewrite -n 
${gpg_sign_opt:+"$gpg_sign_opt"} &&
+                       if test -x "$GIT_DIR"/hooks/commit-msg
+                       then
+                               "$GIT_DIR"/hooks/commit-msg 
"$GIT_DIR"/COMMIT_EDITMSG
+                       fi || {
+                               warn "Could not amend commit after successfully 
picking $1... $2"
+                               exit_with_patch $1 1
+                       }
+       fi
 }
 
 do_next () {
-- 
2.0.0

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