diff options
| -rw-r--r-- | sequencer.c | 54 | ||||
| -rwxr-xr-x | t/t7504-commit-msg-hook.sh | 17 | 
2 files changed, 48 insertions, 23 deletions
diff --git a/sequencer.c b/sequencer.c index d76dc9cb2b..77afecaebf 100644 --- a/sequencer.c +++ b/sequencer.c @@ -602,6 +602,12 @@ N_("you have staged changes in your working tree\n"  "\n"  "  git rebase --continue\n"); +#define ALLOW_EMPTY (1<<0) +#define EDIT_MSG    (1<<1) +#define AMEND_MSG   (1<<2) +#define CLEANUP_MSG (1<<3) +#define VERIFY_MSG  (1<<4) +  /*   * If we are cherry-pick, and if the merge did not result in   * hand-editing, we will hit this commit and inherit the original @@ -615,8 +621,7 @@ N_("you have staged changes in your working tree\n"   * author metadata.   */  static int run_git_commit(const char *defmsg, struct replay_opts *opts, -			  int allow_empty, int edit, int amend, -			  int cleanup_commit_message) +			  unsigned int flags)  {  	struct child_process cmd = CHILD_PROCESS_INIT;  	const char *value; @@ -624,7 +629,7 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,  	cmd.git_cmd = 1;  	if (is_rebase_i(opts)) { -		if (!edit) { +		if (!(flags & EDIT_MSG)) {  			cmd.stdout_to_stderr = 1;  			cmd.err = -1;  		} @@ -638,9 +643,10 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,  	}  	argv_array_push(&cmd.args, "commit"); -	argv_array_push(&cmd.args, "-n"); -	if (amend) +	if (!(flags & VERIFY_MSG)) +		argv_array_push(&cmd.args, "-n"); +	if ((flags & AMEND_MSG))  		argv_array_push(&cmd.args, "--amend");  	if (opts->gpg_sign)  		argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign); @@ -648,16 +654,16 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,  		argv_array_push(&cmd.args, "-s");  	if (defmsg)  		argv_array_pushl(&cmd.args, "-F", defmsg, NULL); -	if (cleanup_commit_message) +	if ((flags & CLEANUP_MSG))  		argv_array_push(&cmd.args, "--cleanup=strip"); -	if (edit) +	if ((flags & EDIT_MSG))  		argv_array_push(&cmd.args, "-e"); -	else if (!cleanup_commit_message && +	else if (!(flags & CLEANUP_MSG) &&  		 !opts->signoff && !opts->record_origin &&  		 git_config_get_value("commit.cleanup", &value))  		argv_array_push(&cmd.args, "--cleanup=verbatim"); -	if (allow_empty) +	if ((flags & ALLOW_EMPTY))  		argv_array_push(&cmd.args, "--allow-empty");  	if (opts->allow_empty_message) @@ -926,14 +932,14 @@ static void record_in_rewritten(struct object_id *oid,  static int do_pick_commit(enum todo_command command, struct commit *commit,  		struct replay_opts *opts, int final_fixup)  { -	int edit = opts->edit, cleanup_commit_message = 0; -	const char *msg_file = edit ? NULL : git_path_merge_msg(); +	unsigned int flags = opts->edit ? EDIT_MSG : 0; +	const char *msg_file = opts->edit ? NULL : git_path_merge_msg();  	unsigned char head[20];  	struct commit *base, *next, *parent;  	const char *base_label, *next_label;  	struct commit_message msg = { NULL, NULL, NULL, NULL };  	struct strbuf msgbuf = STRBUF_INIT; -	int res, unborn = 0, amend = 0, allow = 0; +	int res, unborn = 0, allow;  	if (opts->no_commit) {  		/* @@ -991,7 +997,9 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,  			opts);  		if (res || command != TODO_REWORD)  			goto leave; -		edit = amend = 1; +		flags |= EDIT_MSG | AMEND_MSG; +		if (command == TODO_REWORD) +			flags |= VERIFY_MSG;  		msg_file = NULL;  		goto fast_forward_edit;  	} @@ -1046,15 +1054,15 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,  	}  	if (command == TODO_REWORD) -		edit = 1; +		flags |= EDIT_MSG | VERIFY_MSG;  	else if (is_fixup(command)) {  		if (update_squash_messages(command, commit, opts))  			return -1; -		amend = 1; +		flags |= AMEND_MSG;  		if (!final_fixup)  			msg_file = rebase_path_squash_msg();  		else if (file_exists(rebase_path_fixup_msg())) { -			cleanup_commit_message = 1; +			flags |= CLEANUP_MSG;  			msg_file = rebase_path_fixup_msg();  		} else {  			const char *dest = git_path("SQUASH_MSG"); @@ -1064,7 +1072,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,  					     rebase_path_squash_msg(), dest);  			unlink(git_path("MERGE_MSG"));  			msg_file = dest; -			edit = 1; +			flags |= EDIT_MSG;  		}  	} @@ -1123,11 +1131,11 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,  	if (allow < 0) {  		res = allow;  		goto leave; -	} +	} else if (allow) +		flags |= ALLOW_EMPTY;  	if (!opts->no_commit)  fast_forward_edit: -		res = run_git_commit(msg_file, opts, allow, edit, amend, -				     cleanup_commit_message); +		res = run_git_commit(msg_file, opts, flags);  	if (!res && final_fixup) {  		unlink(rebase_path_fixup_msg()); @@ -2154,7 +2162,7 @@ static int continue_single_pick(void)  static int commit_staged_changes(struct replay_opts *opts)  { -	int amend = 0; +	unsigned int flags = ALLOW_EMPTY | EDIT_MSG;  	if (has_unstaged_changes(1))  		return error(_("cannot rebase: You have unstaged changes.")); @@ -2184,10 +2192,10 @@ static int commit_staged_changes(struct replay_opts *opts)  				       "--continue' again."));  		strbuf_release(&rev); -		amend = 1; +		flags |= AMEND_MSG;  	} -	if (run_git_commit(rebase_path_message(), opts, 1, 1, amend, 0)) +	if (run_git_commit(rebase_path_message(), opts, flags))  		return error(_("could not commit staged changes."));  	unlink(rebase_path_amend());  	return 0; diff --git a/t/t7504-commit-msg-hook.sh b/t/t7504-commit-msg-hook.sh index 8728db61d3..88d4cda299 100755 --- a/t/t7504-commit-msg-hook.sh +++ b/t/t7504-commit-msg-hook.sh @@ -220,4 +220,21 @@ test_expect_success "hook doesn't edit commit message (editor)" '  ' +# set up fake editor to replace `pick` by `reword` +cat > reword-editor <<'EOF' +#!/bin/sh +mv "$1" "$1".bup && +sed 's/^pick/reword/' <"$1".bup >"$1" +EOF +chmod +x reword-editor +REWORD_EDITOR="$(pwd)/reword-editor" +export REWORD_EDITOR + +test_expect_success 'hook is called for reword during `rebase -i`' ' + +	GIT_SEQUENCE_EDITOR="\"$REWORD_EDITOR\"" git rebase -i HEAD^ && +	commit_msg_is "new message" + +' +  test_done  | 
