git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Kevin Day <toasty@dragondata.com>
Cc: git@vger.kernel.org
Subject: Re: Commands using -h as an option don't work consistently
Date: Wed, 29 May 2024 15:22:09 -0700	[thread overview]
Message-ID: <xmqqfru0tg1a.fsf@gitster.g> (raw)
In-Reply-To: <52819526-4C6F-418C-8B8B-A4D5C7E371EA@dragondata.com> (Kevin Day's message of "Wed, 29 May 2024 17:03:04 -0500")

Kevin Day <toasty@dragondata.com> writes:

> Because of a bug in parse-options.c, any command that has a '-h' option will sometimes display the usage page instead of executing. For example, ls-remote has two options:
>
>     -t, --[no-]tags       limit to tags
>     -h, --[no-]heads      limit to heads
>
> git ls-remote --heads  #works
> git ls-remote --tags  #works
> git ls-remote -t  #works
> git ls-remote -t -h  #works
> git ls-remote -h  #shows the help page
>
> This is because of these lines in parse-options.c:
>
> /* lone -h asks for help */
> if (internal_help && ctx->total == 1 && !strcmp(arg + 1, "h"))
> goto show_usage;
>
> This is being executed before it looks to see if there actually is a -h option.

This is very much deliberate design.  I think in these cases we make
an unambiguous longhand (e.g. "--heads" we see above) available, or
you can explicitly say the remote, i.e. "git ls-remote -h origin",
and that has been the officially accepted "solution".

Let's see what improvements you bring to the table.

> The options I see:
>
> 1) Fix -h handling and add ignores and fixes where possible to the
> failing tests and try to not use -h as an option for anything new.

I do not quite understand the former half, but "try not to use -h
for new things" is a very good idea and it is pretty much what we
have been doing.

    Note: There however is a scenario where we cannot avoid it---if
    we were trying to match/mimick some established external
    command, we may have to use the same "-h" as they use (e.g.,
    "git grep -h -e ..." tries to mimick "grep -h -e ...").  Even in
    that case, because "git grep -h" alone would not make any sense
    without any pattern, the command behaves very sensibly, by the
    way.

> 2) Change -h to -H or something, but this breaks backwards compatibility

As you said it yourself, this is a non starter.

> 3) Fix it so that -h works if a command uses it, and additionally
> make a new global option -? or --usage or something that always
> shows the usage page and change tests to use that, while leaving
> -h sometimes showing usage and sometimes executing the option to
> preserve as much backward compatibility as possible.

Reading this and then going back to the ls-remote examples you gave
earlier, I do not think the current behaviour is all that bad,
relative to what is being proposed, except for an explicit support
for "-?".

We can certainly add support for "-?", but the behaviour when "-?"
is not used (and when "-h" is used) would not have to change from
the current behaviour, and that would still be serviceable, I
presume?

We actually do not have to *add* support for "-?", as it comes with
parse-options for free ;-)

    $ git ls-remote -\?
    error: unknown switch '?'
    usage: git ls-remote ...
	... the same "ls-remote -h" output given here ...

So, I dunno.

  reply	other threads:[~2024-05-29 22:22 UTC|newest]

Thread overview: 97+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-29 22:03 Commands using -h as an option don't work consistently Kevin Day
2024-05-29 22:22 ` Junio C Hamano [this message]
2024-05-29 22:40   ` Kevin Day
  -- strict thread matches above, loose matches on Subject: below --
2024-05-07  8:27 [RFC PATCH] docs: document upcoming breaking changes Patrick Steinhardt
2024-05-07 10:38 ` Johannes Schindelin
2024-05-08 13:55   ` Patrick Steinhardt
2024-05-07 22:02 ` Junio C Hamano
2024-05-08 13:54   ` Patrick Steinhardt
2024-05-08 14:58     ` Junio C Hamano
2024-05-08 15:59     ` Dragan Simic
2024-05-10 11:36       ` Patrick Steinhardt
2024-05-10 12:43         ` Dragan Simic
2024-05-08 13:15 ` Phillip Wood
2024-05-08 13:55   ` Patrick Steinhardt
2024-05-10  2:15 ` Justin Tobler
2024-05-10  4:47   ` Junio C Hamano
2024-05-14  6:50     ` Patrick Steinhardt
2024-05-14  6:16 ` [RFC PATCH v2] " Patrick Steinhardt
2024-05-14 10:48   ` Karthik Nayak
2024-05-14 11:22     ` Patrick Steinhardt
2024-05-14 15:45       ` Junio C Hamano
2024-05-14 12:32     ` Dragan Simic
2024-05-24 12:54 ` [PATCH v3] " Patrick Steinhardt
2024-05-24 17:27   ` Junio C Hamano
2024-05-30 12:04     ` Patrick Steinhardt
2024-05-30  3:23   ` Commands using -h as an option don't work consistently Junio C Hamano
2024-06-03 18:33     ` Junio C Hamano
2024-06-03 20:05       ` [PATCH 0/3] Branches are branches and not heads Junio C Hamano
2024-06-03 20:05         ` [PATCH 1/3] refs: call branches branches Junio C Hamano
2024-06-03 21:32           ` Eric Sunshine
2024-06-03 20:05         ` [PATCH 2/3] ls-remote: introduce --branches and deprecate --heads Junio C Hamano
2024-06-03 21:30           ` Rubén Justo
2024-06-03 21:42             ` Eric Sunshine
2024-06-03 21:48               ` Junio C Hamano
2024-06-03 20:05         ` [PATCH 3/3] show-ref: " Junio C Hamano
2024-06-03 21:32         ` [PATCH 0/3] Branches are branches and not heads Rubén Justo
2024-06-04  7:56           ` Patrick Steinhardt
2024-06-04 22:01         ` [PATCH v2 " Junio C Hamano
2024-06-04 22:01           ` [PATCH v2 1/3] refs: call branches branches Junio C Hamano
2024-06-04 22:01           ` [PATCH v2 2/3] ls-remote: introduce --branches and deprecate --heads Junio C Hamano
2024-06-06  9:39             ` Patrick Steinhardt
2024-06-06 15:18               ` Junio C Hamano
2024-06-04 22:01           ` [PATCH v2 3/3] show-ref: " Junio C Hamano
2024-06-14 19:32             ` Elijah Newren
2024-06-14 21:21               ` Junio C Hamano
2024-06-14 21:34                 ` Elijah Newren
2024-06-14 21:42                   ` Elijah Newren
2024-06-14 22:46                     ` Junio C Hamano
2024-06-06  9:39           ` [PATCH v2 0/3] Branches are branches and not heads Patrick Steinhardt
2024-05-31  7:56 ` [PATCH v4 0/4] docs: document upcoming breaking changes Patrick Steinhardt
2024-05-31  7:56   ` [PATCH v4 1/4] docs: introduce document to announce " Patrick Steinhardt
2024-05-31 16:51     ` Junio C Hamano
2024-06-03  9:32       ` Patrick Steinhardt
2024-06-03 16:17         ` Junio C Hamano
2024-06-04  7:42           ` Patrick Steinhardt
2024-05-31  7:56   ` [PATCH v4 2/4] BreakingChanges: document upcoming change from "sha1" to "sha256" Patrick Steinhardt
2024-05-31 17:00     ` Junio C Hamano
2024-05-31  7:56   ` [PATCH v4 3/4] BreakingChanges: document removal of grafting Patrick Steinhardt
2024-05-31  7:56   ` [PATCH v4 4/4] BreakingChanges: document that we do not plan to deprecate git-checkout Patrick Steinhardt
2024-05-31 17:05     ` Junio C Hamano
2024-05-31 23:35       ` Todd Zullinger
2024-05-31  8:43   ` [PATCH v4 0/4] docs: document upcoming breaking changes Junio C Hamano
2024-05-31 11:15     ` Patrick Steinhardt
2024-06-03  9:28 ` [PATCH v5 " Patrick Steinhardt
2024-06-03  9:28   ` [PATCH v5 1/4] docs: introduce document to announce " Patrick Steinhardt
2024-06-03 14:08     ` Phillip Wood
2024-06-03 16:24     ` Junio C Hamano
2024-06-04  6:59       ` Patrick Steinhardt
2024-06-03  9:28   ` [PATCH v5 2/4] BreakingChanges: document upcoming change from "sha1" to "sha256" Patrick Steinhardt
2024-06-03 16:36     ` Junio C Hamano
2024-06-04  7:06       ` Patrick Steinhardt
2024-06-04 17:16         ` Junio C Hamano
2024-06-03  9:28   ` [PATCH v5 3/4] BreakingChanges: document removal of grafting Patrick Steinhardt
2024-06-03 16:42     ` Junio C Hamano
2024-06-03  9:28   ` [PATCH v5 4/4] BreakingChanges: document that we do not plan to deprecate git-checkout Patrick Steinhardt
2024-06-03 16:52     ` Junio C Hamano
2024-06-04  7:11       ` Patrick Steinhardt
2024-06-04 12:32 ` [PATCH v6 0/4] docs: document upcoming breaking changes Patrick Steinhardt
2024-06-04 12:32   ` [PATCH v6 1/4] docs: introduce document to announce " Patrick Steinhardt
2024-06-04 17:59     ` Junio C Hamano
2024-06-05  5:31       ` Patrick Steinhardt
2024-06-05 16:03         ` Junio C Hamano
2024-06-05 17:52           ` Junio C Hamano
2024-06-06  4:35             ` Patrick Steinhardt
2024-06-04 12:32   ` [PATCH v6 2/4] BreakingChanges: document upcoming change from "sha1" to "sha256" Patrick Steinhardt
2024-06-04 12:32   ` [PATCH v6 3/4] BreakingChanges: document removal of grafting Patrick Steinhardt
2024-06-04 18:00     ` Junio C Hamano
2024-06-04 12:32   ` [PATCH v6 4/4] BreakingChanges: document that we do not plan to deprecate git-checkout Patrick Steinhardt
2024-06-04 14:23   ` [PATCH v6 0/4] docs: document upcoming breaking changes Phillip Wood
2024-06-04 18:01     ` Junio C Hamano
2024-06-05  5:32       ` Patrick Steinhardt
2024-06-14  6:42 ` [PATCH v7 " Patrick Steinhardt
2024-06-14  6:42   ` [PATCH v7 1/4] docs: introduce document to announce " Patrick Steinhardt
2024-06-14 16:08     ` Junio C Hamano
2024-06-14  6:42   ` [PATCH v7 2/4] BreakingChanges: document upcoming change from "sha1" to "sha256" Patrick Steinhardt
2024-06-14  6:42   ` [PATCH v7 3/4] BreakingChanges: document removal of grafting Patrick Steinhardt
2024-06-14  6:42   ` [PATCH v7 4/4] BreakingChanges: document that we do not plan to deprecate git-checkout Patrick Steinhardt

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=xmqqfru0tg1a.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=toasty@dragondata.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).