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

Re: [PATCH v8 2/4] cat-file: teach cat-file a '--literally' option

From
karthik nayak <karthik.188@gmail.com>
Date
Apr 16, 2015, 07:26 UTC
Message-ID
<552F6429.9050304@gmail.com>
In-Reply-To
<xmqqiocxjeqn.fsf@gitster.dls.corp.google.com>
On 04/16/2015 02:22 AM, Junio C Hamano wrote:
Show 52 quoted lines
> Junio C Hamano <gitster@pobox.com> writes:
>
>> Karthik Nayak <karthik.188@gmail.com> writes:
>> ...
>>> -	if (argc != 3 && argc != 2)
>>> +	if (argc < 2 || argc > 4)
>>>   		usage_with_options(cat_file_usage, options);
>>
>> Hmm, why this change?
>>
>> By allowing 4 args blindly like this, you will let something like
>> these to pass:
>>
>>      $ git cat-file --textconv -t HEAD
>>      commit
>>      $ git cat-file -p -t HEAD
>>      commit
>>      $ git cat-file -s -t HEAD
>>      commit
>>      $ git cat-file -t -s HEAD
>>      879
>>
>> It is fine if you are declaring that the last one wins when these
>> mutually-exclusive options are given. "git cat-file -e -s -t HEAD"
>> should also say "commit" if that is what you are doing, but instead
>> the code with this patch complains, which is bad.
>>
>> It also is fine and is more in line with the spirit of the original
>> code if you keep the rule tight and only one of these mutually
>> exclusive options is allowed.
>>
>> In either case, this check needs to be rethought.
>
> I wonder if we want to do something like this as a preliminary step
> before your [PATCH 2/4].  Everything after the parse_options() call
> seems to protect against leftover argc depending on what they need
> already, so the only thing existing "we take only 2 or 3 args" check
> is doing is to protect against giving more than one command mode
> options, I think.  And OPT_CMDMODE() should do a much better job at
> that that kind of thing, by giving a more informative error message
> e.g.
>
>      $ git cat-file -p -e HEAD
>      error: switch 'e': incompatible with -p
>
> This is a tangent, but while we are in the vicinity, we may want to
> rethink the help message we attach to the '-e' option.  Technically
> the current message is _not_ wrong per-se, but it misses the point.
> The primary thing the option does is to check the (e)xistence of the
> named object, and the fact that it does so silently is merely a
> detail of the operation.  The current help text omits the more
> important part of what the option is.

Would you rather check '-e' and go on to check '-p' or do you merely just want a different message. As far as I see whenever any option other than a '-e' is given it indirectly has to check for the existence of the object.

eg: $ git cat-file -t asdfghjkl fatal: Not a valid object name asdfghjkl

$ git cat-file -e asdfghjkl fatal: Not a valid object name asdfghjkl

So when a user is giving the '-e' option he just expects a silent output if the object exists, hence we rather have the option '-e' behave as a mutually exclusive option and output the error message like.

$ git cat-file -p -e HEAD error: switch 'e': incompatible with -p

what do you think?
Show 37 quoted lines
>
>   builtin/cat-file.c | 13 +++++--------
>   1 file changed, 5 insertions(+), 8 deletions(-)
>
> diff --git a/builtin/cat-file.c b/builtin/cat-file.c
> index 1ec7190..534991d 100644
> --- a/builtin/cat-file.c
> +++ b/builtin/cat-file.c
> @@ -372,12 +372,12 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
>
>   	const struct option options[] = {
>   		OPT_GROUP(N_("<type> can be one of: blob, tree, commit, tag")),
> -		OPT_SET_INT('t', NULL, &opt, N_("show object type"), 't'),
> -		OPT_SET_INT('s', NULL, &opt, N_("show object size"), 's'),
> -		OPT_SET_INT('e', NULL, &opt,
> +		OPT_CMDMODE('t', NULL, &opt, N_("show object type"), 't'),
> +		OPT_CMDMODE('s', NULL, &opt, N_("show object size"), 's'),
> +		OPT_CMDMODE('e', NULL, &opt,
>   			    N_("exit with zero when there's no error"), 'e'),
> -		OPT_SET_INT('p', NULL, &opt, N_("pretty-print object's content"), 'p'),
> -		OPT_SET_INT(0, "textconv", &opt,
> +		OPT_CMDMODE('p', NULL, &opt, N_("pretty-print object's content"), 'p'),
> +		OPT_CMDMODE(0, "textconv", &opt,
>   			    N_("for blob objects, run textconv on object's content"), 'c'),
>   		OPT_BOOL( 0, "literally", &literally,
>   			  N_("allow -s and -t to work with broken/corrupt objects")),
> @@ -392,9 +392,6 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
>
>   	git_config(git_cat_file_config, NULL);
>
> -	if (argc < 2 || argc > 4)
> -		usage_with_options(cat_file_usage, options);
> -
>   	argc = parse_options(argc, argv, prefix, options, cat_file_usage, 0);
>
>   	if (opt) {
>
Thanks! Didn't know about the OPT_CMDMODE option.
Previous: Junio C HamanoNext: Junio C Hamano
Message 23 of 44 in “cat-file: teach cat-file a '--literally' option”
  1. 0/4 cat-file: teach cat-file a '--literally' optionkarthik nayak, Apr 15, 2015
  2. 1/4 sha1_file.c: support reading from a loose object of unknown typeKarthik Nayak, Apr 15, 2015
  3. Junio C HamanoApr 15, 2015
  4. Jeff KingApr 15, 2015
  5. Jeff KingApr 17, 2015
  6. Junio C HamanoApr 17, 2015
  7. Jeff KingApr 17, 2015
  8. Junio C HamanoApr 17, 2015
  9. karthik nayakApr 20, 2015
  10. Jeff KingApr 20, 2015
  11. karthik nayakApr 21, 2015
  12. Jeff KingApr 21, 2015
  13. karthik nayakApr 17, 2015
  14. Jeff KingApr 17, 2015
  15. karthik nayakApr 18, 2015
  16. Junio C HamanoApr 17, 2015
  17. karthik nayakApr 18, 2015
  18. Eric SunshineApr 17, 2015
  19. karthik nayakApr 18, 2015
  20. 2/4 cat-file: teach cat-file a '--literally' optionKarthik Nayak, Apr 15, 2015
  21. Junio C HamanoApr 15, 2015
  22. Junio C HamanoApr 15, 2015
  23. karthik nayakApr 16, 2015
  24. Junio C HamanoApr 16, 2015
  25. Karthik NayakApr 17, 2015
  26. Junio C HamanoApr 17, 2015
  27. Charles BaileyApr 19, 2015
  28. Junio C HamanoApr 20, 2015
  29. Charles BaileyApr 20, 2015
  30. Karthik NayakApr 20, 2015
  31. Charles BaileyApr 20, 2015
  32. karthik nayakApr 20, 2015
  33. Charles BaileyApr 21, 2015
  34. Eric SunshineApr 21, 2015
  35. Junio C HamanoApr 21, 2015
  36. karthik nayakApr 25, 2015
  37. Junio C HamanoApr 25, 2015
  38. karthik nayakApr 27, 2015
  39. Eric SunshineApr 27, 2015
  40. karthik nayakApr 28, 2015
  41. 3/4 cat-file: add documentation for '--literally' option.Karthik Nayak, Apr 15, 2015
  42. 4/4 t1006: add tests for git cat-file --literallyKarthik Nayak, Apr 15, 2015
  43. Eric SunshineApr 18, 2015
  44. karthik nayakApr 18, 2015

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.