rebase -i: respect core.commentchar
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>
			
			
				maint
			
			
		
							parent
							
								
									eff80a9fd9
								
							
						
					
					
						commit
						180bad3d10
					
				|  | @ -80,6 +80,9 @@ rewritten_pending="$state_dir"/rewritten-pending | ||||||
| GIT_CHERRY_PICK_HELP="$resolvemsg" | GIT_CHERRY_PICK_HELP="$resolvemsg" | ||||||
| export GIT_CHERRY_PICK_HELP | export GIT_CHERRY_PICK_HELP | ||||||
|  |  | ||||||
|  | comment_char=$(git config --get core.commentchar 2>/dev/null | cut -c1) | ||||||
|  | : ${comment_char:=#} | ||||||
|  |  | ||||||
| warn () { | warn () { | ||||||
| 	printf '%s\n' "$*" >&2 | 	printf '%s\n' "$*" >&2 | ||||||
| } | } | ||||||
|  | @ -105,8 +108,8 @@ mark_action_done () { | ||||||
| 	sed -e 1q < "$todo" >> "$done" | 	sed -e 1q < "$todo" >> "$done" | ||||||
| 	sed -e 1d < "$todo" >> "$todo".new | 	sed -e 1d < "$todo" >> "$todo".new | ||||||
| 	mv -f "$todo".new "$todo" | 	mv -f "$todo".new "$todo" | ||||||
| 	new_count=$(sane_grep -c '^[^#]' < "$done") | 	new_count=$(git stripspace --strip-comments <"$done" | wc -l) | ||||||
| 	total=$(($new_count+$(sane_grep -c '^[^#]' < "$todo"))) | 	total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l))) | ||||||
| 	if test "$last_count" != "$new_count" | 	if test "$last_count" != "$new_count" | ||||||
| 	then | 	then | ||||||
| 		last_count=$new_count | 		last_count=$new_count | ||||||
|  | @ -116,19 +119,19 @@ mark_action_done () { | ||||||
| } | } | ||||||
|  |  | ||||||
| append_todo_help () { | append_todo_help () { | ||||||
| 	cat >> "$todo" << EOF | 	git stripspace --comment-lines >>"$todo" <<\EOF | ||||||
| # |  | ||||||
| # Commands: | Commands: | ||||||
| #  p, pick = use commit |  p, pick = use commit | ||||||
| #  r, reword = use commit, but edit the commit message |  r, reword = use commit, but edit the commit message | ||||||
| #  e, edit = use commit, but stop for amending |  e, edit = use commit, but stop for amending | ||||||
| #  s, squash = use commit, but meld into previous commit |  s, squash = use commit, but meld into previous commit | ||||||
| #  f, fixup = like "squash", but discard this commit's log message |  f, fixup = like "squash", but discard this commit's log message | ||||||
| #  x, exec = run command (the rest of the line) using shell |  x, exec = run command (the rest of the line) using shell | ||||||
| # |  | ||||||
| # These lines can be re-ordered; they are executed from top to bottom. | These lines can be re-ordered; they are executed from top to bottom. | ||||||
| # |  | ||||||
| # If you remove a line here THAT COMMIT WILL BE LOST. | If you remove a line here THAT COMMIT WILL BE LOST. | ||||||
| EOF | EOF | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -179,7 +182,7 @@ die_abort () { | ||||||
| } | } | ||||||
|  |  | ||||||
| has_action () { | has_action () { | ||||||
| 	sane_grep '^[^#]' "$1" >/dev/null | 	test -n "$(git stripspace --strip-comments <"$1")" | ||||||
| } | } | ||||||
|  |  | ||||||
| is_empty_commit() { | is_empty_commit() { | ||||||
|  | @ -358,10 +361,10 @@ update_squash_messages () { | ||||||
| 	if test -f "$squash_msg"; then | 	if test -f "$squash_msg"; then | ||||||
| 		mv "$squash_msg" "$squash_msg".bak || exit | 		mv "$squash_msg" "$squash_msg".bak || exit | ||||||
| 		count=$(($(sed -n \ | 		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)) | 			-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,/^./{ | 			sed -e 1d -e '2,/^./{ | ||||||
| 				/^$/d | 				/^$/d | ||||||
| 			}' <"$squash_msg".bak | 			}' <"$squash_msg".bak | ||||||
|  | @ -370,8 +373,8 @@ update_squash_messages () { | ||||||
| 		commit_message HEAD > "$fixup_msg" || die "Cannot write $fixup_msg" | 		commit_message HEAD > "$fixup_msg" || die "Cannot write $fixup_msg" | ||||||
| 		count=2 | 		count=2 | ||||||
| 		{ | 		{ | ||||||
| 			echo "# This is a combination of 2 commits." | 			printf '%s\n' "$comment_char This is a combination of 2 commits." | ||||||
| 			echo "# The first commit's message is:" | 			printf '%s\n' "$comment_char The first commit's message is:" | ||||||
| 			echo | 			echo | ||||||
| 			cat "$fixup_msg" | 			cat "$fixup_msg" | ||||||
| 		} >"$squash_msg" | 		} >"$squash_msg" | ||||||
|  | @ -380,21 +383,22 @@ update_squash_messages () { | ||||||
| 	squash) | 	squash) | ||||||
| 		rm -f "$fixup_msg" | 		rm -f "$fixup_msg" | ||||||
| 		echo | 		echo | ||||||
| 		echo "# This is the $(nth_string $count) commit message:" | 		printf '%s\n' "$comment_char This is the $(nth_string $count) commit message:" | ||||||
| 		echo | 		echo | ||||||
| 		commit_message $2 | 		commit_message $2 | ||||||
| 		;; | 		;; | ||||||
| 	fixup) | 	fixup) | ||||||
| 		echo | 		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 | 		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" | 	esac >>"$squash_msg" | ||||||
| } | } | ||||||
|  |  | ||||||
| peek_next_command () { | 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 | # 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 | 	rm -f "$msg" "$author_script" "$amend" || exit | ||||||
| 	read -r command sha1 rest < "$todo" | 	read -r command sha1 rest < "$todo" | ||||||
| 	case "$command" in | 	case "$command" in | ||||||
| 	'#'*|''|noop) | 	"$comment_char"*|''|noop) | ||||||
| 		mark_action_done | 		mark_action_done | ||||||
| 		;; | 		;; | ||||||
| 	pick|p) | 	pick|p) | ||||||
|  | @ -798,15 +802,15 @@ skip) | ||||||
| 	do_rest | 	do_rest | ||||||
| 	;; | 	;; | ||||||
| edit-todo) | edit-todo) | ||||||
| 	sed -e '/^#/d' < "$todo" > "$todo".new | 	git stripspace --strip-comments <"$todo" >"$todo".new | ||||||
| 	mv -f "$todo".new "$todo" | 	mv -f "$todo".new "$todo" | ||||||
| 	append_todo_help | 	append_todo_help | ||||||
| 	cat >> "$todo" << EOF | 	git stripspace --comment-lines >>"$todo" <<\EOF | ||||||
| # |  | ||||||
| # You are editing the todo file of an ongoing interactive rebase. | You are editing the todo file of an ongoing interactive rebase. | ||||||
| # To continue rebase after editing, run: | To continue rebase after editing, run: | ||||||
| #     git rebase --continue |     git rebase --continue | ||||||
| # |  | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| 	git_sequence_editor "$todo" || | 	git_sequence_editor "$todo" || | ||||||
|  | @ -876,7 +880,7 @@ do | ||||||
|  |  | ||||||
| 	if test -z "$keep_empty" && is_empty_commit $shortsha1 | 	if test -z "$keep_empty" && is_empty_commit $shortsha1 | ||||||
| 	then | 	then | ||||||
| 		comment_out="# " | 		comment_out="$comment_char " | ||||||
| 	else | 	else | ||||||
| 		comment_out= | 		comment_out= | ||||||
| 	fi | 	fi | ||||||
|  | @ -937,20 +941,20 @@ test -s "$todo" || echo noop >> "$todo" | ||||||
| test -n "$autosquash" && rearrange_squash "$todo" | test -n "$autosquash" && rearrange_squash "$todo" | ||||||
| test -n "$cmd" && add_exec_commands "$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 | EOF | ||||||
| append_todo_help | append_todo_help | ||||||
| cat >> "$todo" << EOF | git stripspace --comment-lines >>"$todo" <<\EOF | ||||||
| # |  | ||||||
| # However, if you remove everything, the rebase will be aborted. | However, if you remove everything, the rebase will be aborted. | ||||||
| # |  | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| if test -z "$keep_empty" | if test -z "$keep_empty" | ||||||
| then | then | ||||||
| 	echo "# Note that empty commits are commented out" >>"$todo" | 	printf '%s\n' "$comment_char Note that empty commits are commented out" >>"$todo" | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -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 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 | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 John Keeping
						John Keeping