sequencer: make commit options more extensible

So far every time we need to tweak the behaviour of run_git_commit()
we have been adding a "int" parameter to it.  As the function gains
parameters and different callsites having different needs, this is
becoming a maintenance burden.  When a new knob needs to be added to
address a specific need for a single callsite, all the other callsites
need to add a "no, I do not want anything special with respect to the
new knob" argument.

Consolidate the existing four parameters into a flag word to make it
more maintainable, as we will be adding a new one to the mix soon.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Johannes Schindelin 2017-03-23 17:07:11 +01:00 committed by Junio C Hamano
parent cb7fb9ed42
commit 789b3effec
1 changed files with 26 additions and 22 deletions

View File

@ -602,6 +602,11 @@ N_("you have staged changes in your working tree\n"
"\n" "\n"
" git rebase --continue\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)

/* /*
* If we are cherry-pick, and if the merge did not result in * If we are cherry-pick, and if the merge did not result in
* hand-editing, we will hit this commit and inherit the original * hand-editing, we will hit this commit and inherit the original
@ -615,8 +620,7 @@ N_("you have staged changes in your working tree\n"
* author metadata. * author metadata.
*/ */
static int run_git_commit(const char *defmsg, struct replay_opts *opts, static int run_git_commit(const char *defmsg, struct replay_opts *opts,
int allow_empty, int edit, int amend, unsigned int flags)
int cleanup_commit_message)
{ {
struct child_process cmd = CHILD_PROCESS_INIT; struct child_process cmd = CHILD_PROCESS_INIT;
const char *value; const char *value;
@ -624,7 +628,7 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,
cmd.git_cmd = 1; cmd.git_cmd = 1;


if (is_rebase_i(opts)) { if (is_rebase_i(opts)) {
if (!edit) { if (!(flags & EDIT_MSG)) {
cmd.stdout_to_stderr = 1; cmd.stdout_to_stderr = 1;
cmd.err = -1; cmd.err = -1;
} }
@ -640,7 +644,7 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,
argv_array_push(&cmd.args, "commit"); argv_array_push(&cmd.args, "commit");
argv_array_push(&cmd.args, "-n"); argv_array_push(&cmd.args, "-n");


if (amend) if ((flags & AMEND_MSG))
argv_array_push(&cmd.args, "--amend"); argv_array_push(&cmd.args, "--amend");
if (opts->gpg_sign) if (opts->gpg_sign)
argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign); argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
@ -648,16 +652,16 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,
argv_array_push(&cmd.args, "-s"); argv_array_push(&cmd.args, "-s");
if (defmsg) if (defmsg)
argv_array_pushl(&cmd.args, "-F", defmsg, NULL); argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
if (cleanup_commit_message) if ((flags & CLEANUP_MSG))
argv_array_push(&cmd.args, "--cleanup=strip"); argv_array_push(&cmd.args, "--cleanup=strip");
if (edit) if ((flags & EDIT_MSG))
argv_array_push(&cmd.args, "-e"); argv_array_push(&cmd.args, "-e");
else if (!cleanup_commit_message && else if (!(flags & CLEANUP_MSG) &&
!opts->signoff && !opts->record_origin && !opts->signoff && !opts->record_origin &&
git_config_get_value("commit.cleanup", &value)) git_config_get_value("commit.cleanup", &value))
argv_array_push(&cmd.args, "--cleanup=verbatim"); argv_array_push(&cmd.args, "--cleanup=verbatim");


if (allow_empty) if ((flags & ALLOW_EMPTY))
argv_array_push(&cmd.args, "--allow-empty"); argv_array_push(&cmd.args, "--allow-empty");


if (opts->allow_empty_message) if (opts->allow_empty_message)
@ -926,14 +930,14 @@ static void record_in_rewritten(struct object_id *oid,
static int do_pick_commit(enum todo_command command, struct commit *commit, static int do_pick_commit(enum todo_command command, struct commit *commit,
struct replay_opts *opts, int final_fixup) struct replay_opts *opts, int final_fixup)
{ {
int edit = opts->edit, cleanup_commit_message = 0; unsigned int flags = opts->edit ? EDIT_MSG : 0;
const char *msg_file = edit ? NULL : git_path_merge_msg(); const char *msg_file = opts->edit ? NULL : git_path_merge_msg();
unsigned char head[20]; unsigned char head[20];
struct commit *base, *next, *parent; struct commit *base, *next, *parent;
const char *base_label, *next_label; const char *base_label, *next_label;
struct commit_message msg = { NULL, NULL, NULL, NULL }; struct commit_message msg = { NULL, NULL, NULL, NULL };
struct strbuf msgbuf = STRBUF_INIT; struct strbuf msgbuf = STRBUF_INIT;
int res, unborn = 0, amend = 0, allow = 0; int res, unborn = 0, allow;


if (opts->no_commit) { if (opts->no_commit) {
/* /*
@ -991,7 +995,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
opts); opts);
if (res || command != TODO_REWORD) if (res || command != TODO_REWORD)
goto leave; goto leave;
edit = amend = 1; flags |= EDIT_MSG | AMEND_MSG;
msg_file = NULL; msg_file = NULL;
goto fast_forward_edit; goto fast_forward_edit;
} }
@ -1046,15 +1050,15 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
} }


if (command == TODO_REWORD) if (command == TODO_REWORD)
edit = 1; flags |= EDIT_MSG;
else if (is_fixup(command)) { else if (is_fixup(command)) {
if (update_squash_messages(command, commit, opts)) if (update_squash_messages(command, commit, opts))
return -1; return -1;
amend = 1; flags |= AMEND_MSG;
if (!final_fixup) if (!final_fixup)
msg_file = rebase_path_squash_msg(); msg_file = rebase_path_squash_msg();
else if (file_exists(rebase_path_fixup_msg())) { else if (file_exists(rebase_path_fixup_msg())) {
cleanup_commit_message = 1; flags |= CLEANUP_MSG;
msg_file = rebase_path_fixup_msg(); msg_file = rebase_path_fixup_msg();
} else { } else {
const char *dest = git_path("SQUASH_MSG"); const char *dest = git_path("SQUASH_MSG");
@ -1064,7 +1068,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
rebase_path_squash_msg(), dest); rebase_path_squash_msg(), dest);
unlink(git_path("MERGE_MSG")); unlink(git_path("MERGE_MSG"));
msg_file = dest; msg_file = dest;
edit = 1; flags |= EDIT_MSG;
} }
} }


@ -1123,11 +1127,11 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
if (allow < 0) { if (allow < 0) {
res = allow; res = allow;
goto leave; goto leave;
} } else if (allow)
flags |= ALLOW_EMPTY;
if (!opts->no_commit) if (!opts->no_commit)
fast_forward_edit: fast_forward_edit:
res = run_git_commit(msg_file, opts, allow, edit, amend, res = run_git_commit(msg_file, opts, flags);
cleanup_commit_message);


if (!res && final_fixup) { if (!res && final_fixup) {
unlink(rebase_path_fixup_msg()); unlink(rebase_path_fixup_msg());
@ -2154,7 +2158,7 @@ static int continue_single_pick(void)


static int commit_staged_changes(struct replay_opts *opts) static int commit_staged_changes(struct replay_opts *opts)
{ {
int amend = 0; unsigned int flags = ALLOW_EMPTY | EDIT_MSG;


if (has_unstaged_changes(1)) if (has_unstaged_changes(1))
return error(_("cannot rebase: You have unstaged changes.")); return error(_("cannot rebase: You have unstaged changes."));
@ -2184,10 +2188,10 @@ static int commit_staged_changes(struct replay_opts *opts)
"--continue' again.")); "--continue' again."));


strbuf_release(&rev); 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.")); return error(_("could not commit staged changes."));
unlink(rebase_path_amend()); unlink(rebase_path_amend());
return 0; return 0;