git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Paul Tan <pyokagan@gmail.com>
To: git@vger.kernel.org
Cc: Stefan Beller <sbeller@google.com>,
	Johannes Schindelin <johannes.schindelin@gmx.de>,
	Stephen Robin <stephen.robin@gmail.com>,
	Paul Tan <pyokagan@gmail.com>
Subject: [PATCH v4 01/19] parse-options-cb: implement parse_opt_passthru()
Date: Thu, 18 Jun 2015 18:53:54 +0800	[thread overview]
Message-ID: <1434624852-6869-2-git-send-email-pyokagan@gmail.com> (raw)
In-Reply-To: <1434624852-6869-1-git-send-email-pyokagan@gmail.com>

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>
---
 Documentation/technical/api-parse-options.txt |  7 ++++
 parse-options-cb.c                            | 49 +++++++++++++++++++++++++++
 parse-options.h                               |  3 ++
 3 files changed, 59 insertions(+)

diff --git a/Documentation/technical/api-parse-options.txt b/Documentation/technical/api-parse-options.txt
index 1f2db31..85d10ab 100644
--- a/Documentation/technical/api-parse-options.txt
+++ b/Documentation/technical/api-parse-options.txt
@@ -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()`.
 
diff --git a/parse-options-cb.c b/parse-options-cb.c
index be8c413..68bc593 100644
--- a/parse-options-cb.c
+++ b/parse-options-cb.c
@@ -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;
+}
diff --git a/parse-options.h b/parse-options.h
index c71e9da..5b0f886 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -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
-- 
2.1.4

  reply	other threads:[~2015-06-18 10:54 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-18 10:53 [PATCH v4 00/19] Make git-pull a builtin Paul Tan
2015-06-18 10:53 ` Paul Tan [this message]
2015-06-18 10:53 ` [PATCH v4 02/19] parse-options-cb: implement parse_opt_passthru_argv() Paul Tan
2015-06-18 10:53 ` [PATCH v4 03/19] argv-array: implement argv_array_pushv() Paul Tan
2015-06-18 10:53 ` [PATCH v4 04/19] pull: implement skeletal builtin pull Paul Tan
2015-06-18 10:53 ` [PATCH v4 05/19] pull: implement fetch + merge Paul Tan
2015-06-18 10:53 ` [PATCH v4 06/19] pull: pass verbosity, --progress flags to fetch and merge Paul Tan
2015-06-18 10:54 ` [PATCH v4 07/19] pull: pass git-merge's options to git-merge Paul Tan
2015-06-18 10:54 ` [PATCH v4 08/19] pull: pass git-fetch's options to git-fetch Paul Tan
2015-06-18 10:54 ` [PATCH v4 09/19] pull: error on no merge candidates Paul Tan
2015-06-18 10:54 ` [PATCH v4 10/19] pull: support pull.ff config Paul Tan
2015-06-18 10:54 ` [PATCH v4 11/19] pull: check if in unresolved merge state Paul Tan
2015-06-18 10:54 ` [PATCH v4 12/19] pull: fast-forward working tree if head is updated Paul Tan
2015-06-18 10:54 ` [PATCH v4 13/19] pull: implement pulling into an unborn branch Paul Tan
2015-06-18 10:54 ` [PATCH v4 14/19] pull: set reflog message Paul Tan
2015-06-18 10:54 ` [PATCH v4 15/19] pull: teach git pull about --rebase Paul Tan
2015-06-18 10:54 ` [PATCH v4 16/19] pull: configure --rebase via branch.<name>.rebase or pull.rebase Paul Tan
2015-06-18 10:54 ` [PATCH v4 17/19] pull --rebase: exit early when the working directory is dirty Paul Tan
2015-06-18 10:54 ` [PATCH v4 18/19] pull --rebase: error on no merge candidate cases Paul Tan
2015-06-18 10:54 ` [PATCH v4 19/19] pull: remove redirection to git-pull.sh Paul Tan
2015-06-18 20:13 ` [PATCH v4 00/19] Make git-pull a builtin Junio C Hamano
2015-06-19 10:11   ` Paul Tan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1434624852-6869-2-git-send-email-pyokagan@gmail.com \
    --to=pyokagan@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=johannes.schindelin@gmx.de \
    --cc=sbeller@google.com \
    --cc=stephen.robin@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).