Hi Phillip, It’s nice to see your work on this on the list. Le 19/03/2019 à 20:03, Phillip Wood a écrit : > From: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> > > In order to run `rebase -i` without forking `rebase--interactive` it > will be convenient to use the same structure when parsing the options in > cmd_rebase() and cmd_rebase__interactive(). > > Signed-off-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> > --- > builtin/rebase.c | 203 ++++++++++++++++++++++++++--------------------- > 1 file changed, 112 insertions(+), 91 deletions(-) > > diff --git a/builtin/rebase.c b/builtin/rebase.c > index c93f2aa629..33a2495032 100644 > --- a/builtin/rebase.c > +++ b/builtin/rebase.c > @@ -50,6 +50,73 @@ enum rebase_type { > REBASE_PRESERVE_MERGES > }; > > +struct rebase_options { > + enum rebase_type type; > + const char *state_dir; > + struct commit *upstream; > + const char *upstream_name; > + const char *upstream_arg; > + char *head_name; > + struct object_id orig_head; > + struct commit *onto; > + const char *onto_name; > + const char *revisions; > + const char *switch_to; > + int root; > + struct object_id *squash_onto; > + struct commit *restrict_revision; > + int dont_finish_rebase; > + enum { > + REBASE_NO_QUIET = 1<<0, > + REBASE_VERBOSE = 1<<1, > + REBASE_DIFFSTAT = 1<<2, > + REBASE_FORCE = 1<<3, > + REBASE_INTERACTIVE_EXPLICIT = 1<<4, > + } flags; > + struct argv_array git_am_opts; > + const char *action; > + int signoff; > + int allow_rerere_autoupdate; > + int keep_empty; > + int autosquash; > + char *gpg_sign_opt; > + int autostash; > + char *cmd; > + int allow_empty_message; > + int rebase_merges, rebase_cousins; > + char *strategy, *strategy_opts; > + struct strbuf git_format_patch_opt; > + int reschedule_failed_exec; > +}; > + > +#define REBASE_OPTIONS_INIT { \ > + .type = REBASE_UNSPECIFIED, \ > + .flags = REBASE_NO_QUIET, \ > + .git_am_opts = ARGV_ARRAY_INIT, \ > + .git_format_patch_opt = STRBUF_INIT \ > + } > + > +static struct replay_opts get_replay_opts(const struct rebase_options *opts) > +{ > + struct replay_opts replay = REPLAY_OPTS_INIT; > + > + sequencer_init_config(&replay); > + > + replay.action = REPLAY_INTERACTIVE_REBASE; > + replay.signoff = opts->signoff; > + replay.allow_ff = !(opts->flags & REBASE_FORCE); > + if (opts->allow_rerere_autoupdate) > + replay.allow_rerere_auto = opts->allow_rerere_autoupdate; > + replay.allow_empty = 1; > + replay.allow_empty_message = opts->allow_empty_message; > + replay.verbose = opts->flags & REBASE_VERBOSE; > + replay.reschedule_failed_exec = opts->reschedule_failed_exec; > + replay.gpg_sign = xstrdup_or_null(opts->gpg_sign_opt); > + replay.strategy = opts->strategy; > + > + return replay; > +} > + I wonder if `struct rebase_options` and `struct replay_options` could be merged, or at least have `replay_options` used in `rebase_options`, instead of converting one to the other. I think it would make things simpler and cleaner, but I don’t know how hard it would be, or if my assumption is correct. Cheers, Alban