+ if (!read_ref(pathname, sha1)) {
+ /* Must be unique; i.e. when heads/foo and
+ * tags/foo are both present, reject "foo".
+ */
+ if (1 < found++)
+ return -1;
+ }
+
+ /* We want to allow .git/description file and
+ * "description" branch to exist at the same time.
+ * "git-rev-parse description" should silently skip
+ * .git/description file as a candidate for
+ * get_sha1(). However, having garbage file anywhere
+ * under refs/ is not OK, and we would not have caught
+ * ambiguous heads and tags with the above test.
+ */
+ else if (**p && !access(pathname, F_OK)) {
+ /* Garbage exists under .git/refs */
+ return error("garbage ref found '%s'", pathname);
+ }
+ }
+ switch (found) {
+ case 0:
+ return -1;
+ case 1:
+ return 0;
+ default:
+ return error("ambiguous refname '%.*s'", len, str);
+ }