git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: "Michal Čihař" <michal@cihar.com>
Cc: git@vger.kernel.org
Subject: Re: git cat-file -e behavior
Date: Mon, 29 Feb 2016 06:44:55 -0500	[thread overview]
Message-ID: <20160229114455.GD29769@sigill.intra.peff.net> (raw)
In-Reply-To: <56D41645.4050800@cihar.com>

On Mon, Feb 29, 2016 at 10:58:29AM +0100, Michal Čihař wrote:

> the documentation for "git cat-file -e" says:
> 
> > Suppress all output; instead exit with zero status if <object> exists
> and is a valid object.
> 
> However running it on non existing object will complain "fatal: Not a
> valid object name".
> 
> $ git cat-file -e master:README.rst
> $ echo $?
> 0
> $ git cat-file -e master:foo
> fatal: Not a valid object name master:foo
> $ echo $?
> 128
> 
> Is the output in this case expected?
> 
> I'm currently running 2.7.0.

It looks like it has been this way forever. The first thing we do with
the object is resolve its name to a sha1, and that's where the error you
see comes from. And then we actually check whether we have the object.

I think the intended use was to feed it a sha1 to see if it exists. Then
the name-resolution step is a noop.

I'm not sure if the behavior you are seeing is all that bad (the
documentation could be read as suppressing the normal stdout output, but
error messages remain), but it would be easy to change:

diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 54db118..afde169 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -35,6 +35,9 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
 	if (unknown_type)
 		flags |= LOOKUP_UNKNOWN_OBJECT;
 
+	if (opt == 'e')
+		return !has_sha1_file(sha1);
+
 	if (get_sha1_with_context(obj_name, 0, sha1, &obj_context))
 		die("Not a valid object name %s", obj_name);
 
@@ -58,9 +61,6 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
 		printf("%lu\n", size);
 		return 0;
 
-	case 'e':
-		return !has_sha1_file(sha1);
-
 	case 'c':
 		if (!obj_context.path[0])
 			die("git cat-file --textconv %s: <object> must be <sha1:path>",

  reply	other threads:[~2016-02-29 11:45 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-29  9:58 git cat-file -e behavior Michal Čihař
2016-02-29 11:44 ` Jeff King [this message]
2016-02-29 12:16   ` Michal Čihař
2016-02-29 12:36     ` Jeff King
2016-02-29 12:40   ` Jeff King

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=20160229114455.GD29769@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=michal@cihar.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).