提交 ab96f28b 编写于 作者: J Junio C Hamano

Merge branch 'jk/unused-parameter-fixes'

Various functions have been audited for "-Wunused-parameter" warnings
and bugs in them got fixed.

* jk/unused-parameter-fixes:
  midx: double-check large object write loop
  assert NOARG/NONEG behavior of parse-options callbacks
  parse-options: drop OPT_DATE()
  apply: return -1 from option callback instead of calling exit(1)
  cat-file: report an error on multiple --batch options
  tag: mark "--message" option with NONEG
  show-branch: mark --reflog option as NONEG
  format-patch: mark "--no-numbered" option with NONEG
  status: mark --find-renames option with NONEG
  cat-file: mark batch options with NONEG
  pack-objects: mark index-version option as NONEG
  ls-files: mark exclude options as NONEG
  am: handle --no-patch-format option
  apply: mark include/exclude options as NONEG
...@@ -183,10 +183,6 @@ There are some macros to easily define options: ...@@ -183,10 +183,6 @@ There are some macros to easily define options:
scale the provided value by 1024, 1024^2 or 1024^3 respectively. scale the provided value by 1024, 1024^2 or 1024^3 respectively.
The scaled value is put into `unsigned_long_var`. The scaled value is put into `unsigned_long_var`.
`OPT_DATE(short, long, &timestamp_t_var, description)`::
Introduce an option with date argument, see `approxidate()`.
The timestamp is put into `timestamp_t_var`.
`OPT_EXPIRY_DATE(short, long, &timestamp_t_var, description)`:: `OPT_EXPIRY_DATE(short, long, &timestamp_t_var, description)`::
Introduce an option with expiry date argument, see `parse_expiry_date()`. Introduce an option with expiry date argument, see `parse_expiry_date()`.
The timestamp is put into `timestamp_t_var`. The timestamp is put into `timestamp_t_var`.
......
...@@ -4772,6 +4772,9 @@ static int apply_option_parse_exclude(const struct option *opt, ...@@ -4772,6 +4772,9 @@ static int apply_option_parse_exclude(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
struct apply_state *state = opt->value; struct apply_state *state = opt->value;
BUG_ON_OPT_NEG(unset);
add_name_limit(state, arg, 1); add_name_limit(state, arg, 1);
return 0; return 0;
} }
...@@ -4780,6 +4783,9 @@ static int apply_option_parse_include(const struct option *opt, ...@@ -4780,6 +4783,9 @@ static int apply_option_parse_include(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
struct apply_state *state = opt->value; struct apply_state *state = opt->value;
BUG_ON_OPT_NEG(unset);
add_name_limit(state, arg, 0); add_name_limit(state, arg, 0);
state->has_include = 1; state->has_include = 1;
return 0; return 0;
...@@ -4790,6 +4796,9 @@ static int apply_option_parse_p(const struct option *opt, ...@@ -4790,6 +4796,9 @@ static int apply_option_parse_p(const struct option *opt,
int unset) int unset)
{ {
struct apply_state *state = opt->value; struct apply_state *state = opt->value;
BUG_ON_OPT_NEG(unset);
state->p_value = atoi(arg); state->p_value = atoi(arg);
state->p_value_known = 1; state->p_value_known = 1;
return 0; return 0;
...@@ -4799,6 +4808,9 @@ static int apply_option_parse_space_change(const struct option *opt, ...@@ -4799,6 +4808,9 @@ static int apply_option_parse_space_change(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
struct apply_state *state = opt->value; struct apply_state *state = opt->value;
BUG_ON_OPT_ARG(arg);
if (unset) if (unset)
state->ws_ignore_action = ignore_ws_none; state->ws_ignore_action = ignore_ws_none;
else else
...@@ -4810,9 +4822,12 @@ static int apply_option_parse_whitespace(const struct option *opt, ...@@ -4810,9 +4822,12 @@ static int apply_option_parse_whitespace(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
struct apply_state *state = opt->value; struct apply_state *state = opt->value;
BUG_ON_OPT_NEG(unset);
state->whitespace_option = arg; state->whitespace_option = arg;
if (parse_whitespace_option(state, arg)) if (parse_whitespace_option(state, arg))
exit(1); return -1;
return 0; return 0;
} }
...@@ -4820,6 +4835,9 @@ static int apply_option_parse_directory(const struct option *opt, ...@@ -4820,6 +4835,9 @@ static int apply_option_parse_directory(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
struct apply_state *state = opt->value; struct apply_state *state = opt->value;
BUG_ON_OPT_NEG(unset);
strbuf_reset(&state->root); strbuf_reset(&state->root);
strbuf_addstr(&state->root, arg); strbuf_addstr(&state->root, arg);
strbuf_complete(&state->root, '/'); strbuf_complete(&state->root, '/');
...@@ -4939,10 +4957,10 @@ int apply_parse_options(int argc, const char **argv, ...@@ -4939,10 +4957,10 @@ int apply_parse_options(int argc, const char **argv,
struct option builtin_apply_options[] = { struct option builtin_apply_options[] = {
{ OPTION_CALLBACK, 0, "exclude", state, N_("path"), { OPTION_CALLBACK, 0, "exclude", state, N_("path"),
N_("don't apply changes matching the given path"), N_("don't apply changes matching the given path"),
0, apply_option_parse_exclude }, PARSE_OPT_NONEG, apply_option_parse_exclude },
{ OPTION_CALLBACK, 0, "include", state, N_("path"), { OPTION_CALLBACK, 0, "include", state, N_("path"),
N_("apply changes matching the given path"), N_("apply changes matching the given path"),
0, apply_option_parse_include }, PARSE_OPT_NONEG, apply_option_parse_include },
{ OPTION_CALLBACK, 'p', NULL, state, N_("num"), { OPTION_CALLBACK, 'p', NULL, state, N_("num"),
N_("remove <num> leading slashes from traditional diff paths"), N_("remove <num> leading slashes from traditional diff paths"),
0, apply_option_parse_p }, 0, apply_option_parse_p },
......
...@@ -2113,7 +2113,9 @@ static int parse_opt_patchformat(const struct option *opt, const char *arg, int ...@@ -2113,7 +2113,9 @@ static int parse_opt_patchformat(const struct option *opt, const char *arg, int
{ {
int *opt_value = opt->value; int *opt_value = opt->value;
if (!strcmp(arg, "mbox")) if (unset)
*opt_value = PATCH_FORMAT_UNKNOWN;
else if (!strcmp(arg, "mbox"))
*opt_value = PATCH_FORMAT_MBOX; *opt_value = PATCH_FORMAT_MBOX;
else if (!strcmp(arg, "stgit")) else if (!strcmp(arg, "stgit"))
*opt_value = PATCH_FORMAT_STGIT; *opt_value = PATCH_FORMAT_STGIT;
......
...@@ -732,6 +732,8 @@ static int blame_copy_callback(const struct option *option, const char *arg, int ...@@ -732,6 +732,8 @@ static int blame_copy_callback(const struct option *option, const char *arg, int
{ {
int *opt = option->value; int *opt = option->value;
BUG_ON_OPT_NEG(unset);
/* /*
* -C enables copy from removed files; * -C enables copy from removed files;
* -C -C enables copy from existing files, but only * -C -C enables copy from existing files, but only
...@@ -754,6 +756,8 @@ static int blame_move_callback(const struct option *option, const char *arg, int ...@@ -754,6 +756,8 @@ static int blame_move_callback(const struct option *option, const char *arg, int
{ {
int *opt = option->value; int *opt = option->value;
BUG_ON_OPT_NEG(unset);
*opt |= PICKAXE_BLAME_MOVE; *opt |= PICKAXE_BLAME_MOVE;
if (arg) if (arg)
......
...@@ -603,8 +603,10 @@ static int batch_option_callback(const struct option *opt, ...@@ -603,8 +603,10 @@ static int batch_option_callback(const struct option *opt,
{ {
struct batch_options *bo = opt->value; struct batch_options *bo = opt->value;
BUG_ON_OPT_NEG(unset);
if (bo->enabled) { if (bo->enabled) {
return 1; return error(_("only one batch option may be specified"));
} }
bo->enabled = 1; bo->enabled = 1;
...@@ -639,10 +641,12 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix) ...@@ -639,10 +641,12 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
OPT_BOOL(0, "buffer", &batch.buffer_output, N_("buffer --batch output")), OPT_BOOL(0, "buffer", &batch.buffer_output, N_("buffer --batch output")),
{ OPTION_CALLBACK, 0, "batch", &batch, "format", { OPTION_CALLBACK, 0, "batch", &batch, "format",
N_("show info and content of objects fed from the standard input"), N_("show info and content of objects fed from the standard input"),
PARSE_OPT_OPTARG, batch_option_callback }, PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
batch_option_callback },
{ OPTION_CALLBACK, 0, "batch-check", &batch, "format", { OPTION_CALLBACK, 0, "batch-check", &batch, "format",
N_("show info about objects fed from the standard input"), N_("show info about objects fed from the standard input"),
PARSE_OPT_OPTARG, batch_option_callback }, PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
batch_option_callback },
OPT_BOOL(0, "follow-symlinks", &batch.follow_symlinks, OPT_BOOL(0, "follow-symlinks", &batch.follow_symlinks,
N_("follow in-tree symlinks (used with --batch or --batch-check)")), N_("follow in-tree symlinks (used with --batch or --batch-check)")),
OPT_BOOL(0, "batch-all-objects", &batch.all_objects, OPT_BOOL(0, "batch-all-objects", &batch.all_objects,
......
...@@ -132,6 +132,8 @@ static const char * const builtin_checkout_index_usage[] = { ...@@ -132,6 +132,8 @@ static const char * const builtin_checkout_index_usage[] = {
static int option_parse_stage(const struct option *opt, static int option_parse_stage(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
if (!strcmp(arg, "all")) { if (!strcmp(arg, "all")) {
to_tempfile = 1; to_tempfile = 1;
checkout_stage = CHECKOUT_ALL; checkout_stage = CHECKOUT_ALL;
......
...@@ -140,6 +140,7 @@ static void clean_print_color(enum color_clean ix) ...@@ -140,6 +140,7 @@ static void clean_print_color(enum color_clean ix)
static int exclude_cb(const struct option *opt, const char *arg, int unset) static int exclude_cb(const struct option *opt, const char *arg, int unset)
{ {
struct string_list *exclude_list = opt->value; struct string_list *exclude_list = opt->value;
BUG_ON_OPT_NEG(unset);
string_list_append(exclude_list, arg); string_list_append(exclude_list, arg);
return 0; return 0;
} }
......
...@@ -161,6 +161,9 @@ static int opt_parse_m(const struct option *opt, const char *arg, int unset) ...@@ -161,6 +161,9 @@ static int opt_parse_m(const struct option *opt, const char *arg, int unset)
static int opt_parse_rename_score(const struct option *opt, const char *arg, int unset) static int opt_parse_rename_score(const struct option *opt, const char *arg, int unset)
{ {
const char **value = opt->value; const char **value = opt->value;
BUG_ON_OPT_NEG(unset);
if (arg != NULL && *arg == '=') if (arg != NULL && *arg == '=')
arg = arg + 1; arg = arg + 1;
...@@ -1335,7 +1338,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) ...@@ -1335,7 +1338,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
OPT_BOOL(0, "no-renames", &no_renames, N_("do not detect renames")), OPT_BOOL(0, "no-renames", &no_renames, N_("do not detect renames")),
{ OPTION_CALLBACK, 'M', "find-renames", &rename_score_arg, { OPTION_CALLBACK, 'M', "find-renames", &rename_score_arg,
N_("n"), N_("detect renames, optionally set similarity index"), N_("n"), N_("detect renames, optionally set similarity index"),
PARSE_OPT_OPTARG, opt_parse_rename_score }, PARSE_OPT_OPTARG | PARSE_OPT_NONEG, opt_parse_rename_score },
OPT_END(), OPT_END(),
}; };
......
...@@ -98,6 +98,8 @@ static int git_fetch_config(const char *k, const char *v, void *cb) ...@@ -98,6 +98,8 @@ static int git_fetch_config(const char *k, const char *v, void *cb)
static int parse_refmap_arg(const struct option *opt, const char *arg, int unset) static int parse_refmap_arg(const struct option *opt, const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
/* /*
* "git fetch --refmap='' origin foo" * "git fetch --refmap='' origin foo"
* can be used to tell the command not to store anywhere * can be used to tell the command not to store anywhere
......
...@@ -708,11 +708,14 @@ static int context_callback(const struct option *opt, const char *arg, ...@@ -708,11 +708,14 @@ static int context_callback(const struct option *opt, const char *arg,
static int file_callback(const struct option *opt, const char *arg, int unset) static int file_callback(const struct option *opt, const char *arg, int unset)
{ {
struct grep_opt *grep_opt = opt->value; struct grep_opt *grep_opt = opt->value;
int from_stdin = !strcmp(arg, "-"); int from_stdin;
FILE *patterns; FILE *patterns;
int lno = 0; int lno = 0;
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
BUG_ON_OPT_NEG(unset);
from_stdin = !strcmp(arg, "-");
patterns = from_stdin ? stdin : fopen(arg, "r"); patterns = from_stdin ? stdin : fopen(arg, "r");
if (!patterns) if (!patterns)
die_errno(_("cannot open '%s'"), arg); die_errno(_("cannot open '%s'"), arg);
...@@ -733,6 +736,8 @@ static int file_callback(const struct option *opt, const char *arg, int unset) ...@@ -733,6 +736,8 @@ static int file_callback(const struct option *opt, const char *arg, int unset)
static int not_callback(const struct option *opt, const char *arg, int unset) static int not_callback(const struct option *opt, const char *arg, int unset)
{ {
struct grep_opt *grep_opt = opt->value; struct grep_opt *grep_opt = opt->value;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
append_grep_pattern(grep_opt, "--not", "command line", 0, GREP_NOT); append_grep_pattern(grep_opt, "--not", "command line", 0, GREP_NOT);
return 0; return 0;
} }
...@@ -740,6 +745,8 @@ static int not_callback(const struct option *opt, const char *arg, int unset) ...@@ -740,6 +745,8 @@ static int not_callback(const struct option *opt, const char *arg, int unset)
static int and_callback(const struct option *opt, const char *arg, int unset) static int and_callback(const struct option *opt, const char *arg, int unset)
{ {
struct grep_opt *grep_opt = opt->value; struct grep_opt *grep_opt = opt->value;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
append_grep_pattern(grep_opt, "--and", "command line", 0, GREP_AND); append_grep_pattern(grep_opt, "--and", "command line", 0, GREP_AND);
return 0; return 0;
} }
...@@ -747,6 +754,8 @@ static int and_callback(const struct option *opt, const char *arg, int unset) ...@@ -747,6 +754,8 @@ static int and_callback(const struct option *opt, const char *arg, int unset)
static int open_callback(const struct option *opt, const char *arg, int unset) static int open_callback(const struct option *opt, const char *arg, int unset)
{ {
struct grep_opt *grep_opt = opt->value; struct grep_opt *grep_opt = opt->value;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
append_grep_pattern(grep_opt, "(", "command line", 0, GREP_OPEN_PAREN); append_grep_pattern(grep_opt, "(", "command line", 0, GREP_OPEN_PAREN);
return 0; return 0;
} }
...@@ -754,6 +763,8 @@ static int open_callback(const struct option *opt, const char *arg, int unset) ...@@ -754,6 +763,8 @@ static int open_callback(const struct option *opt, const char *arg, int unset)
static int close_callback(const struct option *opt, const char *arg, int unset) static int close_callback(const struct option *opt, const char *arg, int unset)
{ {
struct grep_opt *grep_opt = opt->value; struct grep_opt *grep_opt = opt->value;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
append_grep_pattern(grep_opt, ")", "command line", 0, GREP_CLOSE_PAREN); append_grep_pattern(grep_opt, ")", "command line", 0, GREP_CLOSE_PAREN);
return 0; return 0;
} }
...@@ -762,6 +773,7 @@ static int pattern_callback(const struct option *opt, const char *arg, ...@@ -762,6 +773,7 @@ static int pattern_callback(const struct option *opt, const char *arg,
int unset) int unset)
{ {
struct grep_opt *grep_opt = opt->value; struct grep_opt *grep_opt = opt->value;
BUG_ON_OPT_NEG(unset);
append_grep_pattern(grep_opt, arg, "-e option", 0, GREP_PATTERN); append_grep_pattern(grep_opt, arg, "-e option", 0, GREP_PATTERN);
return 0; return 0;
} }
......
...@@ -451,6 +451,7 @@ static int guess_repository_type(const char *git_dir) ...@@ -451,6 +451,7 @@ static int guess_repository_type(const char *git_dir)
static int shared_callback(const struct option *opt, const char *arg, int unset) static int shared_callback(const struct option *opt, const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
*((int *) opt->value) = (arg) ? git_config_perm("arg", arg) : PERM_GROUP; *((int *) opt->value) = (arg) ? git_config_perm("arg", arg) : PERM_GROUP;
return 0; return 0;
} }
......
...@@ -80,6 +80,8 @@ static int parse_opt_parse(const struct option *opt, const char *arg, ...@@ -80,6 +80,8 @@ static int parse_opt_parse(const struct option *opt, const char *arg,
v->only_trailers = 1; v->only_trailers = 1;
v->only_input = 1; v->only_input = 1;
v->unfold = 1; v->unfold = 1;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
return 0; return 0;
} }
......
...@@ -107,6 +107,8 @@ static int log_line_range_callback(const struct option *option, const char *arg, ...@@ -107,6 +107,8 @@ static int log_line_range_callback(const struct option *option, const char *arg,
{ {
struct line_opt_callback_data *data = option->value; struct line_opt_callback_data *data = option->value;
BUG_ON_OPT_NEG(unset);
if (!arg) if (!arg)
return -1; return -1;
...@@ -1151,6 +1153,8 @@ static int keep_subject = 0; ...@@ -1151,6 +1153,8 @@ static int keep_subject = 0;
static int keep_callback(const struct option *opt, const char *arg, int unset) static int keep_callback(const struct option *opt, const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
((struct rev_info *)opt->value)->total = -1; ((struct rev_info *)opt->value)->total = -1;
keep_subject = 1; keep_subject = 1;
return 0; return 0;
...@@ -1161,6 +1165,7 @@ static int subject_prefix = 0; ...@@ -1161,6 +1165,7 @@ static int subject_prefix = 0;
static int subject_prefix_callback(const struct option *opt, const char *arg, static int subject_prefix_callback(const struct option *opt, const char *arg,
int unset) int unset)
{ {
BUG_ON_OPT_NEG(unset);
subject_prefix = 1; subject_prefix = 1;
((struct rev_info *)opt->value)->subject_prefix = arg; ((struct rev_info *)opt->value)->subject_prefix = arg;
return 0; return 0;
...@@ -1168,6 +1173,8 @@ static int subject_prefix_callback(const struct option *opt, const char *arg, ...@@ -1168,6 +1173,8 @@ static int subject_prefix_callback(const struct option *opt, const char *arg,
static int rfc_callback(const struct option *opt, const char *arg, int unset) static int rfc_callback(const struct option *opt, const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
return subject_prefix_callback(opt, "RFC PATCH", unset); return subject_prefix_callback(opt, "RFC PATCH", unset);
} }
...@@ -1176,6 +1183,7 @@ static int numbered_cmdline_opt = 0; ...@@ -1176,6 +1183,7 @@ static int numbered_cmdline_opt = 0;
static int numbered_callback(const struct option *opt, const char *arg, static int numbered_callback(const struct option *opt, const char *arg,
int unset) int unset)
{ {
BUG_ON_OPT_ARG(arg);
*(int *)opt->value = numbered_cmdline_opt = unset ? 0 : 1; *(int *)opt->value = numbered_cmdline_opt = unset ? 0 : 1;
if (unset) if (unset)
auto_number = 0; auto_number = 0;
...@@ -1185,6 +1193,7 @@ static int numbered_callback(const struct option *opt, const char *arg, ...@@ -1185,6 +1193,7 @@ static int numbered_callback(const struct option *opt, const char *arg,
static int no_numbered_callback(const struct option *opt, const char *arg, static int no_numbered_callback(const struct option *opt, const char *arg,
int unset) int unset)
{ {
BUG_ON_OPT_NEG(unset);
return numbered_callback(opt, arg, 1); return numbered_callback(opt, arg, 1);
} }
...@@ -1192,6 +1201,7 @@ static int output_directory_callback(const struct option *opt, const char *arg, ...@@ -1192,6 +1201,7 @@ static int output_directory_callback(const struct option *opt, const char *arg,
int unset) int unset)
{ {
const char **dir = (const char **)opt->value; const char **dir = (const char **)opt->value;
BUG_ON_OPT_NEG(unset);
if (*dir) if (*dir)
die(_("Two output directories?")); die(_("Two output directories?"));
*dir = arg; *dir = arg;
...@@ -1508,7 +1518,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) ...@@ -1508,7 +1518,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
PARSE_OPT_NOARG, numbered_callback }, PARSE_OPT_NOARG, numbered_callback },
{ OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL, { OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL,
N_("use [PATCH] even with multiple patches"), N_("use [PATCH] even with multiple patches"),
PARSE_OPT_NOARG, no_numbered_callback }, PARSE_OPT_NOARG | PARSE_OPT_NONEG, no_numbered_callback },
OPT_BOOL('s', "signoff", &do_signoff, N_("add Signed-off-by:")), OPT_BOOL('s', "signoff", &do_signoff, N_("add Signed-off-by:")),
OPT_BOOL(0, "stdout", &use_stdout, OPT_BOOL(0, "stdout", &use_stdout,
N_("print patches to standard out")), N_("print patches to standard out")),
......
...@@ -475,6 +475,8 @@ static int option_parse_exclude(const struct option *opt, ...@@ -475,6 +475,8 @@ static int option_parse_exclude(const struct option *opt,
{ {
struct string_list *exclude_list = opt->value; struct string_list *exclude_list = opt->value;
BUG_ON_OPT_NEG(unset);
exc_given = 1; exc_given = 1;
string_list_append(exclude_list, arg); string_list_append(exclude_list, arg);
...@@ -486,6 +488,8 @@ static int option_parse_exclude_from(const struct option *opt, ...@@ -486,6 +488,8 @@ static int option_parse_exclude_from(const struct option *opt,
{ {
struct dir_struct *dir = opt->value; struct dir_struct *dir = opt->value;
BUG_ON_OPT_NEG(unset);
exc_given = 1; exc_given = 1;
add_excludes_from_file(dir, arg); add_excludes_from_file(dir, arg);
...@@ -497,6 +501,9 @@ static int option_parse_exclude_standard(const struct option *opt, ...@@ -497,6 +501,9 @@ static int option_parse_exclude_standard(const struct option *opt,
{ {
struct dir_struct *dir = opt->value; struct dir_struct *dir = opt->value;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
exc_given = 1; exc_given = 1;
setup_standard_excludes(dir); setup_standard_excludes(dir);
...@@ -548,15 +555,16 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) ...@@ -548,15 +555,16 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
N_("show resolve-undo information")), N_("show resolve-undo information")),
{ OPTION_CALLBACK, 'x', "exclude", &exclude_list, N_("pattern"), { OPTION_CALLBACK, 'x', "exclude", &exclude_list, N_("pattern"),
N_("skip files matching pattern"), N_("skip files matching pattern"),
0, option_parse_exclude }, PARSE_OPT_NONEG, option_parse_exclude },
{ OPTION_CALLBACK, 'X', "exclude-from", &dir, N_("file"), { OPTION_CALLBACK, 'X', "exclude-from", &dir, N_("file"),
N_("exclude patterns are read from <file>"), N_("exclude patterns are read from <file>"),
0, option_parse_exclude_from }, PARSE_OPT_NONEG, option_parse_exclude_from },
OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, N_("file"), OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, N_("file"),
N_("read additional per-directory exclude patterns in <file>")), N_("read additional per-directory exclude patterns in <file>")),
{ OPTION_CALLBACK, 0, "exclude-standard", &dir, NULL, { OPTION_CALLBACK, 0, "exclude-standard", &dir, NULL,
N_("add the standard git exclusions"), N_("add the standard git exclusions"),
PARSE_OPT_NOARG, option_parse_exclude_standard }, PARSE_OPT_NOARG | PARSE_OPT_NONEG,
option_parse_exclude_standard },
OPT_SET_INT_F(0, "full-name", &prefix_len, OPT_SET_INT_F(0, "full-name", &prefix_len,
N_("make the output relative to the project top directory"), N_("make the output relative to the project top directory"),
0, PARSE_OPT_NONEG), 0, PARSE_OPT_NONEG),
......
...@@ -15,6 +15,8 @@ static int label_cb(const struct option *opt, const char *arg, int unset) ...@@ -15,6 +15,8 @@ static int label_cb(const struct option *opt, const char *arg, int unset)
static int label_count = 0; static int label_count = 0;
const char **names = (const char **)opt->value; const char **names = (const char **)opt->value;
BUG_ON_OPT_NEG(unset);
if (label_count >= 3) if (label_count >= 3)
return error("too many labels on the command line"); return error("too many labels on the command line");
names[label_count++] = arg; names[label_count++] = arg;
......
...@@ -224,6 +224,7 @@ static int option_parse_x(const struct option *opt, ...@@ -224,6 +224,7 @@ static int option_parse_x(const struct option *opt,
static int option_parse_n(const struct option *opt, static int option_parse_n(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
BUG_ON_OPT_ARG(arg);
show_diffstat = unset; show_diffstat = unset;
return 0; return 0;
} }
......
...@@ -215,6 +215,8 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset) ...@@ -215,6 +215,8 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)
{ {
struct note_data *d = opt->value; struct note_data *d = opt->value;
BUG_ON_OPT_NEG(unset);
strbuf_grow(&d->buf, strlen(arg) + 2); strbuf_grow(&d->buf, strlen(arg) + 2);
if (d->buf.len) if (d->buf.len)
strbuf_addch(&d->buf, '\n'); strbuf_addch(&d->buf, '\n');
...@@ -229,6 +231,8 @@ static int parse_file_arg(const struct option *opt, const char *arg, int unset) ...@@ -229,6 +231,8 @@ static int parse_file_arg(const struct option *opt, const char *arg, int unset)
{ {
struct note_data *d = opt->value; struct note_data *d = opt->value;
BUG_ON_OPT_NEG(unset);
if (d->buf.len) if (d->buf.len)
strbuf_addch(&d->buf, '\n'); strbuf_addch(&d->buf, '\n');
if (!strcmp(arg, "-")) { if (!strcmp(arg, "-")) {
...@@ -250,6 +254,8 @@ static int parse_reuse_arg(const struct option *opt, const char *arg, int unset) ...@@ -250,6 +254,8 @@ static int parse_reuse_arg(const struct option *opt, const char *arg, int unset)
enum object_type type; enum object_type type;
unsigned long len; unsigned long len;
BUG_ON_OPT_NEG(unset);
if (d->buf.len) if (d->buf.len)
strbuf_addch(&d->buf, '\n'); strbuf_addch(&d->buf, '\n');
...@@ -273,6 +279,7 @@ static int parse_reuse_arg(const struct option *opt, const char *arg, int unset) ...@@ -273,6 +279,7 @@ static int parse_reuse_arg(const struct option *opt, const char *arg, int unset)
static int parse_reedit_arg(const struct option *opt, const char *arg, int unset) static int parse_reedit_arg(const struct option *opt, const char *arg, int unset)
{ {
struct note_data *d = opt->value; struct note_data *d = opt->value;
BUG_ON_OPT_NEG(unset);
d->use_editor = 1; d->use_editor = 1;
return parse_reuse_arg(opt, arg, unset); return parse_reuse_arg(opt, arg, unset);
} }
......
...@@ -3187,6 +3187,9 @@ static int option_parse_index_version(const struct option *opt, ...@@ -3187,6 +3187,9 @@ static int option_parse_index_version(const struct option *opt,
{ {
char *c; char *c;
const char *val = arg; const char *val = arg;
BUG_ON_OPT_NEG(unset);
pack_idx_opts.version = strtoul(val, &c, 10); pack_idx_opts.version = strtoul(val, &c, 10);
if (pack_idx_opts.version > 2) if (pack_idx_opts.version > 2)
die(_("unsupported index version %s"), val); die(_("unsupported index version %s"), val);
...@@ -3233,7 +3236,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) ...@@ -3233,7 +3236,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
N_("similar to --all-progress when progress meter is shown")), N_("similar to --all-progress when progress meter is shown")),
{ OPTION_CALLBACK, 0, "index-version", NULL, N_("<version>[,<offset>]"), { OPTION_CALLBACK, 0, "index-version", NULL, N_("<version>[,<offset>]"),
N_("write the pack index file in the specified idx format version"), N_("write the pack index file in the specified idx format version"),
0, option_parse_index_version }, PARSE_OPT_NONEG, option_parse_index_version },
OPT_MAGNITUDE(0, "max-pack-size", &pack_size_limit, OPT_MAGNITUDE(0, "max-pack-size", &pack_size_limit,
N_("maximum size of each output pack file")), N_("maximum size of each output pack file")),
OPT_BOOL(0, "local", &local, OPT_BOOL(0, "local", &local,
......
...@@ -44,6 +44,7 @@ static const char * const read_tree_usage[] = { ...@@ -44,6 +44,7 @@ static const char * const read_tree_usage[] = {
static int index_output_cb(const struct option *opt, const char *arg, static int index_output_cb(const struct option *opt, const char *arg,
int unset) int unset)
{ {
BUG_ON_OPT_NEG(unset);
set_alternate_index_output(arg); set_alternate_index_output(arg);
return 0; return 0;
} }
...@@ -54,6 +55,8 @@ static int exclude_per_directory_cb(const struct option *opt, const char *arg, ...@@ -54,6 +55,8 @@ static int exclude_per_directory_cb(const struct option *opt, const char *arg,
struct dir_struct *dir; struct dir_struct *dir;
struct unpack_trees_options *opts; struct unpack_trees_options *opts;
BUG_ON_OPT_NEG(unset);
opts = (struct unpack_trees_options *)opt->value; opts = (struct unpack_trees_options *)opt->value;
if (opts->dir) if (opts->dir)
......
...@@ -703,6 +703,9 @@ static int parse_opt_merge(const struct option *opt, const char *arg, int unset) ...@@ -703,6 +703,9 @@ static int parse_opt_merge(const struct option *opt, const char *arg, int unset)
{ {
struct rebase_options *opts = opt->value; struct rebase_options *opts = opt->value;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
if (!is_interactive(opts)) if (!is_interactive(opts))
opts->type = REBASE_MERGE; opts->type = REBASE_MERGE;
...@@ -715,6 +718,9 @@ static int parse_opt_interactive(const struct option *opt, const char *arg, ...@@ -715,6 +718,9 @@ static int parse_opt_interactive(const struct option *opt, const char *arg,
{ {
struct rebase_options *opts = opt->value; struct rebase_options *opts = opt->value;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
opts->type = REBASE_INTERACTIVE; opts->type = REBASE_INTERACTIVE;
opts->flags |= REBASE_INTERACTIVE_EXPLICIT; opts->flags |= REBASE_INTERACTIVE_EXPLICIT;
......
...@@ -604,6 +604,7 @@ static int parse_reflog_param(const struct option *opt, const char *arg, ...@@ -604,6 +604,7 @@ static int parse_reflog_param(const struct option *opt, const char *arg,
{ {
char *ep; char *ep;
const char **base = (const char **)opt->value; const char **base = (const char **)opt->value;
BUG_ON_OPT_NEG(unset);
if (!arg) if (!arg)
arg = ""; arg = "";
reflog = strtoul(arg, &ep, 10); reflog = strtoul(arg, &ep, 10);
...@@ -674,7 +675,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) ...@@ -674,7 +675,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
{ OPTION_CALLBACK, 'g', "reflog", &reflog_base, N_("<n>[,<base>]"), { OPTION_CALLBACK, 'g', "reflog", &reflog_base, N_("<n>[,<base>]"),
N_("show <n> most recent ref-log entries starting at " N_("show <n> most recent ref-log entries starting at "
"base"), "base"),
PARSE_OPT_OPTARG, PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
parse_reflog_param }, parse_reflog_param },
OPT_END() OPT_END()
}; };
......
...@@ -151,6 +151,7 @@ static int hash_callback(const struct option *opt, const char *arg, int unset) ...@@ -151,6 +151,7 @@ static int hash_callback(const struct option *opt, const char *arg, int unset)
static int exclude_existing_callback(const struct option *opt, const char *arg, static int exclude_existing_callback(const struct option *opt, const char *arg,
int unset) int unset)
{ {
BUG_ON_OPT_NEG(unset);
exclude_arg = 1; exclude_arg = 1;
*(const char **)opt->value = arg; *(const char **)opt->value = arg;
return 0; return 0;
......
...@@ -338,6 +338,8 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset) ...@@ -338,6 +338,8 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)
{ {
struct msg_arg *msg = opt->value; struct msg_arg *msg = opt->value;
BUG_ON_OPT_NEG(unset);
if (!arg) if (!arg)
return -1; return -1;
if (msg->buf.len) if (msg->buf.len)
...@@ -390,8 +392,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix) ...@@ -390,8 +392,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_GROUP(N_("Tag creation options")), OPT_GROUP(N_("Tag creation options")),
OPT_BOOL('a', "annotate", &annotate, OPT_BOOL('a', "annotate", &annotate,
N_("annotated tag, needs a message")), N_("annotated tag, needs a message")),
OPT_CALLBACK('m', "message", &msg, N_("message"), { OPTION_CALLBACK, 'm', "message", &msg, N_("message"),
N_("tag message"), parse_msg_arg), N_("tag message"), PARSE_OPT_NONEG, parse_msg_arg },
OPT_FILENAME('F', "file", &msgfile, N_("read message from file")), OPT_FILENAME('F', "file", &msgfile, N_("read message from file")),
OPT_BOOL('e', "edit", &edit_flag, N_("force edit of tag message")), OPT_BOOL('e', "edit", &edit_flag, N_("force edit of tag message")),
OPT_BOOL('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")), OPT_BOOL('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")),
......
...@@ -790,12 +790,16 @@ static int refresh(struct refresh_params *o, unsigned int flag) ...@@ -790,12 +790,16 @@ static int refresh(struct refresh_params *o, unsigned int flag)
static int refresh_callback(const struct option *opt, static int refresh_callback(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
return refresh(opt->value, 0); return refresh(opt->value, 0);
} }
static int really_refresh_callback(const struct option *opt, static int really_refresh_callback(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
return refresh(opt->value, REFRESH_REALLY); return refresh(opt->value, REFRESH_REALLY);
} }
...@@ -803,6 +807,7 @@ static int chmod_callback(const struct option *opt, ...@@ -803,6 +807,7 @@ static int chmod_callback(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
char *flip = opt->value; char *flip = opt->value;
BUG_ON_OPT_NEG(unset);
if ((arg[0] != '-' && arg[0] != '+') || arg[1] != 'x' || arg[2]) if ((arg[0] != '-' && arg[0] != '+') || arg[1] != 'x' || arg[2])
return error("option 'chmod' expects \"+x\" or \"-x\""); return error("option 'chmod' expects \"+x\" or \"-x\"");
*flip = arg[0]; *flip = arg[0];
...@@ -812,6 +817,8 @@ static int chmod_callback(const struct option *opt, ...@@ -812,6 +817,8 @@ static int chmod_callback(const struct option *opt,
static int resolve_undo_clear_callback(const struct option *opt, static int resolve_undo_clear_callback(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
resolve_undo_clear(); resolve_undo_clear();
return 0; return 0;
} }
...@@ -847,6 +854,8 @@ static int cacheinfo_callback(struct parse_opt_ctx_t *ctx, ...@@ -847,6 +854,8 @@ static int cacheinfo_callback(struct parse_opt_ctx_t *ctx,
unsigned int mode; unsigned int mode;
const char *path; const char *path;
BUG_ON_OPT_NEG(unset);
if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, &oid, &path)) { if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, &oid, &path)) {
if (add_cacheinfo(mode, &oid, path, 0)) if (add_cacheinfo(mode, &oid, path, 0))
die("git update-index: --cacheinfo cannot add %s", path); die("git update-index: --cacheinfo cannot add %s", path);
...@@ -869,6 +878,8 @@ static int stdin_cacheinfo_callback(struct parse_opt_ctx_t *ctx, ...@@ -869,6 +878,8 @@ static int stdin_cacheinfo_callback(struct parse_opt_ctx_t *ctx,
{ {
int *nul_term_line = opt->value; int *nul_term_line = opt->value;
BUG_ON_OPT_NEG(unset);
if (ctx->argc != 1) if (ctx->argc != 1)
return error("option '%s' must be the last argument", opt->long_name); return error("option '%s' must be the last argument", opt->long_name);
allow_add = allow_replace = allow_remove = 1; allow_add = allow_replace = allow_remove = 1;
...@@ -881,6 +892,8 @@ static int stdin_callback(struct parse_opt_ctx_t *ctx, ...@@ -881,6 +892,8 @@ static int stdin_callback(struct parse_opt_ctx_t *ctx,
{ {
int *read_from_stdin = opt->value; int *read_from_stdin = opt->value;
BUG_ON_OPT_NEG(unset);
if (ctx->argc != 1) if (ctx->argc != 1)
return error("option '%s' must be the last argument", opt->long_name); return error("option '%s' must be the last argument", opt->long_name);
*read_from_stdin = 1; *read_from_stdin = 1;
...@@ -888,11 +901,13 @@ static int stdin_callback(struct parse_opt_ctx_t *ctx, ...@@ -888,11 +901,13 @@ static int stdin_callback(struct parse_opt_ctx_t *ctx,
} }
static int unresolve_callback(struct parse_opt_ctx_t *ctx, static int unresolve_callback(struct parse_opt_ctx_t *ctx,
const struct option *opt, int flags) const struct option *opt, int unset)
{ {
int *has_errors = opt->value; int *has_errors = opt->value;
const char *prefix = startup_info->prefix; const char *prefix = startup_info->prefix;
BUG_ON_OPT_NEG(unset);
/* consume remaining arguments. */ /* consume remaining arguments. */
*has_errors = do_unresolve(ctx->argc, ctx->argv, *has_errors = do_unresolve(ctx->argc, ctx->argv,
prefix, prefix ? strlen(prefix) : 0); prefix, prefix ? strlen(prefix) : 0);
...@@ -905,11 +920,13 @@ static int unresolve_callback(struct parse_opt_ctx_t *ctx, ...@@ -905,11 +920,13 @@ static int unresolve_callback(struct parse_opt_ctx_t *ctx,
} }
static int reupdate_callback(struct parse_opt_ctx_t *ctx, static int reupdate_callback(struct parse_opt_ctx_t *ctx,
const struct option *opt, int flags) const struct option *opt, int unset)
{ {
int *has_errors = opt->value; int *has_errors = opt->value;
const char *prefix = startup_info->prefix; const char *prefix = startup_info->prefix;
BUG_ON_OPT_NEG(unset);
/* consume remaining arguments. */ /* consume remaining arguments. */
setup_work_tree(); setup_work_tree();
*has_errors = do_reupdate(ctx->argc, ctx->argv, *has_errors = do_reupdate(ctx->argc, ctx->argv,
......
...@@ -721,12 +721,18 @@ static size_t write_midx_object_offsets(struct hashfile *f, int large_offset_nee ...@@ -721,12 +721,18 @@ static size_t write_midx_object_offsets(struct hashfile *f, int large_offset_nee
static size_t write_midx_large_offsets(struct hashfile *f, uint32_t nr_large_offset, static size_t write_midx_large_offsets(struct hashfile *f, uint32_t nr_large_offset,
struct pack_midx_entry *objects, uint32_t nr_objects) struct pack_midx_entry *objects, uint32_t nr_objects)
{ {
struct pack_midx_entry *list = objects; struct pack_midx_entry *list = objects, *end = objects + nr_objects;
size_t written = 0; size_t written = 0;
while (nr_large_offset) { while (nr_large_offset) {
struct pack_midx_entry *obj = list++; struct pack_midx_entry *obj;
uint64_t offset = obj->offset; uint64_t offset;
if (list >= end)
BUG("too many large-offset objects");
obj = list++;
offset = obj->offset;
if (!(offset >> 31)) if (!(offset >> 31))
continue; continue;
......
...@@ -28,13 +28,6 @@ int parse_opt_abbrev_cb(const struct option *opt, const char *arg, int unset) ...@@ -28,13 +28,6 @@ int parse_opt_abbrev_cb(const struct option *opt, const char *arg, int unset)
return 0; return 0;
} }
int parse_opt_approxidate_cb(const struct option *opt, const char *arg,
int unset)
{
*(timestamp_t *)(opt->value) = approxidate(arg);
return 0;
}
int parse_opt_expiry_date_cb(const struct option *opt, const char *arg, int parse_opt_expiry_date_cb(const struct option *opt, const char *arg,
int unset) int unset)
{ {
...@@ -65,6 +58,8 @@ int parse_opt_verbosity_cb(const struct option *opt, const char *arg, ...@@ -65,6 +58,8 @@ int parse_opt_verbosity_cb(const struct option *opt, const char *arg,
{ {
int *target = opt->value; int *target = opt->value;
BUG_ON_OPT_ARG(arg);
if (unset) if (unset)
/* --no-quiet, --no-verbose */ /* --no-quiet, --no-verbose */
*target = 0; *target = 0;
...@@ -87,6 +82,8 @@ int parse_opt_commits(const struct option *opt, const char *arg, int unset) ...@@ -87,6 +82,8 @@ int parse_opt_commits(const struct option *opt, const char *arg, int unset)
struct object_id oid; struct object_id oid;
struct commit *commit; struct commit *commit;
BUG_ON_OPT_NEG(unset);
if (!arg) if (!arg)
return -1; return -1;
if (get_oid(arg, &oid)) if (get_oid(arg, &oid))
...@@ -117,6 +114,9 @@ int parse_opt_object_name(const struct option *opt, const char *arg, int unset) ...@@ -117,6 +114,9 @@ int parse_opt_object_name(const struct option *opt, const char *arg, int unset)
int parse_opt_tertiary(const struct option *opt, const char *arg, int unset) int parse_opt_tertiary(const struct option *opt, const char *arg, int unset)
{ {
int *target = opt->value; int *target = opt->value;
BUG_ON_OPT_ARG(arg);
*target = unset ? 2 : 1; *target = unset ? 2 : 1;
return 0; return 0;
} }
......
...@@ -150,9 +150,6 @@ struct option { ...@@ -150,9 +150,6 @@ struct option {
(h), 0, &parse_opt_string_list } (h), 0, &parse_opt_string_list }
#define OPT_UYN(s, l, v, h) { OPTION_CALLBACK, (s), (l), (v), NULL, \ #define OPT_UYN(s, l, v, h) { OPTION_CALLBACK, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG, &parse_opt_tertiary } (h), PARSE_OPT_NOARG, &parse_opt_tertiary }
#define OPT_DATE(s, l, v, h) \
{ OPTION_CALLBACK, (s), (l), (v), N_("time"),(h), 0, \
parse_opt_approxidate_cb }
#define OPT_EXPIRY_DATE(s, l, v, h) \ #define OPT_EXPIRY_DATE(s, l, v, h) \
{ OPTION_CALLBACK, (s), (l), (v), N_("expiry-date"),(h), 0, \ { OPTION_CALLBACK, (s), (l), (v), N_("expiry-date"),(h), 0, \
parse_opt_expiry_date_cb } parse_opt_expiry_date_cb }
...@@ -194,6 +191,20 @@ extern int opterror(const struct option *opt, const char *reason, int flags); ...@@ -194,6 +191,20 @@ extern int opterror(const struct option *opt, const char *reason, int flags);
#define opterror(o,r,f) (opterror((o),(r),(f)), const_error()) #define opterror(o,r,f) (opterror((o),(r),(f)), const_error())
#endif #endif
/*
* Use these assertions for callbacks that expect to be called with NONEG and
* NOARG respectively, and do not otherwise handle the "unset" and "arg"
* parameters.
*/
#define BUG_ON_OPT_NEG(unset) do { \
if ((unset)) \
BUG("option callback does not expect negation"); \
} while (0)
#define BUG_ON_OPT_ARG(arg) do { \
if ((arg)) \
BUG("option callback does not expect an argument"); \
} while (0)
/*----- incremental advanced APIs -----*/ /*----- incremental advanced APIs -----*/
enum { enum {
...@@ -232,7 +243,6 @@ extern struct option *parse_options_concat(struct option *a, struct option *b); ...@@ -232,7 +243,6 @@ extern struct option *parse_options_concat(struct option *a, struct option *b);
/*----- some often used options -----*/ /*----- some often used options -----*/
extern int parse_opt_abbrev_cb(const struct option *, const char *, int); extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
extern int parse_opt_approxidate_cb(const struct option *, const char *, int);
extern int parse_opt_expiry_date_cb(const struct option *, const char *, int); extern int parse_opt_expiry_date_cb(const struct option *, const char *, int);
extern int parse_opt_color_flag_cb(const struct option *, const char *, int); extern int parse_opt_color_flag_cb(const struct option *, const char *, int);
extern int parse_opt_verbosity_cb(const struct option *, const char *, int); extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
......
...@@ -2316,6 +2316,8 @@ int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset) ...@@ -2316,6 +2316,8 @@ int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset)
struct object_id oid; struct object_id oid;
int no_merged = starts_with(opt->long_name, "no"); int no_merged = starts_with(opt->long_name, "no");
BUG_ON_OPT_NEG(unset);
if (rf->merge) { if (rf->merge) {
if (no_merged) { if (no_merged) {
return opterror(opt, "is incompatible with --merged", 0); return opterror(opt, "is incompatible with --merged", 0);
......
...@@ -36,6 +36,7 @@ static int length_callback(const struct option *opt, const char *arg, int unset) ...@@ -36,6 +36,7 @@ static int length_callback(const struct option *opt, const char *arg, int unset)
static int number_callback(const struct option *opt, const char *arg, int unset) static int number_callback(const struct option *opt, const char *arg, int unset)
{ {
BUG_ON_OPT_NEG(unset);
*(int *)opt->value = strtol(arg, NULL, 10); *(int *)opt->value = strtol(arg, NULL, 10);
return 0; return 0;
} }
...@@ -119,7 +120,6 @@ int cmd__parse_options(int argc, const char **argv) ...@@ -119,7 +120,6 @@ int cmd__parse_options(int argc, const char **argv)
OPT_INTEGER('j', NULL, &integer, "get a integer, too"), OPT_INTEGER('j', NULL, &integer, "get a integer, too"),
OPT_MAGNITUDE('m', "magnitude", &magnitude, "get a magnitude"), OPT_MAGNITUDE('m', "magnitude", &magnitude, "get a magnitude"),
OPT_SET_INT(0, "set23", &integer, "set integer to 23", 23), OPT_SET_INT(0, "set23", &integer, "set integer to 23", 23),
OPT_DATE('t', NULL, &timestamp, "get timestamp of <time>"),
OPT_CALLBACK('L', "length", &integer, "str", OPT_CALLBACK('L', "length", &integer, "str",
"get length of <str>", length_callback), "get length of <str>", length_callback),
OPT_FILENAME('F', "file", &file, "set file to <file>"), OPT_FILENAME('F', "file", &file, "set file to <file>"),
......
...@@ -23,7 +23,6 @@ usage: test-tool parse-options <options> ...@@ -23,7 +23,6 @@ usage: test-tool parse-options <options>
-j <n> get a integer, too -j <n> get a integer, too
-m, --magnitude <n> get a magnitude -m, --magnitude <n> get a magnitude
--set23 set integer to 23 --set23 set integer to 23
-t <time> get timestamp of <time>
-L, --length <str> get length of <str> -L, --length <str> get length of <str>
-F, --file <file> set file to <file> -F, --file <file> set file to <file>
...@@ -245,27 +244,6 @@ test_expect_success 'keep some options as arguments' ' ...@@ -245,27 +244,6 @@ test_expect_success 'keep some options as arguments' '
test-tool parse-options --expect="arg 00: --quux" --quux test-tool parse-options --expect="arg 00: --quux" --quux
' '
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 1
string: (not set)
abbrev: 7
verbose: -1
quiet: 1
dry run: no
file: (not set)
arg 00: foo
EOF
test_expect_success 'OPT_DATE() works' '
test-tool parse-options -t "1970-01-01 00:00:01 +0000" \
foo -q >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat >expect <<\EOF cat >expect <<\EOF
Callback: "four", 0 Callback: "four", 0
boolean: 5 boolean: 5
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册