|
@@ -373,7 +373,8 @@ void parse_options_start(struct parse_opt_ctx_t *ctx,
|
|
|
}
|
|
|
|
|
|
static int usage_with_options_internal(const char * const *,
|
|
|
- const struct option *, int);
|
|
|
+ const struct option *, int,
|
|
|
+ struct parse_opt_ctx_t *);
|
|
|
|
|
|
int parse_options_step(struct parse_opt_ctx_t *ctx,
|
|
|
const struct option *options,
|
|
@@ -397,8 +398,9 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
|
|
|
|
|
|
if (arg[1] != '-') {
|
|
|
ctx->opt = ++arg;
|
|
|
- if (internal_help && *ctx->opt == 'h')
|
|
|
- return usage_with_options_internal(usagestr, options, 0);
|
|
|
+ if (internal_help && *ctx->opt == 'h') {
|
|
|
+ return usage_with_options_internal(usagestr, options, 0, ctx);
|
|
|
+ }
|
|
|
switch (parse_short_opt(ctx, options)) {
|
|
|
case -1:
|
|
|
return parse_options_usage(usagestr, options, arg, 1);
|
|
@@ -413,7 +415,7 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
|
|
|
check_typos(arg, options);
|
|
|
while (ctx->opt) {
|
|
|
if (internal_help && *ctx->opt == 'h')
|
|
|
- return usage_with_options_internal(usagestr, options, 0);
|
|
|
+ return usage_with_options_internal(usagestr, options, 0, ctx);
|
|
|
arg = ctx->opt;
|
|
|
switch (parse_short_opt(ctx, options)) {
|
|
|
case -1:
|
|
@@ -446,9 +448,9 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
|
|
|
|
|
|
arg += 2;
|
|
|
if (internal_help && !strcmp(arg, "help-all"))
|
|
|
- return usage_with_options_internal(usagestr, options, 1);
|
|
|
+ return usage_with_options_internal(usagestr, options, 1, ctx);
|
|
|
if (internal_help && !strcmp(arg, "help"))
|
|
|
- return usage_with_options_internal(usagestr, options, 0);
|
|
|
+ return usage_with_options_internal(usagestr, options, 0, ctx);
|
|
|
if (!strcmp(arg, "list-opts"))
|
|
|
return PARSE_OPT_LIST_OPTS;
|
|
|
if (!strcmp(arg, "list-cmds"))
|
|
@@ -682,8 +684,27 @@ out:
|
|
|
return ordered;
|
|
|
}
|
|
|
|
|
|
+static bool option__in_argv(const struct option *opt, const struct parse_opt_ctx_t *ctx)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 1; i < ctx->argc; ++i) {
|
|
|
+ const char *arg = ctx->argv[i];
|
|
|
+
|
|
|
+ if (arg[0] != '-')
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (arg[1] == opt->short_name ||
|
|
|
+ (arg[1] == '-' && opt->long_name && strcmp(opt->long_name, arg + 2) == 0))
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
int usage_with_options_internal(const char * const *usagestr,
|
|
|
- const struct option *opts, int full)
|
|
|
+ const struct option *opts, int full,
|
|
|
+ struct parse_opt_ctx_t *ctx)
|
|
|
{
|
|
|
struct option *ordered;
|
|
|
|
|
@@ -707,8 +728,11 @@ int usage_with_options_internal(const char * const *usagestr,
|
|
|
if (ordered)
|
|
|
opts = ordered;
|
|
|
|
|
|
- for ( ; opts->type != OPTION_END; opts++)
|
|
|
+ for ( ; opts->type != OPTION_END; opts++) {
|
|
|
+ if (ctx && ctx->argc > 1 && !option__in_argv(opts, ctx))
|
|
|
+ continue;
|
|
|
print_option_help(opts, full);
|
|
|
+ }
|
|
|
|
|
|
fputc('\n', stderr);
|
|
|
|
|
@@ -721,7 +745,7 @@ void usage_with_options(const char * const *usagestr,
|
|
|
const struct option *opts)
|
|
|
{
|
|
|
exit_browser(false);
|
|
|
- usage_with_options_internal(usagestr, opts, 0);
|
|
|
+ usage_with_options_internal(usagestr, opts, 0, NULL);
|
|
|
exit(129);
|
|
|
}
|
|
|
|