parse-options: Allow to hide options from the default usage.
authorPierre Habouzit <madcoder@debian.org>
Mon, 19 Nov 2007 09:21:44 +0000 (10:21 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 23 Nov 2007 06:11:28 +0000 (22:11 -0800)
This is useful for backward-compatibility aliases, or very advanced command
line switches introduced for internal git usages and have no real use for a
user.

parse-options still shows them if the user asks for --help-all.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
parse-options.c
parse-options.h

index d3e608ac45e2a0c6accb9d27ed8d407619cb70d2..e12b428c0a76a635041f678a3eaf05300d780061 100644 (file)
@@ -216,6 +216,9 @@ is_abbreviated:
        return error("unknown option `%s'", arg);
 }
 
+static NORETURN void usage_with_options_internal(const char * const *,
+                                                 const struct option *, int);
+
 int parse_options(int argc, const char **argv, const struct option *options,
                   const char * const usagestr[], int flags)
 {
@@ -249,6 +252,8 @@ int parse_options(int argc, const char **argv, const struct option *options,
                        break;
                }
 
+               if (!strcmp(arg + 2, "help-all"))
+                       usage_with_options_internal(usagestr, options, 1);
                if (!strcmp(arg + 2, "help"))
                        usage_with_options(usagestr, options);
                if (parse_long_opt(&args, arg + 2, options))
@@ -263,8 +268,8 @@ int parse_options(int argc, const char **argv, const struct option *options,
 #define USAGE_OPTS_WIDTH 24
 #define USAGE_GAP         2
 
-void usage_with_options(const char * const *usagestr,
-                        const struct option *opts)
+void usage_with_options_internal(const char * const *usagestr,
+                                 const struct option *opts, int full)
 {
        fprintf(stderr, "usage: %s\n", *usagestr++);
        while (*usagestr && **usagestr)
@@ -285,6 +290,8 @@ void usage_with_options(const char * const *usagestr,
                                fprintf(stderr, "%s\n", opts->help);
                        continue;
                }
+               if (!full && (opts->flags & PARSE_OPT_HIDDEN))
+                       continue;
 
                pos = fprintf(stderr, "    ");
                if (opts->short_name)
@@ -335,6 +342,12 @@ void usage_with_options(const char * const *usagestr,
        exit(129);
 }
 
+void usage_with_options(const char * const *usagestr,
+                        const struct option *opts)
+{
+       usage_with_options_internal(usagestr, opts, 0);
+}
+
 /*----- some often used options -----*/
 #include "cache.h"
 
index a8760ac4b288a44d6404d0550b9640b49789d39d..102ac31fb727acfdc3c2159e1525c7bcca94e1ef 100644 (file)
@@ -24,6 +24,7 @@ enum parse_opt_option_flags {
        PARSE_OPT_OPTARG  = 1,
        PARSE_OPT_NOARG   = 2,
        PARSE_OPT_NONEG   = 4,
+       PARSE_OPT_HIDDEN  = 8,
 };
 
 struct option;
@@ -57,6 +58,8 @@ typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
  *   PARSE_OPT_OPTARG: says that the argument is optionnal (not for BOOLEANs)
  *   PARSE_OPT_NOARG: says that this option takes no argument, for CALLBACKs
  *   PARSE_OPT_NONEG: says that this option cannot be negated
+ *   PARSE_OPT_HIDDEN this option is skipped in the default usage, showed in
+ *                    the long one.
  *
  * `callback`::
  *   pointer to the callback to use for OPTION_CALLBACK.