Re: parse-options does not recognize "unspecified" behavior
- From
Jeff King <peff@peff.net>
- Date
- Mar 16, 2016, 20:49 UTC
- Message-ID
- <20160316204912.GA1890@sigill.intra.peff.net>
- In-Reply-To
- <CAFZEwPPd2wFqFq2LFEzN2CzhTV6C420SLPcXi1SWE=z2epOYLw@mail.gmail.com>
On Thu, Mar 17, 2016 at 01:21:49AM +0530, Pranit Bauva wrote:
> I noticed that parse-options does not recognize the variable which is > set to -1 so as to denote the "unspecified" value.
Right. Like all of the stock parse-options handlers, it does not ever read or understand the value passed to it by the caller. It only increments or decrements.
Show 22 quoted lines
> I did the following changes in builtin/commit.c (in master branch not > the patch I am working on) : > - static int verbose = -1 > - introduced a printf statement after parsing the options to print > the value of verbose. > > When I ran `git commit` : > I get the output that verbose is set to -1. > > When I ran `git commit -v` : > I get the output that verbose is set to 0. > > When I ran `git commit -v -v` : > I get the output that verbose is set to 1. > > When I ran `git commit --no-verbose` : > I get the out that verbose is set to 0. > [...] > It seems that parse-options just increments the value without > considering the -1 flag to denote "unspecified value". > > Is this a bug?
Not in parse-options, though I think setting verbose to "-1" in the first place is wrong.
In general, parse-options does not know or care about the default values that callers assign to variables; it just writes to them based on the option-type specified by the caller. So the behavior for "commit", "commit -v", and "commit -v -v" you show are perfectly reasonable.
But the one for "--no-verbose" is wrong. Parse-options has to write some "reset" value, and it does not know what the initial default was. So it writes 0. This is the same for options like OPT_SET_INT, and similar for string options (where we set it to NULL).
So I think the caller choosing "-1" here as the "not set" value is the bug.
-Peff