From: Ilya Bobyr <ilya.bobyr@gmail.com>
To: git@vger.kernel.org
Cc: Ilya Bobyr <ilya.bobyr@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>, Jeff King <peff@peff.net>,
Jonathan Nieder <jrnieder@gmail.com>
Subject: [PATCH v2] rev-parse --parseopt: option argument name hints
Date: Sun, 9 Mar 2014 22:55:07 -0700 [thread overview]
Message-ID: <1394430907-6052-1-git-send-email-ilya.bobyr@gmail.com> (raw)
In-Reply-To: <531D51EC.6050503@gmail.com>
Built-in commands can specify names for option arguments when usage text
is generated for a command. sh based commands should be able to do the
same.
Option argument name hint is any text that comes after [*=?!] after the
argument name up to the first whitespace. Underscores are replaced with
whitespace. It is unlikely that an underscore would be useful in the
hint text.
Signed-off-by: Ilya Bobyr <ilya.bobyr@gmail.com>
---
Documentation/git-rev-parse.txt | 11 +++++++++--
builtin/rev-parse.c | 17 ++++++++++++++++-
t/t1502-rev-parse-parseopt.sh | 20 ++++++++++++++++++++
3 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 0d2cdcd..4cb6e02 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -284,13 +284,13 @@ Input Format
'git rev-parse --parseopt' input format is fully text based. It has two parts,
separated by a line that contains only `--`. The lines before the separator
-(should be more than one) are used for the usage.
+(could be more than one) are used for the usage.
The lines after the separator describe the options.
Each line of options has this format:
------------
-<opt_spec><flags>* SP+ help LF
+<opt_spec><flags>*<argh>? SP+ help LF
------------
`<opt_spec>`::
@@ -313,6 +313,12 @@ Each line of options has this format:
* Use `!` to not make the corresponding negated long option available.
+`<argh>`::
+ `<argh>`, if specified, is used as a name of the argument, if the
+ option takes an argument. `<argh>` is terminated by the first
+ whitespace. Angle braces are added automatically. Underscore symbols
+ are replaced with spaces.
+
The remainder of the line, after stripping the spaces, is used
as the help associated to the option.
@@ -333,6 +339,7 @@ h,help show the help
foo some nifty option --foo
bar= some cool option --bar with an argument
+baz=arg another cool option --baz with an argument named <arg>
An option group Header
C? option C with an optional argument"
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 45901df..7a58404 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -395,9 +395,10 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
usage[unb++] = strbuf_detach(&sb, NULL);
}
- /* parse: (<short>|<short>,<long>|<long>)[=?]? SP+ <help> */
+ /* parse: (<short>|<short>,<long>|<long>)[*=?!]*<arghint>? SP+ <help> */
while (strbuf_getline(&sb, stdin, '\n') != EOF) {
const char *s;
+ const char *argh;
struct option *o;
if (!sb.len)
@@ -419,6 +420,20 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
o->value = &parsed;
o->flags = PARSE_OPT_NOARG;
o->callback = &parseopt_dump;
+
+ /* Possible argument name hint */
+ argh = s;
+ while (s > sb.buf && strchr("*=?!", s[-1]) == NULL)
+ --s;
+ if (s != sb.buf && s != argh) {
+ char *a;
+ o->argh = a = xmemdupz(s, argh - s);
+ while (a = strchr(a, '_'))
+ *a = ' ';
+ }
+ if (s == sb.buf)
+ s = argh;
+
while (s > sb.buf && strchr("*=?!", s[-1])) {
switch (*--s) {
case '=':
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh
index 83b1300..bf0db05 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/t/t1502-rev-parse-parseopt.sh
@@ -18,6 +18,17 @@ An option group Header
-C[...] option C with an optional argument
-d, --data[=...] short and long option with an optional argument
+Argument hints
+ -b <arg> short option required argument
+ --bar2 <arg> long option required argument
+ -e, --fuz <with spaces>
+ short and long option required argument
+ -s[<some>] short option optional argument
+ --long[=<data>] long option optional argument
+ -g, --fluf[=<path>] short and long option optional argument
+ --longest <a very long argument hint>
+ a very long argument hint
+
Extras
--extra1 line above used to cause a segfault but no longer does
@@ -39,6 +50,15 @@ b,baz a short and long option
C? option C with an optional argument
d,data? short and long option with an optional argument
+ Argument hints
+b=arg short option required argument
+bar2=arg long option required argument
+e,fuz=with_spaces short and long option required argument
+s?some short option optional argument
+long?data long option optional argument
+g,fluf?path short and long option optional argument
+longest=a_very_long_argument_hint a very long argument hint
+
Extras
extra1 line above used to cause a segfault but no longer does
EOF
--
1.7.9
next prev parent reply other threads:[~2014-03-10 5:56 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-03 10:32 [PATCH] rev-parse --parseopt: option argument name hints Ilya Bobyr
2014-03-04 19:22 ` Junio C Hamano
2014-03-10 5:47 ` Ilya Bobyr
2014-03-10 5:55 ` Ilya Bobyr [this message]
2014-03-10 19:55 ` Junio C Hamano
2014-03-11 19:10 ` Junio C Hamano
2014-03-12 7:26 ` Ilya Bobyr
2014-03-12 16:59 ` Junio C Hamano
2014-03-19 9:02 ` Ilya Bobyr
2014-03-19 18:46 ` Junio C Hamano
2014-03-20 8:38 ` Ilya Bobyr
2014-03-20 8:44 ` [PATCH v3] " Ilya Bobyr
2014-03-20 18:38 ` Junio C Hamano
2014-03-20 23:19 ` Ilya Bobyr
2014-03-21 7:55 ` Ilya Bobyr
2014-03-21 17:04 ` Junio C Hamano
2014-03-22 9:47 ` [PATCH v4] " Ilya Bobyr
2014-03-24 17:52 ` [PATCH 0/3] Parse-options: spell multi-word placeholders with dashes Junio C Hamano
2014-03-24 17:52 ` [PATCH 1/3] parse-options: multi-word argh should use dash to separate words Junio C Hamano
2014-03-24 17:52 ` [PATCH 2/3] update-index: teach --cacheinfo a new syntax "mode,sha1,path" Junio C Hamano
2014-03-24 17:52 ` [PATCH 3/3] parse-options: make sure argh string does not have SP or _ Junio C Hamano
2014-03-20 20:18 ` [PATCH v3] rev-parse --parseopt: option argument name hints Eric Sunshine
2014-03-21 3:38 ` Ilya Bobyr
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=1394430907-6052-1-git-send-email-ilya.bobyr@gmail.com \
--to=ilya.bobyr@gmail.com \
--cc=git@vger.kernel.org \
/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).