Re: [PATCH 2/5] describe: error if blob not found
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 18, 2025, 21:12 UTC
- Message-ID
- <xmqqbjocibbk.fsf@gitster.g>
- In-Reply-To
- <20250818210125.GB1024556@coredump.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 6 quoted lines
> If describe_blob() does not find the blob in question, it returns an > empty strbuf, and we print an empty line. This differs from > describe_commit(), which always either returns an answer or calls die() > itself. As the blob function was bolted onto the command afterwards, I > think its behavior is not intentional, and it is just a bug that it does > not report an error.
Yes, let's do so. Silently succeeding without returning anything useful is not what we usually do in this system.
Show 8 quoted lines
> This one is perhaps the most controversial, as it is a change in > behavior. But the current behavior just really seems like a bug to me. > > Unlike what René posted earlier, I didn't record the dst strbuf's > original size and compare against that. This is a static function with > only one caller that passes in an empty strbuf, so being overly > defensive didn't seem worth it (arguably these functions should just > return an allocated buffer anyway).
Sounds sensible.
Thanks.
Show 31 quoted lines
> diff --git a/builtin/describe.c b/builtin/describe.c
> index 383d3e6b9a..06e413d937 100644
> --- a/builtin/describe.c
> +++ b/builtin/describe.c
> @@ -535,6 +535,9 @@ static void describe_blob(const struct object_id *oid, struct strbuf *dst)
> reset_revision_walk();
> release_revisions(&revs);
> strvec_clear(&args);
> +
> + if (!dst->len)
> + die(_("blob '%s' not reachable from HEAD"), oid_to_hex(oid));
> }
>
> static void describe(const char *arg, int last_one)
> diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh
> index 256ccaefb7..470631d17d 100755
> --- a/t/t6120-describe.sh
> +++ b/t/t6120-describe.sh
> @@ -409,6 +409,12 @@ test_expect_success 'describe tag object' '
> test_grep "fatal: test-blob-1 is neither a commit nor blob" actual
> '
>
> +test_expect_success 'describe an unreachable blob' '
> + blob=$(echo not-found-anywhere | git hash-object -w --stdin) &&
> + test_must_fail git describe $blob 2>actual &&
> + test_grep "blob .$blob. not reachable from HEAD" actual
> +'
> +
> test_expect_success ULIMIT_STACK_SIZE 'name-rev works in a deep repo' '
> i=1 &&
> while test $i -lt 8000