From: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> Thanks for the feedback on the last version. I've updated the final commit message to mention the speed up reported by Ævar. I've also removed the translation of the trace strings. Apart from that this series is unchanged. There shouldn't be any merge conflicts with the updated dl/merge-cleanup-scissors-fix I posted earlier. (There are conflicts with other series but they are already resolved in pu) This series still based on a merge of master [e902e9bcae ("The second batch", 2019-03-11)] and ag/sequencer-reduce-rewriting-todo ed35d18841 ("rebase--interactive: move transform_todo_file()", 2019-03-05). It can be fetched from the tag rebase-i-no-fork/v1 at https://github.com/phillipwood/git.git Phillip Wood (12): sequencer: always discard index after checkout rebase: don't translate trace strings rebase: rename write_basic_state() rebase: use OPT_RERERE_AUTOUPDATE() rebase -i: combine rebase--interactive.c with rebase.c rebase -i: remove duplication rebase -i: use struct commit when parsing options rebase -i: use struct object_id for squash_onto rebase -i: use struct rebase_options to parse args rebase -i: use struct rebase_options in do_interactive_rebase() rebase: use a common action enum rebase -i: run without forking rebase--interactive Makefile | 1 - builtin/rebase--interactive.c | 377 -------------------- builtin/rebase.c | 624 ++++++++++++++++++++++++++-------- parse-options-cb.c | 34 ++ parse-options.h | 4 + sequencer.c | 42 ++- sequencer.h | 7 +- 7 files changed, 555 insertions(+), 534 deletions(-) delete mode 100644 builtin/rebase--interactive.c Range-diff to rfc 1: 549d45dc63 = 1: fe51202dfb sequencer: always discard index after checkout -: ---------- > 2: 2598165c0f rebase: don't translate trace strings 2: d896a3c76f = 3: 48801ccdd5 rebase: rename write_basic_state() 3: 253de33871 = 4: 66972f0f7d rebase: use OPT_RERERE_AUTOUPDATE() 4: 0aaeaf7c09 = 5: c18aa58305 rebase -i: combine rebase--interactive.c with rebase.c 5: ff539c37d1 = 6: 27982630d1 rebase -i: remove duplication 6: 71559a38db = 7: f28e8df52a rebase -i: use struct commit when parsing options 7: 34c9e4ae96 = 8: 1ae13b5a7d rebase -i: use struct object_id for squash_onto 8: 4fe81c9e81 ! 9: efcc32d8e3 rebase -i: use struct rebase_options to parse args @@ -65,9 +65,9 @@ +{ + struct replay_opts replay = REPLAY_OPTS_INIT; + -+ sequencer_init_config(&replay); -+ + replay.action = REPLAY_INTERACTIVE_REBASE; ++ sequencer_init_config(&replay); ++ + replay.signoff = opts->signoff; + replay.allow_ff = !(opts->flags & REBASE_FORCE); + if (opts->allow_rerere_autoupdate) 9: 09343e540f = 10: c89d815ad4 rebase -i: use struct rebase_options in do_interactive_rebase() 10: 9ad1482d7f ! 11: fda591f006 rebase: use a common action enum @@ -38,14 +30,13 @@ + ACTION_ADD_EXEC +}; + -+static const char *action_names[] = { N_("undefined"), -+ N_("continue"), -+ N_("skip"), -+ N_("abort"), -+ N_("quit"), -+ N_("edit_todo"), -+ N_("show_current_patch"), -+ NULL }; ++static const char *action_names[] = { "undefined", ++ "continue", ++ "skip", ++ "abort", ++ "quit", ++ "edit_todo", ++ "show_current_patch" }; + static int add_exec_commands(struct string_list *commands) { @@ -173,14 +164,13 @@ - ACTION_EDIT_TODO, - ACTION_SHOW_CURRENT_PATCH, - } action = NO_ACTION; -- static const char *action_names[] = { N_("undefined"), -- N_("continue"), -- N_("skip"), -- N_("abort"), -- N_("quit"), -- N_("edit_todo"), -- N_("show_current_patch"), -- NULL }; +- static const char *action_names[] = { "undefined", +- "continue", +- "skip", +- "abort", +- "quit", +- "edit_todo", +- "show_current_patch" }; + enum action action = ACTION_NONE; const char *gpg_sign = NULL; struct string_list exec = STRING_LIST_INIT_NODUP; 11: ebfd7f80d9 ! 12: d921226d32 rebase -i: run without forking rebase--interactive @@ -7,10 +7,18 @@ `rebase--interactive`. Separate the option parsing in cmd_rebase__interactive() from the business logic to allow interactive rebases can be run without forking `rebase__interactive` by calling - run_rebase_interactive() directly. This makes it easy to debug the - sequencer without worrying about attaching to child processes. It also - makes it easy to remove cmd_rebase__interactive() in the future when - git-legacy-rebase.sh and git-rebase--preserve-merges.sh are retired. + run_rebase_interactive() directly. + + Starting interactive rebases without forking makes it easy to debug + the sequencer without worrying about attaching to child + processes. Ævar has also reported that some of the rebase perf tests + are 30% faster [1]. + + This patch also makes it easy to remove cmd_rebase__interactive() in + the future when git-legacy-rebase.sh and + git-rebase--preserve-merges.sh are retired. + + [1] https://public-inbox.org/git/87y359cfjj.fsf@xxxxxxxxxxxxxxxxxxx/ Signed-off-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> -- 2.21.0