Subject: Re: [PATCH] rev-parse --parseopt: fix handling of optional arguments

From: Jonathan Nieder <[email-masked]>
Date: Tue, 15 Oct 2013 16:14:27 -0700

Nicolas Vigier wrote:

>   $ cat /tmp/opt.sh
>   #!/bin/sh
>   OPTIONS_SPEC="\
>   git [options]
>   --
>   q,quiet         be quiet
>   S,gpg-sign?     GPG-sign commit"
>   echo "$OPTIONS_SPEC" | git rev-parse --parseopt $parseopt_extra -- "$@"
>
> Then the following two commands give us the same result :
>
>   $ /tmp/opt.sh -S -q
>   set -- -S -q --
>   $ /tmp/opt.sh -S-q
>   set -- -S '-q' --
>
> We cannot know if '-q' is an argument to '-S' or a new option.

Hmph.

As Junio mentioned, inserting '' would be a backward-incompatible
change.  I don't think it's worth breaking existing scripts.  Probably
what is needed is a new parseopt special character with the new
semantics (e.g.,

	Use ?? to mean the option has an optional argument.  If the
	option is supplied without its argument, the argument is taken
	to be ''.

or something like

	Use ?<default> to mean the option has an optional argument.  If
	the option is supplied without its argument and <default> is
	nonempty, the argument is taken to be <default>.

).

Sensible?

Thanks,
Jonathan