All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: Philippe Blain via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>,
	"Brandon Williams" <bwilliamseng@gmail.com>,
	"Felipe Contreras" <felipe.contreras@gmail.com>,
	"Ryan Zoeller" <rtzoeller@rtzoeller.com>,
	"SZEDER Gábor" <szeder.dev@gmail.com>,
	"Philippe Blain" <levraiphilippeblain@gmail.com>
Subject: Re: [PATCH] parse-options: don't complete option aliases by default
Date: Thu, 15 Jul 2021 18:16:26 +0200	[thread overview]
Message-ID: <8735sfzgkg.fsf@evledraar.gmail.com> (raw)
In-Reply-To: <pull.996.git.1626353925051.gitgitgadget@gmail.com>


On Thu, Jul 15 2021, Philippe Blain via GitGitGadget wrote:

> From: Philippe Blain <levraiphilippeblain@gmail.com>
>
> Since 'OPT_ALIAS' was created in 5c387428f1 (parse-options: don't emit
> "ambiguous option" for aliases, 2019-04-29), 'git clone
> --git-completion-helper', which is used by the Bash completion script to
> list options accepted by clone (via '__gitcomp_builtin'), lists both
> '--recurse-submodules' and its alias '--recursive', which was not the
> case before since '--recursive' had the PARSE_OPT_HIDDEN flag set, and
> options with this flag are skipped by 'parse-options.c::show_gitcomp',
> which implements 'git <cmd> --git-completion-helper'.
>
> At the point where 'show_gitcomp' is called in 'parse_options_step',
> 'preprocess_options' was already called in 'parse_options', so any
> aliases are now copies of the original options with a modified help text
> indicating they are aliases.
>
> Helpfully, since 64cc539fd2 (parse-options: don't leak alias help
> messages, 2021-03-21) these copies have the PARSE_OPT_FROM_ALIAS flag
> set, so check that flag early in 'show_gitcomp' and do not print them,
> unless the user explicitely requested that *all* completion be shown (by
> setting 'GIT_COMPLETION_SHOW_ALL'). After all, if we want to encourage
> the use of '--recurse-submodules' over '--recursive', we'd better just
> suggest the former.
>
> The only other options alias is 'log' and friends' '--mailmap', which is
> an alias for '--use-mailmap', but the Bash completion helpers for these
> commands do not use '__gitcomp_builtin', and thus are unnaffected by
> this change.
>
> Test the new behaviour in t9902-completion.sh. As a side effect, this
> also tests the correct behaviour of GIT_COMPLETION_SHOW_ALL, which was
> not tested before. Note that since '__gitcomp_builtin' caches the
> options it shows, we need to re-source the completion script to clear
> that cache for the second test.
>
> Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
> ---
>     parse-options: don't complete option aliases by default
>
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-996%2Fphil-blain%2Fclone-recurse-completion-v1
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-996/phil-blain/clone-recurse-completion-v1
> Pull-Request: https://github.com/gitgitgadget/git/pull/996
>
>  parse-options.c       |  2 +-
>  t/t9902-completion.sh | 13 +++++++++++++
>  2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/parse-options.c b/parse-options.c
> index e6f56768ca5..2abff136a17 100644
> --- a/parse-options.c
> +++ b/parse-options.c
> @@ -585,7 +585,7 @@ static int show_gitcomp(const struct option *opts, int show_all)
>  		if (!opts->long_name)
>  			continue;
>  		if (!show_all &&
> -			(opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE)))
> +			(opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE | PARSE_OPT_FROM_ALIAS)))
>  			continue;
>  
>  		switch (opts->type) {
> diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
> index cb057ef1613..11573936d58 100755
> --- a/t/t9902-completion.sh
> +++ b/t/t9902-completion.sh
> @@ -2404,6 +2404,19 @@ test_expect_success 'sourcing the completion script clears cached --options' '
>  	verbose test -z "$__gitcomp_builtin_notes_edit"
>  '
>  
> +test_expect_success 'option aliases are not shown by default' '
> +	test_completion "git clone --recurs" "--recurse-submodules "
> +'

I'm a bit biased here since I like --recursive better, but let's not
drag that whole argument up again. I don't find the argument in
bb62e0a99fc (clone: teach --recurse-submodules to optionally take a
pathspec, 2017-03-17) convincing enough to have moved such a prominent
use-case to a longer option name.

But, water under the bridge. Aside from that:

For me a Google search for "git clone --recursive" is ~40k results, but
"git clone --recurse-submodules". The former links to various
discussions/docs/stackoverflow answers, often --recurse-submodules isn't
mentioned at all or as an aside.

I think it's unfortunate that we:

 1. Conflate whether something shows up in completion v.s. the
    help. Given its prominence and that "git clone -h" is ~50 lines why
    not note --recursive there.

 2. Don't have the completion aware of these aliases, i.e. "git clone
    --rec<TAB>" before your chance offers a completion of both, that sucks,
    we should fully complete the non-alias instead.

 3. Making it PARSE_OPT_HIDDEN "solves" #2 at the cost of hiding it in
    "git help -h", and now this won't work, but did before:

        git clone --recursi<TAB>

    I.e. even if we didn't want to do #2 *and* wanted to hide it in the
    usage output surely completing an unmbigous prefix is better, even
    if it's a hidden option?

Per-se none of this is a blocker or "we must fix this first" for this
particular change, we have this in many existing cases.

I daresay there's no other alias that's in as wide a use in the wild, so
we should think about this one particularly carefully though.

It's not fully clear from your commit message which of 1-3 you're aiming
for, I think it's more of the "discourage its use". 

Sure, fair enough, but PARSE_OPT_HIDDEN is not a 1=1 mapping to that,
and can often lead to more user confusion.

E.g. the user has used --recursive for years, but can't even find it in
-h (I also think it's a mistake to have entirely removed it from the
docs, even if one agrees with its "deprecation" I'd say we should keep
some "used to be called --recursive" note there).


  reply	other threads:[~2021-07-15 16:29 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-15 12:58 [PATCH] parse-options: don't complete option aliases by default Philippe Blain via GitGitGadget
2021-07-15 16:16 ` Ævar Arnfjörð Bjarmason [this message]
2021-07-15 17:16   ` Felipe Contreras
2021-07-15 18:57   ` Junio C Hamano
2021-07-16  1:28     ` Philippe Blain
2021-07-16  1:31   ` Philippe Blain
2021-07-15 17:04 ` Felipe Contreras
2021-07-16  1:28   ` Philippe Blain
2021-07-16  1:55 ` [PATCH v2] " Philippe Blain via GitGitGadget

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8735sfzgkg.fsf@evledraar.gmail.com \
    --to=avarab@gmail.com \
    --cc=bwilliamseng@gmail.com \
    --cc=felipe.contreras@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=levraiphilippeblain@gmail.com \
    --cc=pclouds@gmail.com \
    --cc=rtzoeller@rtzoeller.com \
    --cc=szeder.dev@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.