Hi Alban

sorry for the slow reply, I think you're probably off-list for a while by now

On 21/03/2019 21:13, Alban Gruin wrote:
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.w...@dunelm.org.uk>

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.w...@dunelm.org.uk>
---
  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.

I did consider doing that, but there are a few subtle differences in the way the options are stored in each struct (eg the gpg option has a leading -S in struct rebase_options but not struct replay_options) and I think it would be a bit of a faff to align them as it would mean messing with the code uses them and the code that reads/writes the various state files (we cannot change the on-disk format without breaking things - sometimes users start a rebase with one version of git bundled with something like tig and then continue on the command-line with a different version). I'd prefer to leave it as a future cleanup once this series has been merged.

Best Wishes

Phillip

Cheers,
Alban

Reply via email to