diff options
author | Alban Gruin <alban.gruin@gmail.com> | 2018-08-10 19:51:33 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-08-10 21:56:22 +0300 |
commit | 2c58483a5983d1313f674e2ba32b3bac24df6911 (patch) | |
tree | e0e3c8cf5baa90830e67db69b9d09593ab9e9fe5 /sequencer.c | |
parent | 34bec2c458474bdc05ced34d6789ee6c9fb7f051 (diff) |
rebase -i: rewrite setup_reflog_action() in C
This rewrites (the misnamed) setup_reflog_action() from shell to C. The
new version is called prepare_branch_to_be_rebased().
A new command is added to rebase--helper.c, “checkout-base”, as well as
a new flag, “verbose”, to avoid silencing the output of the checkout
operation called by checkout_base_commit().
The function `run_git_checkout()` will also be used in the next commit,
therefore its code is not part of `checkout_base_commit()`.
The shell version is then stripped in favour of a call to the helper.
As $GIT_REFLOG_ACTION is no longer set at the first call of
checkout_onto(), a call to comment_for_reflog() is added at the
beginning of this function.
Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sequencer.c')
-rw-r--r-- | sequencer.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/sequencer.c b/sequencer.c index 960a935444..e48b37bc0e 100644 --- a/sequencer.c +++ b/sequencer.c @@ -3139,6 +3139,36 @@ static const char *reflog_message(struct replay_opts *opts, return buf.buf; } +static int run_git_checkout(struct replay_opts *opts, const char *commit, + const char *action) +{ + struct child_process cmd = CHILD_PROCESS_INIT; + + cmd.git_cmd = 1; + + argv_array_push(&cmd.args, "checkout"); + argv_array_push(&cmd.args, commit); + argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action); + + if (opts->verbose) + return run_command(&cmd); + else + return run_command_silent_on_success(&cmd); +} + +int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit) +{ + const char *action; + + if (commit && *commit) { + action = reflog_message(opts, "start", "checkout %s", commit); + if (run_git_checkout(opts, commit, action)) + return error(_("could not checkout %s"), commit); + } + + return 0; +} + static const char rescheduled_advice[] = N_("Could not execute the todo command\n" "\n" |