@ -114,7 +114,7 @@ int read_ref(const char *filename, unsigned char *sha1)
return -1;
return -1;
}
}
static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1))
static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1), int trim)
{
{
int retval = 0;
int retval = 0;
DIR *dir = opendir(git_path("%s", base));
DIR *dir = opendir(git_path("%s", base));
@ -146,7 +146,7 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u
if (stat(git_path("%s", path), &st) < 0)
if (stat(git_path("%s", path), &st) < 0)
continue;
continue;
if (S_ISDIR(st.st_mode)) {
if (S_ISDIR(st.st_mode)) {
retval = do_for_each_ref(path, fn);
retval = do_for_each_ref(path, fn, trim);
if (retval)
if (retval)
break;
break;
continue;
continue;
@ -160,7 +160,7 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u
"commit object!", path);
"commit object!", path);
continue;
continue;
}
}
retval = fn(path, sha1);
retval = fn(path + trim, sha1);
if (retval)
if (retval)
break;
break;
}
}
@ -180,7 +180,22 @@ int head_ref(int (*fn)(const char *path, const unsigned char *sha1))
int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1))
int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1))
{
{
return do_for_each_ref("refs", fn);
return do_for_each_ref("refs", fn, 0);
}
int for_each_tag_ref(int (*fn)(const char *path, const unsigned char *sha1))
{
return do_for_each_ref("refs/tags", fn, 10);
}
int for_each_branch_ref(int (*fn)(const char *path, const unsigned char *sha1))
{
return do_for_each_ref("refs/heads", fn, 11);
}
int for_each_remote_ref(int (*fn)(const char *path, const unsigned char *sha1))
{
return do_for_each_ref("refs/remotes", fn, 13);
}
}
static char *ref_file_name(const char *ref)
static char *ref_file_name(const char *ref)