From: Junio C Hamano Date: Wed, 24 Jun 2015 19:21:51 +0000 (-0700) Subject: Merge branch 'mh/reporting-broken-refs-from-for-each-ref' X-Git-Tag: v2.5.0-rc0~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9d71c5f408dabb94f21891f69de17aa72d4787c3;p=thirdparty%2Fgit.git Merge branch 'mh/reporting-broken-refs-from-for-each-ref' "git for-each-ref" reported "missing object" for 0{40} when it encounters a broken ref. The lack of object whose name is 0{40} is not the problem; the ref being broken is. * mh/reporting-broken-refs-from-for-each-ref: read_loose_refs(): treat NULL_SHA1 loose references as broken read_loose_refs(): simplify function logic for-each-ref: report broken references correctly t6301: new tests of for-each-ref error handling --- 9d71c5f408dabb94f21891f69de17aa72d4787c3 diff --cc refs.c index 26d1ac1e32,07f8847e6d..7ac05cf21a --- a/refs.c +++ b/refs.c @@@ -1376,20 -1286,31 +1378,33 @@@ static void read_loose_refs(const char if (*refs->name) { hashclr(sha1); flag = 0; - if (resolve_gitlink_ref(refs->name, refname.buf, sha1) < 0) { - hashclr(sha1); - flag |= REF_ISBROKEN; - } - } else if (read_ref_full(refname.buf, - RESOLVE_REF_READING, - sha1, &flag)) { + read_ok = !resolve_gitlink_ref(refs->name, + refname.buf, sha1); + } else { + read_ok = !read_ref_full(refname.buf, + RESOLVE_REF_READING, + sha1, &flag); + } + + if (!read_ok) { hashclr(sha1); flag |= REF_ISBROKEN; + } else if (is_null_sha1(sha1)) { + /* + * It is so astronomically unlikely + * that NULL_SHA1 is the SHA-1 of an + * actual object that we consider its + * appearance in a loose reference + * file to be repo corruption + * (probably due to a software bug). + */ + flag |= REF_ISBROKEN; } + if (check_refname_format(refname.buf, REFNAME_ALLOW_ONELEVEL)) { + if (!refname_is_safe(refname.buf)) + die("loose refname is dangerous: %s", refname.buf); hashclr(sha1); flag |= REF_BAD_NAME | REF_ISBROKEN; }