}
/* Both have unique ones -- do they match? */
if (memcmp(packed_sha1, unpacked_sha1, 20))
- return -2;
+ return SHORT_NAME_AMBIGUOUS;
memcpy(sha1, packed_sha1, 20);
return 0;
}
{
int status;
static char hex[41];
+
memcpy(hex, sha1_to_hex(sha1), 40);
+ if (len == 40)
+ return hex;
while (len < 40) {
unsigned char sha1_ret[20];
status = get_short_sha1(hex, len, sha1_ret, 1);
slash = 0;
continue;
}
- return slash;
+ break;
}
return slash;
}
NULL
};
const char **p;
- int found = 0;
if (len == 40 && !get_sha1_hex(str, sha1))
return 0;
for (p = prefix; *p; p++) {
char *pathname = git_path("%s/%.*s", *p, len, str);
-
- 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);
+ if (!read_ref(pathname, sha1))
+ return 0;
}
+ return -1;
}
static int get_sha1_1(const char *name, int len, unsigned char *sha1);