|
|
|
@ -235,18 +235,21 @@ static int ambiguous_path(const char *path, int len)
@@ -235,18 +235,21 @@ static int ambiguous_path(const char *path, int len)
|
|
|
|
|
|
|
|
|
|
static int get_sha1_basic(const char *str, int len, unsigned char *sha1) |
|
|
|
|
{ |
|
|
|
|
static const char *prefix[] = { |
|
|
|
|
"", |
|
|
|
|
"refs", |
|
|
|
|
"refs/tags", |
|
|
|
|
"refs/heads", |
|
|
|
|
"refs/remotes", |
|
|
|
|
static const char *fmt[] = { |
|
|
|
|
"/%.*s", |
|
|
|
|
"refs/%.*s", |
|
|
|
|
"refs/tags/%.*s", |
|
|
|
|
"refs/heads/%.*s", |
|
|
|
|
"refs/remotes/%.*s", |
|
|
|
|
"refs/remotes/%.*s/HEAD", |
|
|
|
|
NULL |
|
|
|
|
}; |
|
|
|
|
const char **p; |
|
|
|
|
const char *warning = "warning: refname '%.*s' is ambiguous.\n"; |
|
|
|
|
char *pathname; |
|
|
|
|
int already_found = 0; |
|
|
|
|
unsigned char *this_result; |
|
|
|
|
unsigned char sha1_from_ref[20]; |
|
|
|
|
|
|
|
|
|
if (len == 40 && !get_sha1_hex(str, sha1)) |
|
|
|
|
return 0; |
|
|
|
@ -255,11 +258,9 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
@@ -255,11 +258,9 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
|
|
|
|
|
if (ambiguous_path(str, len)) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
for (p = prefix; *p; p++) { |
|
|
|
|
unsigned char sha1_from_ref[20]; |
|
|
|
|
unsigned char *this_result = |
|
|
|
|
already_found ? sha1_from_ref : sha1; |
|
|
|
|
pathname = git_path("%s/%.*s", *p, len, str); |
|
|
|
|
for (p = fmt; *p; p++) { |
|
|
|
|
this_result = already_found ? sha1_from_ref : sha1; |
|
|
|
|
pathname = git_path(*p, len, str); |
|
|
|
|
if (!read_ref(pathname, this_result)) { |
|
|
|
|
if (warn_ambiguous_refs) { |
|
|
|
|
if (already_found && |
|
|
|
|