On Wed, Sep 8, 2021 at 6:44 AM Phillip Wood via GitGitGadget <gitgitgadget@xxxxxxxxx> wrote: > > From: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> > > The "apply" based rebase has avoided forking git checkout since > ac7f467fef ("builtin/rebase: support running "git rebase <upstream>"", > 2018-08-07). The code that handles the checkout was moved into libgit > by b309a97108 ("reset: extract reset_head() from rebase", 2020-04-07) > so lets start using it for the "merge" based rebase as well. This > opens the way for us to stop calling the post-checkout hook in the > future. Wahoo! So exciting to see this, and for the future plans mentioned here. :-) > Signed-off-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> > --- > sequencer.c | 29 ++++------------------------- > 1 file changed, 4 insertions(+), 25 deletions(-) > > diff --git a/sequencer.c b/sequencer.c > index d51440ddcd9..1a9dbc70d3c 100644 > --- a/sequencer.c > +++ b/sequencer.c > @@ -4192,42 +4192,21 @@ int apply_autostash_oid(const char *stash_oid) > return apply_save_autostash_oid(stash_oid, 1); > } > > -static int run_git_checkout(struct repository *r, struct replay_opts *opts, > - const char *commit, const char *action) > -{ > - struct child_process cmd = CHILD_PROCESS_INIT; > - int ret; > - > - cmd.git_cmd = 1; > - > - strvec_push(&cmd.args, "checkout"); > - strvec_push(&cmd.args, commit); > - strvec_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action); > - > - if (opts->verbose) > - ret = run_command(&cmd); > - else > - ret = run_command_silent_on_success(&cmd); > - > - if (!ret) > - discard_index(r->index); > - > - return ret; > -} > - > static int checkout_onto(struct repository *r, struct replay_opts *opts, > const char *onto_name, const struct object_id *onto, > const struct object_id *orig_head) > { > const char *action = reflog_message(opts, "start", "checkout %s", onto_name); > > - if (run_git_checkout(r, opts, oid_to_hex(onto), action)) { > + if (reset_head(r, onto, "checkout", NULL, RESET_HEAD_DETACH | > + RESET_ORIG_HEAD | RESET_HEAD_RUN_POST_CHECKOUT_HOOK, > + NULL, action, "rebase")) { > apply_autostash(rebase_path_autostash()); > sequencer_remove_state(opts); > return error(_("could not detach HEAD")); > } > > - return update_ref(NULL, "ORIG_HEAD", orig_head, NULL, 0, UPDATE_REFS_MSG_ON_ERR); > + return 0; > } > > static int stopped_at_head(struct repository *r) > -- > gitgitgadget