зеркало из https://github.com/microsoft/git.git
Merge branch 'js/rebase-i-reword-to-run-hooks'
A recent update to "rebase -i" stopped running hooks for the "git commit" command during "reword" action, which has been fixed. * js/rebase-i-reword-to-run-hooks: sequencer: allow the commit-msg hooks to run during a `reword` sequencer: make commit options more extensible t7504: document regression: reword no longer calls commit-msg
This commit is contained in:
Коммит
4b945eea40
54
sequencer.c
54
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;
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче