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

Re: [PATCH] tag: Use OPT_BOOL instead of OPT_BOOLEAN to allow one action multiple times

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 31, 2013, 23:10 UTC
Message-ID
<7vbo5itjfl.fsf@alter.siamese.dyndns.org>
In-Reply-To
<51F8E81E.6000705@googlemail.com>
Stefan Beller <stefanbeller@googlemail.com> writes:
Show 10 quoted lines
> On 07/31/13 00:28, Junio C Hamano wrote:
>> 
>> we could just do
>> 
>> #define OPT_CMDMODE(s, l, v, h) \
>>     { OPTION_CMDMODE, (s), (l), (v), NULL, \
>>       (h), PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, (s) }
>> 
>
> I agree that's a better proposal than mine.

By the way, I haven't convinced myself that it is a good idea in general to encourage more use of command mode options, so I am a bit reluctant to add this before knowing which direction in the longer term we are going.

 - Some large-ish Git subcommands, like "git submodule", use the
   mode word (e.g. "git submodule status") to specify the operation
   mode (youe could consider "status" a subsubcommand that
   "submodule" subcommand takes).  These commands typically began
   their life from day one with the mode words.
 - On the other hand, many Git subcommands, like "git tag", have
   "the primary operation mode" (e.g. "create a new one" is the
   primary operation mode for "git tag"), and use command mode
   options to specify other operation modes (e.g. "--delete").
   These commands started as single purpose commands (i.e. to
   perform their "primary operation") but have organically grown
   over time and acquired command mode options to invoke their
   secondary operations.

As an end user, you need to learn which style each command takes, which is an unnecessary burden at the UI level. In the longer term, we may want to consider picking a single style, and migrating everybody to it. If I have to vote today, I would say we should teach "git submodule" to also take command mode options (e.g. "git submodule --status" will be understood the same way as "git submodule status"), make them issue warnings when mode words are used and encourage users to use command mode options instead, and optionally remove the support of mode words at a large version bump like 3.0.

One clear advantage mode words have over command mode options is that there is no room for end user confusion. The first word after "git subcmd" is the mode word, and you will not even dream of asking "what would 'git submodule add del foo' do?" as it is nonsensical. The command mode options, on the other hand, gives too much useless flexibility to ask for nonsense, e.g. "git tag --delete --verify", "git tag --no-delete --delete", etc., and extra code needs to detect and reject combinations. But commands that took mode options cannot be easily migrated to take mode words without hurting existing users and scripts (e.g. "git tag delete master" can never be a request to delete the tag 'master', as it is a request to create a tag whose name is 'delete' that points at the same object as 'master' points at).

Previous: Stefan BellerNext: Stefano Lattarini
Message 8 of 11 in “tag: Use OPT_BOOL instead of OPT_BOOLEAN to allow one action multiple times”
  1. tag: Use OPT_BOOL instead of OPT_BOOLEAN to allow one action multiple timesStefan Beller, Jul 30, 2013
  2. Junio C HamanoJul 30, 2013
  3. Stefan BellerJul 30, 2013
  4. Junio C HamanoJul 30, 2013
  5. Stefan BellerJul 30, 2013
  6. Junio C HamanoJul 30, 2013
  7. Stefan BellerJul 31, 2013
  8. Junio C HamanoJul 31, 2013
  9. Stefano LattariniAug 17, 2013
  10. Jonathan NiederAug 17, 2013
  11. Junio C HamanoAug 18, 2013

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.