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

Re: [RFC PATCH 1/2] parse-options: add --git-completion-helper-all

From
Ryan Zoeller <rtzoeller@rtzoeller.com>
Date
Aug 19, 2020, 20:51 UTC
Message-ID
<a51ff9bb-47df-63ce-0b7f-508e064f4e3f@rtzoeller.com>
In-Reply-To
<xmqqeeo2togj.fsf@gitster.c.googlers.com>
On 8/19/20 2:39 PM, Junio C Hamano wrote:
Show 16 quoted lines
> 
> Ryan Zoeller <rtzoeller@rtzoeller.com> writes:
> 
>> --git-completion-helper excludes hidden options, such as --allow-empty
>> for git commit. This is typically helpful, but occasionally we want
>> auto-completion for obscure flags.
> 
> Hits from "git grep -B2 OPT_NOCOMPLETE" tells me that these are
> mostly unsafe options.  Those who accept the risk by saying
> "complete all" should be allowed to see them.
> 
> The same with OPT_HIDDEN (including OPT_HIDDEN_<TYPE>) gives us a
> mixed bag.  Many are unsafe, some are uncommon and the rest are
> discouraged, or old synonym to some other option that does get
> completed.  I am not sure if letting them be completed is an overall
> win or makes the output from "git cmd --<TAB><TAB>" too noisy.

If options marked OPT_HIDDEN are considered too internal to meaningfully expose, I'm happy to hide them. I defaulted to "show everything", and backing off from that is easy enough.

Show 6 quoted lines
> 
>> --git-completion-helper-all returns
>> all options, even if they are marked as hidden or nocomplete.
> 
> If it is "occasinally", why is the removal of OPT_HIDDEN in
> show_negated_gitcomp() unconditional?

It shouldn't have been. I visually clumped the calls to it as being inside the for loop, and assumed they were being skipped over as part of the continue.

Show 29 quoted lines
> 
>> Signed-off-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
>> ---
>>   parse-options.c | 18 ++++++++++++------
>>   1 file changed, 12 insertions(+), 6 deletions(-)
>>
>> diff --git a/parse-options.c b/parse-options.c
>> index c57618d537..cc7239e1c6 100644
>> --- a/parse-options.c
>> +++ b/parse-options.c
>> @@ -535,8 +535,9 @@ static void show_negated_gitcomp(const struct option *opts, int nr_noopts)
>>
>>   		if (!opts->long_name)
>>   			continue;
>> -		if (opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE))
>> -			continue;
>> +		/* Don't check PARSE_OPT_HIDDEN or PARSE_OPT_NOCOMPLETE,
>> +		 * we expect the caller to handle these appropriately.
>> +		 */
> 
> 	/*
> 	 * Style: our multi-line comments should begin with
> 	 * slash-asterisk alone on its own line, and end with
> 	 * asterisk-slash also on its own line, like this.
> 	 */
> 
> We do not run around and fix existing style violations that would
> only raise the patch noise, but we try not to introduce new
> violators.
Will fix.
Show 13 quoted lines
> 
> I am not sure what the new comment says is justifiable.  The only
> caller of show_negated_gitcomp() is in show_gitcomp() where the
> function looped over the options and showed the options normally,
> honoring these two flags, but then the original list of options
> are passed to this function without filtering any option element
> on the list that are marked with these bits, so "the caller"
> apparently is not interested in handling the elements with these
> bits when making the decision to show "--no-<option>" form itself;
> it farms it out to show_negated_gitcomp() and expects the function
> to do "the right thing".  Am I misleading the code?
> 
> 

You're not misreading it; I apparently neglected to test the completion for '--no-' options with '--git-completion-helper', only '--git-completion-helper-all'. I'll apply the same show_all logic to this function.

Show 33 quoted lines
>>   		if (opts->flags & PARSE_OPT_NONEG)
>>   			continue;
>>
>> @@ -572,7 +573,7 @@ static void show_negated_gitcomp(const struct option *opts, int nr_noopts)
>>   	}
>>   }
>>
>> -static int show_gitcomp(const struct option *opts)
>> +static int show_gitcomp(const struct option *opts, int show_all)
>>   {
>>   	const struct option *original_opts = opts;
>>   	int nr_noopts = 0;
>> @@ -582,7 +583,8 @@ static int show_gitcomp(const struct option *opts)
>>
>>   		if (!opts->long_name)
>>   			continue;
>> -		if (opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE))
>> +		if (!show_all &&
>> +			(opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE)))
>>   			continue;
>>
>>   		switch (opts->type) {
>> @@ -723,9 +725,13 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
>>   		if (internal_help && ctx->total == 1 && !strcmp(arg + 1, "h"))
>>   			goto show_usage;
>>
>> -		/* lone --git-completion-helper is asked by git-completion.bash */
>> +		/* lone --git-completion-helper and --git-completion-helper-all
>> +		 * are asked by git-completion.bash
>> +		 */
> 
> Ditto.
> 
Will fix.
Show 17 quoted lines
>>   		if (ctx->total == 1 && !strcmp(arg + 1, "-git-completion-helper"))
>> -			return show_gitcomp(options);
>> +			return show_gitcomp(options, 0);
>> +		if (ctx->total == 1 && !strcmp(arg + 1, "-git-completion-helper-all"))
>> +			return show_gitcomp(options, 1);
> 
> This is not your fault, but the micro-optimization to avoid
> comparison between *arg (which already is known to be "-") and "-"
> is not worth the reduced readability.
> 
> 		if (ctx->total == 1 && !strcmp(arg, "--git-completion-helper"))
> 			return show_gitcomp(options, 0);
> 		if (ctx->total == 1 && !strcmp(arg, "--git-completion-helper-all"))
> 			return show_gitcomp(options, 1);
> 
> would be much clearer for readers to know what is going on.
> 
I completely agree, and will clean these up.
Show 10 quoted lines
> With an extra "const char *rest" variable in the same scope as
> "const char *arg",
> 
> 		if (ctx->total == 1 &&
> 		    !skip_prefix(arg, "--git-completion-helper", &rest) &&
> 		    (!*rest || !strcmp(rest, "-all")))
> 			return show_gitcomp(options, *rest);
> 
> would further avoid repetitions, but some folks may find it a bit
> too dense.  I dunno.

I'm inclined to be repetitive in order to keep '--git-completion-helper-all' intact, e.g. for grepping.

> 
>>
>>   		if (arg[1] != '-') {
>>   			ctx->opt = arg + 1;
Previous: Junio C HamanoNext: Junio C Hamano
Message 4 of 9 in “Support enabling bash completion of all options”
  1. 0/2 Support enabling bash completion of all optionsRyan Zoeller, Aug 19, 2020
  2. 1/2 parse-options: add --git-completion-helper-allRyan Zoeller, Aug 19, 2020
  3. Junio C HamanoAug 19, 2020
  4. Ryan ZoellerAug 19, 2020
  5. Junio C HamanoAug 19, 2020
  6. 2/2 completion: add GIT_COMPLETION_SHOW_ALL env varRyan Zoeller, Aug 19, 2020
  7. 0/2 Support enabling bash completion of all optionsRyan Zoeller, Aug 19, 2020
  8. 1/2 parse-options: add --git-completion-helper-allRyan Zoeller, Aug 19, 2020
  9. 2/2 completion: add GIT_COMPLETION_SHOW_ALL env varRyan Zoeller, Aug 19, 2020

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.