Re: [PATCH 2/8] tag: Refactor the options handling code to be less bizarro
- Date: Sat, 18 Mar 2017 20:13:12 +0100
- From: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
- Subject: Re: [PATCH 2/8] tag: Refactor the options handling code to be less bizarro
On Sat, Mar 18, 2017 at 7:35 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote:
> Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes:
>> diff --git a/builtin/tag.c b/builtin/tag.c
>> index ad29be6923..0bba3fd070 100644
>> --- a/builtin/tag.c
>> +++ b/builtin/tag.c
>> @@ -454,10 +454,10 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
>> create_tag_object = (opt.sign || annotate || msg.given || msgfile);
>> - if (argc == 0 && !cmdmode)
>> + if (argc == 0 && !cmdmode && !create_tag_object)
>> cmdmode = 'l';
> So with this change, if we cannot infer that we are creating a tag
> object from other options, we leave cmdmode to its original 0.
>> - if ((create_tag_object || force) && (cmdmode != 0))
>> + if ((create_tag_object || force) && (cmdmode || (!cmdmode && !argc)))
>> usage_with_options(git_tag_usage, options);
> And then immediately after that, we complain by detecting that we
> know we are creating a tag and a non-zero cmdmode is in effect
> (i.e. 'l', 'd' or 'v', none of which is about creating a tag). The
> way we used to detect that we are doing something other than tag
> creation was by seeing cmdmode is set to anything. Because of your
> earlier change, that no longer is true. You need to separately
> check (!cmdmode && !argc).
> By following the logic that way, I can see how this change at this
> step is a no-op, but I have to say that the code with this patch
> looks much more bizarre than the original.
> I am not sure why you want to do the first change at this step in
> the first place. Is it because you'd want to take over (!cmdmode &&
> !argc) condtion to default to 'list'? With the change in 4/8 and
> 5/8, you are ensuring that cmdmode is set to 'l' for these new cases
> before the code hits the check to call usage_with_options(). And at
> that point, you can use the original "are we creating and !cmdmode
> says we are not? That's contradiction" logic without making it more
> bizarre with this patch, no?
Nothing about this patch is needed for the rest of the series. I just
tried rebasing it out now and all tests pass & everything works as
The reason I'm submitting it is because while this works *now* and
there's no cases I can see currently where cmdmode is 'l' after the
current `((create_tag_object || force) && (cmdmode != 0))`, during a
lengthy debugging session when I was hacking on a subsequent patch in
this series it took me a long time to track down a segfault later in
the file because surely it was impossible that I was in cmdmode = 'l'
with only "git tag -a".
Partly that was late night hacking session blindness after having read
the !argc and assuming that the -a would be counted towards argc.
But I thought it was very a very bizarre pattern to set us to cmdmode
= 'l' when we're not in that mode at all just to, as can be seen in
the diff, get around a slightly more verbose one-time if-check.
So I think it's worth it to include this for less confusion in any
subsequent patches to tag.c.