Read in to-do list lines as

    command args

instead of

    command sha1 rest

so that to-do list command lines can specify additional arguments
apart from the commit hash and the log message title, which become
the non-options in `args`. Loop over `args`, put all options (an
argument beginning with a dash) in `opts`, stop the loop on the first
non-option and assign it to `sha1`. The loop does not know the
options it parses so that options that take an argument themselves
are not supported at the moment. Neither are options that contain
spaces because the shell expansion of `args` in `do_next` interprets
white space characters as argument separator, that is a command line
like

    pick --author "A U Thor" fa1afe1 Some change

is parsed as the pick command

    pick --author

and the commit hash

    "A

which obviously results in an unknown revision error. For the sake of
completeness, in the example above the message title variable `rest`
is assigned the string 'U Thor" fa1afe1 Some change' (without the
single quotes).

Print an error message for unknown or unsupported command line
options, which means an error for all specified options at the
moment. Cleanly break the `do_next` loop by assigning the special
value 'unknown' to the local variable `command`, which triggers the
unknown command case in `do_cmd`.

The to-do list is also parsed when the commit hashes are translated
between long and short format before and after the to-do list is
edited. Apply the same procedure as in `do_cmd` with the exception
that we only care about where the options stop and the commit hash
begins. Do not reject any options when transforming the commit
hashes.

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

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 8dde8e6..ff4ba7f 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -590,8 +590,26 @@ do_pick () {
 
 do_replay () {
        command=$1
-       sha1=$2
-       rest=$3
+       shift
+
+       opts=
+       while test $# -gt 0
+       do
+               case "$1" in
+               -*)
+                       warn "Unknown option: $1"
+                       command=unknown
+                       ;;
+               *)
+                       break
+                       ;;
+               esac
+               opts="$opts $(git rev-parse --sq-quote "$1")"
+               shift
+       done
+       sha1=$1
+       shift
+       rest=$*
 
        case "$command" in
        pick|p)
@@ -674,7 +692,7 @@ do_replay () {
 
 do_next () {
        rm -f "$msg" "$author_script" "$amend" || exit
-       read -r command sha1 rest <"$todo"
+       read -r command args <"$todo"
 
        case "$command" in
        "$comment_char"*|''|noop)
@@ -719,7 +737,7 @@ do_next () {
                fi
                ;;
        *)
-               do_replay $command $sha1 "$rest"
+               do_replay $command $args
                ;;
        esac
        test -s "$todo" && return
@@ -799,19 +817,34 @@ skip_unnecessary_picks () {
 }
 
 transform_todo_ids () {
-       while read -r command rest
+       while read -r command args
        do
                case "$command" in
                "$comment_char"* | exec)
                        # Be careful for oddball commands like 'exec'
                        # that do not have a SHA-1 at the beginning of $rest.
+                       newargs=\ $args
                        ;;
                *)
-                       sha1=$(git rev-parse --verify --quiet "$@" ${rest%% *}) 
&&
-                       rest="$sha1 ${rest#* }"
+                       newargs=
+                       sha1=
+                       for arg in $args
+                       do
+                               case "$arg" in
+                               -*)
+                                       newargs="$newargs $arg"
+                                       ;;
+                               *)
+                                       test -z "$sha1" &&
+                                               sha1=$(git rev-parse --verify 
--quiet "$@" $arg) &&
+                                               arg=$sha1
+                                       newargs="$newargs $arg"
+                                       ;;
+                               esac
+                       done
                        ;;
                esac
-               printf '%s\n' "$command${rest:+ }$rest"
+               printf '%s\n' "$command$newargs"
        done <"$todo" >"$todo.new" &&
        mv -f "$todo.new" "$todo"
 }
-- 
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