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

1  2 
git-rebase--interactive.sh
t/t3404-rebase-interactive.sh
index f01637b1fdeb7f021b74171135ac0e7dba566542,c42ba34c6fecc0eb9f30b5fdcfc5f7f576b61250..d65c06eff36f09c982d66b11684d8f3ab3784393
@@@ -512,7 -512,7 +512,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|drop|d)
                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.
@@@ -729,8 -732,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"
@@@ -750,15 -753,10 +750,15 @@@ collapse_todo_ids() 
  # "pick sha1 fixup!/squash! msg" appears in it so that the latter
  # comes immediately after the former, and change "pick" to
  # "fixup"/"squash".
 +#
 +# Note that if the config has specified a custom instruction format
 +# each log message will be re-retrieved in order to normalize the
 +# autosquash arrangement
  rearrange_squash () {
        # extract fixup!/squash! lines and resolve any referenced sha1's
        while read -r pick sha1 message
        do
 +              test -z "${format}" || message=$(git log -n 1 --format="%s" ${sha1})
                case "$message" in
                "squash! "*|"fixup! "*)
                        action="${message%%!*}"
                *" $sha1 "*) continue ;;
                esac
                printf '%s\n' "$pick $sha1 $message"
 +              test -z "${format}" || message=$(git log -n 1 --format="%s" ${sha1})
                used="$used$sha1 "
                while read -r squash action msg_prefix msg_content
                do
                                case "$message" in "$msg_content"*) emit=1;; esac ;;
                        esac
                        if test $emit = 1; then
 -                              real_prefix=$(echo "$msg_prefix" | sed "s/,/! /g")
 -                              printf '%s\n' "$action $squash ${real_prefix}$msg_content"
 +                              if test -n "${format}"
 +                              then
 +                                      msg_content=$(git log -n 1 --format="${format}" ${squash})
 +                              else
 +                                      msg_content="$(echo "$msg_prefix" | sed "s/,/! /g")$msg_content"
 +                              fi
 +                              printf '%s\n' "$action $squash $msg_content"
                                used="$used$squash "
                        fi
                done <"$1.sq"
@@@ -857,7 -849,8 +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
  
        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
  
  # 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 -998,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
@@@ -1044,11 -1032,7 +1040,11 @@@ continue
        # do we have anything to commit?
        if git diff-index --cached --quiet HEAD --
        then
 -              : Nothing to commit -- skip this
 +              # Nothing to commit -- skip this commit
 +
 +              test ! -f "$GIT_DIR"/CHERRY_PICK_HEAD ||
 +              rm "$GIT_DIR"/CHERRY_PICK_HEAD ||
 +              die "Could not remove CHERRY_PICK_HEAD"
        else
                if ! test -f "$author_script"
                then
@@@ -1086,10 -1070,7 +1082,10 @@@ first and then run 'git rebase --contin
                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
        revisions=$onto...$orig_head
        shortrevisions=$shorthead
  fi
 -git rev-list $merges_option --pretty=oneline --reverse --left-right --topo-order \
 +format=$(git config --get rebase.instructionFormat)
 +# the 'rev-list .. | sed' requires %m to parse; the instruction requires %H to parse
 +git rev-list $merges_option --format="%m%H ${format:-%s}" \
 +      --reverse --left-right --topo-order \
        $revisions ${restrict_revision+^$restrict_revision} | \
        sed -n "s/^>//p" |
  while read -r sha1 rest
index d26e3f57dcbc18585c360ee78a725708f5a69207,88d7d5358ac37ce01c68a7e04f050e843acc1989..3de0b1dcfdc9c5948c10e5e8c107a3820df9f357
@@@ -961,13 -961,13 +961,13 @@@ test_expect_success 'rebase -i produce
        set_fake_editor &&
        git rebase -i --onto I F branch-reflog-test &&
        cat >expect <<-\EOF &&
 -      rebase -i (start): checkout I
 -      rebase -i (pick): G
 -      rebase -i (pick): H
        rebase -i (finish): returning to refs/heads/branch-reflog-test
 +      rebase -i (pick): H
 +      rebase -i (pick): G
 +      rebase -i (start): checkout I
        EOF
 -      tail -n 4 .git/logs/HEAD |
 -      sed -e "s/.*    //" >actual &&
 +      git reflog -n4 HEAD |
 +      sed "s/[^:]*: //" >actual &&
        test_cmp expect actual
  '
  
@@@ -1102,27 -1102,6 +1102,27 @@@ test_expect_success 'rebase -i commits 
        test $(git cat-file commit HEAD | sed -ne \$p) = I
  '
  
 +test_expect_success 'rebase --continue removes CHERRY_PICK_HEAD' '
 +      git checkout -b commit-to-skip &&
 +      for double in X 3 1
 +      do
 +              test_seq 5 | sed "s/$double/&&/" >seq &&
 +              git add seq &&
 +              test_tick &&
 +              git commit -m seq-$double
 +      done &&
 +      git tag seq-onto &&
 +      git reset --hard HEAD~2 &&
 +      git cherry-pick seq-onto &&
 +      set_fake_editor &&
 +      test_must_fail env FAKE_LINES= git rebase -i seq-onto &&
 +      test -d .git/rebase-merge &&
 +      git rebase --continue &&
 +      git diff --exit-code seq-onto &&
 +      test ! -d .git/rebase-merge &&
 +      test ! -f .git/CHERRY_PICK_HEAD
 +'
 +
  rebase_setup_and_clean () {
        test_when_finished "
                git checkout master &&
@@@ -1227,6 -1206,21 +1227,21 @@@ test_expect_success 'static check of ba
        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