Introduce three new command-line options: --continue, --abort, and --skip resembling the correspoding options in "rebase -i". For now, just parse the options into the replay_opts structure, making sure that two of them are not specified together. They will actually be implemented later in the series. Mentored-by: Jonathan Nieder <jrnieder@xxxxxxxxx> Signed-off-by: Ramkumar Ramachandra <artagnon@xxxxxxxxx> --- builtin/revert.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 70 insertions(+), 1 deletions(-) diff --git a/builtin/revert.c b/builtin/revert.c index 306f5b0..f33d40a 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -47,6 +47,11 @@ static const char *me; struct replay_opts { enum { REVERT, CHERRY_PICK } action; + /* --abort, --skip, and --continue */ + int abort_oper; + int skip_oper; + int continue_oper; + /* Boolean options */ int edit; int record_origin; @@ -103,11 +108,36 @@ static void verify_opt_compatible(const char *me, const char *base_opt, ...) va_end(ap); } +static void verify_opt_mutually_compatible(const char *me, ...) +{ + const char *opt1, *opt2; + va_list ap; + int set; + + va_start(ap, me); + while ((opt1 = va_arg(ap, const char *))) { + set = va_arg(ap, int); + if (set) + break; + } + if (!opt1) return; + while ((opt2 = va_arg(ap, const char *))) { + set = va_arg(ap, int); + if (set) + die(_("%s: %s cannot be used with %s"), + me, opt1, opt2); + } + va_end(ap); +} + static void parse_args(int argc, const char **argv, struct replay_opts *opts) { const char * const * usage_str = revert_or_cherry_pick_usage(opts); int noop; struct option options[] = { + OPT_BOOLEAN(0, "abort", &opts->abort_oper, "abort the current operation"), + OPT_BOOLEAN(0, "skip", &opts->skip_oper, "skip the current commit"), + OPT_BOOLEAN(0, "continue", &opts->continue_oper, "continue the current operation"), OPT_BOOLEAN('n', "no-commit", &opts->no_commit, "don't automatically commit"), OPT_BOOLEAN('e', "edit", &opts->edit, "edit the commit message"), { OPTION_BOOLEAN, 'r', NULL, &noop, NULL, "no-op (backward compatibility)", @@ -136,7 +166,37 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) opts->commit_argc = parse_options(argc, argv, NULL, options, usage_str, PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN); - if (opts->commit_argc < 2) + + /* Check for mutually incompatible command line arguments */ + verify_opt_mutually_compatible(me, + "--abort", opts->abort_oper, + "--skip", opts->skip_oper, + "--continue", opts->continue_oper, + NULL); + + /* Check for incompatible command line arguments */ + if (opts->abort_oper || opts->skip_oper || opts->continue_oper) { + char *this_oper; + if (opts->abort_oper) + this_oper = "--abort"; + else if (opts->skip_oper) + this_oper = "--skip"; + else + this_oper = "--continue"; + + verify_opt_compatible(me, this_oper, + "--no-commit", opts->no_commit, + "--edit", opts->edit, + "--signoff", opts->signoff, + "--mainline", opts->mainline, + "--strategy", opts->strategy ? 1 : 0, + "--strategy-option", opts->xopts ? 1 : 0, + "-x", opts->record_origin, + "--ff", opts->allow_ff, + NULL); + } + + else if (opts->commit_argc < 2) usage_with_options(usage_str, options); if (opts->allow_ff) @@ -146,6 +206,15 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) "-x", opts->record_origin, "--edit", opts->edit, NULL); + + /* Remove these when the options are actually implemented */ + if (opts->abort_oper) + die("--abort is not implemented yet"); + if (opts->skip_oper) + die("--skip is not implemented yet"); + if (opts->continue_oper) + die("--continue is not implemented yet"); + opts->commit_argv = argv; } -- 1.7.5.GIT -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html