rebase -i: respect core.commentchar
authorJohn Keeping <john@keeping.me.uk>
Mon, 11 Feb 2013 23:08:04 +0000 (23:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 12 Feb 2013 20:01:42 +0000 (12:01 -0800)
Commit eff80a9 (Allow custom "comment char") introduced a custom comment
character for commit messages but did not teach git-rebase--interactive
to use it.

Change git-rebase--interactive to read core.commentchar and use its
value when generating commit messages and for the command list.

Signed-off-by: John Keeping <john@keeping.me.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-rebase--interactive.sh
t/t3404-rebase-interactive.sh

index 44901d53c43d972e03a71bfbe0b769f2e8f22d7b..5db9e2d3f3666af232e7063bf2c46f3ea8ce79c1 100644 (file)
@@ -80,6 +80,9 @@ rewritten_pending="$state_dir"/rewritten-pending
 GIT_CHERRY_PICK_HELP="$resolvemsg"
 export GIT_CHERRY_PICK_HELP
 
+comment_char=$(git config --get core.commentchar 2>/dev/null | cut -c1)
+: ${comment_char:=#}
+
 warn () {
        printf '%s\n' "$*" >&2
 }
@@ -105,8 +108,8 @@ mark_action_done () {
        sed -e 1q < "$todo" >> "$done"
        sed -e 1d < "$todo" >> "$todo".new
        mv -f "$todo".new "$todo"
-       new_count=$(sane_grep -c '^[^#]' < "$done")
-       total=$(($new_count+$(sane_grep -c '^[^#]' < "$todo")))
+       new_count=$(git stripspace --strip-comments <"$done" | wc -l)
+       total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l)))
        if test "$last_count" != "$new_count"
        then
                last_count=$new_count
@@ -116,19 +119,19 @@ mark_action_done () {
 }
 
 append_todo_help () {
-       cat >> "$todo" << EOF
-#
-Commands:
- p, pick = use commit
- r, reword = use commit, but edit the commit message
- e, edit = use commit, but stop for amending
- s, squash = use commit, but meld into previous commit
- f, fixup = like "squash", but discard this commit's log message
- x, exec = run command (the rest of the line) using shell
-#
-These lines can be re-ordered; they are executed from top to bottom.
-#
-If you remove a line here THAT COMMIT WILL BE LOST.
+       git stripspace --comment-lines >>"$todo" <<\EOF
+
+Commands:
+ p, pick = use commit
+ r, reword = use commit, but edit the commit message
+ e, edit = use commit, but stop for amending
+ s, squash = use commit, but meld into previous commit
+ f, fixup = like "squash", but discard this commit's log message
+ x, exec = run command (the rest of the line) using shell
+
+These lines can be re-ordered; they are executed from top to bottom.
+
+If you remove a line here THAT COMMIT WILL BE LOST.
 EOF
 }
 
@@ -179,7 +182,7 @@ die_abort () {
 }
 
 has_action () {
-       sane_grep '^[^#]' "$1" >/dev/null
+       test -n "$(git stripspace --strip-comments <"$1")"
 }
 
 is_empty_commit() {
@@ -358,10 +361,10 @@ update_squash_messages () {
        if test -f "$squash_msg"; then
                mv "$squash_msg" "$squash_msg".bak || exit
                count=$(($(sed -n \
-                       -e "1s/^# This is a combination of \(.*\) commits\./\1/p" \
+                       -e "1s/^. This is a combination of \(.*\) commits\./\1/p" \
                        -e "q" < "$squash_msg".bak)+1))
                {
-                       echo "# This is a combination of $count commits."
+                       printf '%s\n' "$comment_char This is a combination of $count commits."
                        sed -e 1d -e '2,/^./{
                                /^$/d
                        }' <"$squash_msg".bak
@@ -370,8 +373,8 @@ update_squash_messages () {
                commit_message HEAD > "$fixup_msg" || die "Cannot write $fixup_msg"
                count=2
                {
-                       echo "# This is a combination of 2 commits."
-                       echo "# The first commit's message is:"
+                       printf '%s\n' "$comment_char This is a combination of 2 commits."
+                       printf '%s\n' "$comment_char The first commit's message is:"
                        echo
                        cat "$fixup_msg"
                } >"$squash_msg"
@@ -380,21 +383,22 @@ update_squash_messages () {
        squash)
                rm -f "$fixup_msg"
                echo
-               echo "# This is the $(nth_string $count) commit message:"
+               printf '%s\n' "$comment_char This is the $(nth_string $count) commit message:"
                echo
                commit_message $2
                ;;
        fixup)
                echo
-               echo "# The $(nth_string $count) commit message will be skipped:"
+               printf '%s\n' "$comment_char The $(nth_string $count) commit message will be skipped:"
                echo
-               commit_message $2 | sed -e 's/^/#       /'
+               # Change the space after the comment character to TAB:
+               commit_message $2 | git stripspace --comment-lines | sed -e 's/ /       /'
                ;;
        esac >>"$squash_msg"
 }
 
 peek_next_command () {
-       sed -n -e "/^#/d" -e '/^$/d' -e "s/ .*//p" -e "q" < "$todo"
+       git stripspace --strip-comments <"$todo" | sed -n -e 's/ .*//p' -e q
 }
 
 # A squash/fixup has failed.  Prepare the long version of the squash
@@ -459,7 +463,7 @@ do_next () {
        rm -f "$msg" "$author_script" "$amend" || exit
        read -r command sha1 rest < "$todo"
        case "$command" in
-       '#'*|''|noop)
+       "$comment_char"*|''|noop)
                mark_action_done
                ;;
        pick|p)
@@ -798,15 +802,15 @@ skip)
        do_rest
        ;;
 edit-todo)
-       sed -e '/^#/d' < "$todo" > "$todo".new
+       git stripspace --strip-comments <"$todo" >"$todo".new
        mv -f "$todo".new "$todo"
        append_todo_help
-       cat >> "$todo" << EOF
-#
-You are editing the todo file of an ongoing interactive rebase.
-To continue rebase after editing, run:
-    git rebase --continue
-#
+       git stripspace --comment-lines >>"$todo" <<\EOF
+
+You are editing the todo file of an ongoing interactive rebase.
+To continue rebase after editing, run:
+    git rebase --continue
+
 EOF
 
        git_sequence_editor "$todo" ||
@@ -876,7 +880,7 @@ do
 
        if test -z "$keep_empty" && is_empty_commit $shortsha1
        then
-               comment_out="# "
+               comment_out="$comment_char "
        else
                comment_out=
        fi
@@ -937,20 +941,20 @@ test -s "$todo" || echo noop >> "$todo"
 test -n "$autosquash" && rearrange_squash "$todo"
 test -n "$cmd" && add_exec_commands "$todo"
 
-cat >> "$todo" << EOF
+cat >>"$todo" <<EOF
 
-# Rebase $shortrevisions onto $shortonto
+$comment_char Rebase $shortrevisions onto $shortonto
 EOF
 append_todo_help
-cat >> "$todo" << EOF
-#
-However, if you remove everything, the rebase will be aborted.
-#
+git stripspace --comment-lines >>"$todo" <<\EOF
+
+However, if you remove everything, the rebase will be aborted.
+
 EOF
 
 if test -z "$keep_empty"
 then
-       echo "# Note that empty commits are commented out" >>"$todo"
+       printf '%s\n' "$comment_char Note that empty commits are commented out" >>"$todo"
 fi
 
 
index 32fdc9938e1dc29d9a1c6c1dd54379ee33644561..8b3e2cdfac6354a8cc410ead8aeee6b90e0ce228 100755 (executable)
@@ -940,4 +940,18 @@ test_expect_success 'rebase --edit-todo can be used to modify todo' '
        test L = $(git cat-file commit HEAD | sed -ne \$p)
 '
 
+test_expect_success 'rebase -i respects core.commentchar' '
+       git reset --hard &&
+       git checkout E^0 &&
+       git config core.commentchar "\\" &&
+       test_when_finished "git config --unset core.commentchar" &&
+       write_script remove-all-but-first.sh <<-\EOF &&
+       sed -e "2,\$s/^/\\\\/" "$1" >"$1.tmp" &&
+       mv "$1.tmp" "$1"
+       EOF
+       test_set_editor "$(pwd)/remove-all-but-first.sh" &&
+       git rebase -i B &&
+       test B = $(git cat-file commit HEAD^ | sed -ne \$p)
+'
+
 test_done