Thread (29 messages) 29 messages, 7 authors, 2021-09-24

Re: [PATCH 4/5] rebase -i: don't fork git checkout

From: Elijah Newren <hidden>
Date: 2021-09-09 15:04:00

On Wed, Sep 8, 2021 at 6:44 AM Phillip Wood via GitGitGadget
[off-list ref] wrote:
From: Phillip Wood <redacted>

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.  :-)
quoted hunk ↗ jump to hunk
Signed-off-by: Phillip Wood <redacted>
---
 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help