git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] parse-options: detect attempt to add a duplicate short option name

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Sep 3, 2014, 21:58 UTC
Message-ID
<20140903215834.GZ18279@google.com>
In-Reply-To
<20140903214624.GY18279@google.com>
On Wed, Sep 03, 2014 at 02:46:25PM -0700, Jonathan Nieder wrote:
Show 25 quoted lines
> Junio C Hamano wrote:
> 
> > --- a/parse-options.c
> > +++ b/parse-options.c
> > @@ -345,12 +345,27 @@ static void check_typos(const char *arg, const struct option *options)
> >  static void parse_options_check(const struct option *opts)
> >  {
> >  	int err = 0;
> > +	char short_opts[128];
> > +
> > +	memset(short_opts, '\0', sizeof(short_opts));
> >  
> >  	for (; opts->type != OPTION_END; opts++) {
> >  		if ((opts->flags & PARSE_OPT_LASTARG_DEFAULT) &&
> >  		    (opts->flags & PARSE_OPT_OPTARG))
> >  			err |= optbug(opts, "uses incompatible flags "
> >  					"LASTARG_DEFAULT and OPTARG");
> > +		if (opts->short_name) {
> > +			struct strbuf errmsg = STRBUF_INIT;
> > +			if (opts->short_name < ' ' || 0x7F <= opts->short_name)
> > +				strbuf_addf(&errmsg, "invalid short name (0x%02x)",
> > +					    opts->short_name);
> > +			else if (short_opts[opts->short_name]++)
> 
> What happens on platforms with a signed char?
Ah, I see now that the "< ' '" check would catch that.
With René's suggestions squashed in, that becomes
 parse-options.c               | 9 +++++++++
 t/t1502-rev-parse-parseopt.sh | 4 ++--
 2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index e7dafa8..6ad7d90 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -347,12 +347,21 @@ static void check_typos(const char *arg, const struct option *options)
 static void parse_options_check(const struct option *opts)
 {
 	int err = 0;
+	char short_opts[128];
+
+	memset(short_opts, '\0', sizeof(short_opts));
 
 	for (; opts->type != OPTION_END; opts++) {
 		if ((opts->flags & PARSE_OPT_LASTARG_DEFAULT) &&
 		    (opts->flags & PARSE_OPT_OPTARG))
 			err |= optbug(opts, "uses incompatible flags "
 					"LASTARG_DEFAULT and OPTARG");
+		if (opts->short_name) {
+			if (opts->short_name <= ' ' || 0x7F <= opts->short_name)
+				err |= optbug(opts, "invalid short name");
+			else if (short_opts[opts->short_name]++)
+				err |= optbug(opts, "short name already used");
+		}
 		if (opts->flags & PARSE_OPT_NODASH &&
 		    ((opts->flags & PARSE_OPT_OPTARG) ||
 		     !(opts->flags & PARSE_OPT_NOARG) ||
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh
index 922423e..ebe7c3b 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/t/t1502-rev-parse-parseopt.sh
@@ -19,7 +19,7 @@ sed -e 's/^|//' >expect <<\END_EXPECT
 |    -d, --data[=...]      short and long option with an optional argument
 |
 |Argument hints
-|    -b <arg>              short option required argument
+|    -B <arg>              short option required argument
 |    --bar2 <arg>          long option required argument
 |    -e, --fuz <with-space>
 |                          short and long option required argument
@@ -51,7 +51,7 @@ sed -e 's/^|//' >optionspec <<\EOF
 |d,data?   short and long option with an optional argument
 |
 | Argument hints
-|b=arg     short option required argument
+|B=arg     short option required argument
 |bar2=arg  long option required argument
 |e,fuz=with-space  short and long option required argument
 |s?some    short option optional argument
-- 
2.1.0.rc2.206.gedb03e5
Previous: Jonathan NiederNext: Johan Herland
Message 15 of 20 in “Teach revert/cherry-pick the --no-verify option”
  1. 0/3 Teach revert/cherry-pick the --no-verify optionJohan Herland, Sep 3, 2014
  2. 1/3 t7503/4: Add failing testcases for revert/cherry-pick --no-verifyJohan Herland, Sep 3, 2014
  3. Junio C HamanoSep 3, 2014
  4. 2/3 revert/cherry-pick: Add --no-verify option, and pass it on to commitJohan Herland, Sep 3, 2014
  5. Junio C HamanoSep 3, 2014
  6. parse-options: detect attempt to add a duplicate short option nameJunio C Hamano, Sep 3, 2014
  7. René ScharfeSep 3, 2014
  8. Junio C HamanoSep 3, 2014
  9. René ScharfeSep 3, 2014
  10. Junio C HamanoSep 3, 2014
  11. René ScharfeSep 4, 2014
  12. Junio C HamanoSep 4, 2014
  13. Junio C HamanoSep 4, 2014
  14. Jonathan NiederSep 3, 2014
  15. Jonathan NiederSep 3, 2014
  16. Johan HerlandSep 4, 2014
  17. 3/3 revert/cherry-pick --no-verify: Update documentationJohan Herland, Sep 3, 2014
  18. Junio C HamanoSep 3, 2014
  19. Fabian RuchSep 5, 2014
  20. Johan HerlandSep 8, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.