]> git.ipfire.org Git - thirdparty/git.git/commitdiff
parse-options: no --[no-]no-...
authorRené Scharfe <l.s.r@web.de>
Sat, 5 Aug 2023 14:44:45 +0000 (16:44 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Aug 2023 00:16:51 +0000 (17:16 -0700)
Avoid showing an optional "no-" for options that already start with a
"no-" in the short help, as that double negation is confusing.  Document
the opposite variant on its own line with a generated help text instead,
unless it's defined and documented explicitly already.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
parse-options.c
t/t0040-parse-options.sh
t/t1502/optionspec-neg.help

index 4b76fc81e99f859955ad663d1526bebf80c321a5..4a8d380ceb59e097668dc64418bfbbb77d8e3460 100644 (file)
@@ -1042,11 +1042,22 @@ static void usage_padding(FILE *outfile, size_t pos)
        fprintf(outfile, "%*s", pad + USAGE_GAP, "");
 }
 
+static const struct option *find_option_by_long_name(const struct option *opts,
+                                                    const char *long_name)
+{
+       for (; opts->type != OPTION_END; opts++) {
+               if (opts->long_name && !strcmp(opts->long_name, long_name))
+                       return opts;
+       }
+       return NULL;
+}
+
 static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t *ctx,
                                                         const char * const *usagestr,
                                                         const struct option *opts,
                                                         int full, int err)
 {
+       const struct option *all_opts = opts;
        FILE *outfile = err ? stderr : stdout;
        int need_newline;
 
@@ -1128,6 +1139,7 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
        for (; opts->type != OPTION_END; opts++) {
                size_t pos;
                const char *cp, *np;
+               const char *positive_name = NULL;
 
                if (opts->type == OPTION_SUBCOMMAND)
                        continue;
@@ -1157,7 +1169,8 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
                        pos += fprintf(outfile, ", ");
                if (opts->long_name) {
                        const char *long_name = opts->long_name;
-                       if (opts->flags & PARSE_OPT_NONEG)
+                       if ((opts->flags & PARSE_OPT_NONEG) ||
+                           skip_prefix(long_name, "no-", &positive_name))
                                pos += fprintf(outfile, "--%s", long_name);
                        else
                                pos += fprintf(outfile, "--[no-]%s", long_name);
@@ -1185,6 +1198,16 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
                                np++;
                        pos = 0;
                }
+
+               if (positive_name) {
+                       if (find_option_by_long_name(all_opts, positive_name))
+                               continue;
+                       pos = usage_indent(outfile);
+                       pos += fprintf(outfile, "--%s", positive_name);
+                       usage_padding(outfile, pos);
+                       fprintf_ln(outfile, _("opposite of --no-%s"),
+                                  positive_name);
+               }
        }
        fputc('\n', outfile);
 
index 1dfc431d52641c424dea6d677585dc435fb0599b..a0ad6192d64ee6b72584ca688ad82cc99b6cc4ba 100755 (executable)
@@ -14,7 +14,8 @@ usage: test-tool parse-options <options>
     A helper function for the parse-options API.
 
     --[no-]yes            get a boolean
-    -D, --[no-]no-doubt   begins with 'no-'
+    -D, --no-doubt        begins with 'no-'
+    --doubt               opposite of --no-doubt
     -B, --no-fear         be brave
     -b, --[no-]boolean    increment by one
     -4, --[no-]or4        bitwise-or boolean with ...0100
index 60ff3cdd007ae2943f4b090a6966b56cc51344c0..7a29f8cb03374e076eaf6e435a2abf6a8401b94f 100644 (file)
@@ -4,7 +4,8 @@ usage: some-command [options] <args>...
     some-command does foo and bar!
 
     --[no-]foo            can be negated
-    --[no-]no-bar         can be positivated
+    --no-bar              can be positivated
+    --bar                 opposite of --no-bar
     --positive-only       cannot be negated
     --no-negative         cannot be positivated