Commit 70c7bd6d authored by Jeff King's avatar Jeff King Committed by Junio C Hamano

replace: use OPT_CMDMODE to handle modes

By using OPT_CMDMODE, the mutual exclusion between modes is
taken care of for us. It also makes it easy for us to
maintain a single variable with the mode, which makes its
intent more clear. We can use a single switch() to make sure
we have covered all of the modes.

This ends up breaking even in code size, but the win will be
much bigger when we start adding more modes.
Signed-off-by: default avatarJeff King <>
Signed-off-by: Christian Couder's avatarChristian Couder <>
Signed-off-by: default avatarJunio C Hamano <>
parent 3f495f67
......@@ -168,11 +168,17 @@ static int replace_object(const char *object_ref, const char *replace_ref,
int cmd_replace(int argc, const char **argv, const char *prefix)
int list = 0, delete = 0, force = 0;
int force = 0;
const char *format = NULL;
enum {
struct option options[] = {
OPT_BOOL('l', "list", &list, N_("list replace refs")),
OPT_BOOL('d', "delete", &delete, N_("delete replace refs")),
OPT_CMDMODE('l', "list", &cmdmode, N_("list replace refs"), MODE_LIST),
OPT_CMDMODE('d', "delete", &cmdmode, N_("delete replace refs"), MODE_DELETE),
OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")),
OPT_STRING(0, "format", &format, N_("format"), N_("use this format")),
......@@ -182,42 +188,37 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
if (!list && !delete)
if (!argc)
list = 1;
if (!cmdmode)
cmdmode = argc ? MODE_REPLACE : MODE_LIST;
if (list && delete)
usage_msg_opt("-l and -d cannot be used together",
git_replace_usage, options);
if (format && !list)
if (format && cmdmode != MODE_LIST)
usage_msg_opt("--format cannot be used when not listing",
git_replace_usage, options);
if (force && (list || delete))
usage_msg_opt("-f cannot be used with -d or -l",
if (force && cmdmode != MODE_REPLACE)
usage_msg_opt("-f only makes sense when writing a replacement",
git_replace_usage, options);
/* Delete refs */
if (delete) {
switch (cmdmode) {
if (argc < 1)
usage_msg_opt("-d needs at least one argument",
git_replace_usage, options);
return for_each_replace_name(argv, delete_replace_ref);
/* Replace object */
if (!list && argc) {
if (argc != 2)
usage_msg_opt("bad number of arguments",
git_replace_usage, options);
return replace_object(argv[0], argv[1], force);
/* List refs, even if "list" is not set */
if (argc > 1)
usage_msg_opt("only one pattern can be given with -l",
git_replace_usage, options);
if (argc > 1)
usage_msg_opt("only one pattern can be given with -l",
git_replace_usage, options);
return list_replace_refs(argv[0], format);
return list_replace_refs(argv[0], format);
die("BUG: invalid cmdmode %d", (int)cmdmode);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment