Merge branch 'gr/rebase-i-drop-warn' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 16 Oct 2015 21:32:43 +0000 (14:32 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 16 Oct 2015 21:32:43 +0000 (14:32 -0700)
"git rebase -i" had a minor regression recently, which stopped
considering a line that begins with an indented '#' in its insn
sheet not a comment, which is now fixed.

* gr/rebase-i-drop-warn:
rebase-i: loosen over-eager check_bad_cmd check
rebase-i: explicitly accept tab as separator in commands

git-rebase--interactive.sh
t/t3404-rebase-interactive.sh
index f01637b1fdeb7f021b74171135ac0e7dba566542..d65c06eff36f09c982d66b11684d8f3ab3784393 100644 (file)
@@ -729,8 +729,8 @@ transform_todo_ids () {
                        # that do not have a SHA-1 at the beginning of $rest.
                        ;;
                *)
-                       sha1=$(git rev-parse --verify --quiet "$@" ${rest%% *}) &&
-                       rest="$sha1 ${rest#* }"
+                       sha1=$(git rev-parse --verify --quiet "$@" ${rest%%[     ]*}) &&
+                       rest="$sha1 ${rest#*[    ]}"
                        ;;
                esac
                printf '%s\n' "$command${rest:+ }$rest"
@@ -857,7 +857,8 @@ add_exec_commands () {
 # Check if the SHA-1 passed as an argument is a
 # correct one, if not then print $2 in "$todo".badsha
 # $1: the SHA-1 to test
-# $2: the line to display if incorrect SHA-1
+# $2: the line number of the input
+# $3: the input filename
 check_commit_sha () {
        badsha=0
        if test -z $1
@@ -873,9 +874,10 @@ check_commit_sha () {
 
        if test $badsha -ne 0
        then
+               line="$(sed -n -e "${2}p" "$3")"
                warn "Warning: the SHA-1 is missing or isn't" \
                        "a commit in the following line:"
-               warn " - $2"
+               warn " - $line"
                warn
        fi
 
@@ -886,37 +888,31 @@ check_commit_sha () {
 # from the todolist in stdin
 check_bad_cmd_and_sha () {
        retval=0
-       git stripspace --strip-comments |
-       (
-               while read -r line
-               do
-                       IFS=' '
-                       set -- $line
-                       command=$1
-                       sha1=$2
-
-                       case $command in
-                       ''|noop|x|"exec")
-                               # Doesn't expect a SHA-1
-                               ;;
-                       pick|p|drop|d|reword|r|edit|e|squash|s|fixup|f)
-                               if ! check_commit_sha $sha1 "$line"
-                               then
-                                       retval=1
-                               fi
-                               ;;
-                       *)
-                               warn "Warning: the command isn't recognized" \
-                                       "in the following line:"
-                               warn " - $line"
-                               warn
+       lineno=0
+       while read -r command rest
+       do
+               lineno=$(( $lineno + 1 ))
+               case $command in
+               "$comment_char"*|''|noop|x|exec)
+                       # Doesn't expect a SHA-1
+                       ;;
+               pick|p|drop|d|reword|r|edit|e|squash|s|fixup|f)
+                       if ! check_commit_sha "${rest%%[        ]*}" "$lineno" "$1"
+                       then
                                retval=1
-                               ;;
-                       esac
-               done
-
-               return $retval
-       )
+                       fi
+                       ;;
+               *)
+                       line="$(sed -n -e "${lineno}p" "$1")"
+                       warn "Warning: the command isn't recognized" \
+                               "in the following line:"
+                       warn " - $line"
+                       warn
+                       retval=1
+                       ;;
+               esac
+       done <"$1"
+       return $retval
 }
 
 # Print the list of the SHA-1 of the commits
@@ -1010,7 +1006,7 @@ check_todo_list () {
                ;;
        esac
 
-       if ! check_bad_cmd_and_sha <"$todo"
+       if ! check_bad_cmd_and_sha "$todo"
        then
                raise_error=t
        fi
index d26e3f57dcbc18585c360ee78a725708f5a69207..3de0b1dcfdc9c5948c10e5e8c107a3820df9f357 100755 (executable)
@@ -1227,6 +1227,21 @@ test_expect_success 'static check of bad command' '
        test C = $(git cat-file commit HEAD^ | sed -ne \$p)
 '
 
+test_expect_success 'tabs and spaces are accepted in the todolist' '
+       rebase_setup_and_clean indented-comment &&
+       write_script add-indent.sh <<-\EOF &&
+       (
+               # Turn single spaces into space/tab mix
+               sed "1s/ /      /g; 2s/ /  /g; 3s/ /    /g" "$1"
+               printf "\n\t# comment\n #more\n\t # comment\n"
+       ) >$1.new
+       mv "$1.new" "$1"
+       EOF
+       test_set_editor "$(pwd)/add-indent.sh" &&
+       git rebase -i HEAD^^^ &&
+       test E = $(git cat-file commit HEAD | sed -ne \$p)
+'
+
 cat >expect <<EOF
 Warning: the SHA-1 is missing or isn't a commit in the following line:
  - edit XXXXXXX False commit