]> git.ipfire.org Git - thirdparty/git.git/commitdiff
parse-options-cb: implement parse_opt_passthru()
authorPaul Tan <pyokagan@gmail.com>
Sun, 14 Jun 2015 08:41:48 +0000 (16:41 +0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 15 Jun 2015 19:40:49 +0000 (12:40 -0700)
Certain git commands, such as git-pull, are simply wrappers around other
git commands like git-fetch, git-merge and git-rebase. As such, these
wrapper commands will typically need to "pass through" command-line
options of the commands they wrap.

Implement the parse_opt_passthru() parse-options callback, which will
reconstruct the command-line option into an char* string, such that it
can be passed to another git command.

Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Paul Tan <pyokagan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/technical/api-parse-options.txt
parse-options-cb.c
parse-options.h

index 1f2db313122ccb18223f3be429620fa3385cec51..85d10abb041be5d0ee146a4bca6cc4048f61dfa1 100644 (file)
@@ -212,6 +212,13 @@ There are some macros to easily define options:
        Use it to hide deprecated options that are still to be recognized
        and ignored silently.
 
+`OPT_PASSTHRU(short, long, &char_var, arg_str, description, flags)`::
+       Introduce an option that will be reconstructed into a char* string,
+       which must be initialized to NULL. This is useful when you need to
+       pass the command-line option to another command. Any previous value
+       will be overwritten, so this should only be used for options where
+       the last one specified on the command line wins.
+
 
 The last element of the array must be `OPT_END()`.
 
index be8c413cfebb414bcbb7815cf4fe42bc31444d65..68bc5933412dfe72c3fbdbd7b848bbba62dbbbdd 100644 (file)
@@ -134,3 +134,52 @@ int parse_opt_noop_cb(const struct option *opt, const char *arg, int unset)
 {
        return 0;
 }
+
+/**
+ * Recreates the command-line option in the strbuf.
+ */
+static int recreate_opt(struct strbuf *sb, const struct option *opt,
+               const char *arg, int unset)
+{
+       strbuf_reset(sb);
+
+       if (opt->long_name) {
+               strbuf_addstr(sb, unset ? "--no-" : "--");
+               strbuf_addstr(sb, opt->long_name);
+               if (arg) {
+                       strbuf_addch(sb, '=');
+                       strbuf_addstr(sb, arg);
+               }
+       } else if (opt->short_name && !unset) {
+               strbuf_addch(sb, '-');
+               strbuf_addch(sb, opt->short_name);
+               if (arg)
+                       strbuf_addstr(sb, arg);
+       } else
+               return -1;
+
+       return 0;
+}
+
+/**
+ * For an option opt, recreates the command-line option in opt->value which
+ * must be an char* initialized to NULL. This is useful when we need to pass
+ * the command-line option to another command. Since any previous value will be
+ * overwritten, this callback should only be used for options where the last
+ * one wins.
+ */
+int parse_opt_passthru(const struct option *opt, const char *arg, int unset)
+{
+       static struct strbuf sb = STRBUF_INIT;
+       char **opt_value = opt->value;
+
+       if (recreate_opt(&sb, opt, arg, unset) < 0)
+               return -1;
+
+       if (*opt_value)
+               free(*opt_value);
+
+       *opt_value = strbuf_detach(&sb, NULL);
+
+       return 0;
+}
index c71e9da4f820ab8e72ff95afb656faece7f1a252..5b0f8860fd8cee84a5f9d37c4c235d66b5cb8684 100644 (file)
@@ -224,6 +224,7 @@ extern int parse_opt_with_commit(const struct option *, const char *, int);
 extern int parse_opt_tertiary(const struct option *, const char *, int);
 extern int parse_opt_string_list(const struct option *, const char *, int);
 extern int parse_opt_noop_cb(const struct option *, const char *, int);
+extern int parse_opt_passthru(const struct option *, const char *, int);
 
 #define OPT__VERBOSE(var, h)  OPT_COUNTUP('v', "verbose", (var), (h))
 #define OPT__QUIET(var, h)    OPT_COUNTUP('q', "quiet",   (var), (h))
@@ -242,5 +243,7 @@ extern int parse_opt_noop_cb(const struct option *, const char *, int);
        OPT_COLOR_FLAG(0, "color", (var), (h))
 #define OPT_COLUMN(s, l, v, h) \
        { OPTION_CALLBACK, (s), (l), (v), N_("style"), (h), PARSE_OPT_OPTARG, parseopt_column_callback }
+#define OPT_PASSTHRU(s, l, v, a, h, f) \
+       { OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), parse_opt_passthru }
 
 #endif