int get_sha1(const char *str, unsigned char *sha1)
{
static char pathname[PATH_MAX];
+ static const char *prefix[] = {
+ "",
+ "refs",
+ "refs/tags",
+ "refs/heads",
+ "refs/snap",
+ NULL
+ };
+ const char *gitdir;
+ const char **p;
if (!get_sha1_hex(str, sha1))
return 0;
- if (!get_sha1_file(str, sha1))
- return 0;
- snprintf(pathname, sizeof(pathname), ".git/%s", str);
- if (!get_sha1_file(pathname, sha1))
- return 0;
+
+ gitdir = ".git";
+ for (p = prefix; *p; p++) {
+ snprintf(pathname, sizeof(pathname), "%s/%s/%s", gitdir, *p, str);
+ if (!get_sha1_file(pathname, sha1))
+ return 0;
+ }
+
return -1;
}