revert: simplify communicating command-line arguments

Currently, command-line arguments are communicated using (argc, argv)
until a prepare_revs() turns it into a terse structure.  However,
since we plan to expose the cherry-picking machinery through a public
API in the future, we want callers to be able to call in with a
filled-in structure.  For the revert builtin, this means that the
chief argument parser, parse_args(), should parse into such a
structure.  Make this change.

[rr: minor improvements, commit message]

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Nieder
2011-10-23 00:43:46 +05:30
committed by Junio C Hamano
parent 755b65dac0
commit 6a156fdea2

View File

@@ -54,13 +54,14 @@ struct replay_opts {
int allow_rerere_auto;
int mainline;
int commit_argc;
const char **commit_argv;
/* Merge strategy */
const char *strategy;
const char **xopts;
size_t xopts_nr, xopts_alloc;
/* Only used by REPLAY_NONE */
struct rev_info *revs;
};
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
@@ -161,9 +162,9 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
die(_("program error"));
}
opts->commit_argc = parse_options(argc, argv, NULL, options, usage_str,
PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN);
argc = parse_options(argc, argv, NULL, options, usage_str,
PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN);
/* Check for incompatible subcommands */
verify_opt_mutually_compatible(me,
@@ -198,9 +199,6 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
NULL);
}
else if (opts->commit_argc < 2)
usage_with_options(usage_str, options);
if (opts->allow_ff)
verify_opt_compatible(me, "--ff",
"--signoff", opts->signoff,
@@ -208,7 +206,20 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
"-x", opts->record_origin,
"--edit", opts->edit,
NULL);
opts->commit_argv = argv;
if (opts->subcommand == REPLAY_NONE) {
opts->revs = xmalloc(sizeof(*opts->revs));
init_revisions(opts->revs, NULL);
opts->revs->no_walk = 1;
if (argc < 2)
usage_with_options(usage_str, options);
argc = setup_revisions(argc, argv, opts->revs, NULL);
} else
opts->revs = NULL;
/* Forbid stray command-line arguments */
if (argc > 1)
usage_with_options(usage_str, options);
}
struct commit_message {
@@ -614,23 +625,15 @@ static int do_pick_commit(struct commit *commit, enum replay_action action,
return res;
}
static void prepare_revs(struct rev_info *revs, struct replay_opts *opts)
static void prepare_revs(struct replay_opts *opts)
{
int argc;
init_revisions(revs, NULL);
revs->no_walk = 1;
if (opts->action != REPLAY_REVERT)
revs->reverse = 1;
opts->revs->reverse ^= 1;
argc = setup_revisions(opts->commit_argc, opts->commit_argv, revs, NULL);
if (argc > 1)
usage(*revert_or_cherry_pick_usage(opts));
if (prepare_revision_walk(revs))
if (prepare_revision_walk(opts->revs))
die(_("revision walk setup failed"));
if (!revs->commits)
if (!opts->revs->commits)
die(_("empty commit set passed"));
}
@@ -818,14 +821,13 @@ static void read_populate_opts(struct replay_opts **opts_ptr)
static void walk_revs_populate_todo(struct replay_insn_list **todo_list,
struct replay_opts *opts)
{
struct rev_info revs;
struct commit *commit;
struct replay_insn_list **next;
prepare_revs(&revs, opts);
prepare_revs(opts);
next = todo_list;
while ((commit = get_revision(&revs)))
while ((commit = get_revision(opts->revs)))
next = replay_insn_list_append(opts->action, commit, next);
}
@@ -949,6 +951,9 @@ static int pick_revisions(struct replay_opts *opts)
struct replay_insn_list *todo_list = NULL;
unsigned char sha1[20];
if (opts->subcommand == REPLAY_NONE)
assert(opts->revs);
read_and_refresh_cache(opts);
/*