return ret;
}
-static int do_for_each_ref(const char *base, int (*fn)(const char *path, unsigned char *sha1))
+static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1))
{
int retval = 0;
DIR *dir = opendir(base);
struct dirent *de;
int baselen = strlen(base);
char *path = xmalloc(baselen + 257);
+
+ if (!strncmp(base, "./", 2)) {
+ base += 2;
+ baselen -= 2;
+ }
memcpy(path, base, baselen);
+ if (baselen && base[baselen-1] != '/')
+ path[baselen++] = '/';
while ((de = readdir(dir)) != NULL) {
unsigned char sha1[20];
if (lstat(path, &st) < 0)
continue;
if (S_ISDIR(st.st_mode)) {
- path[baselen + namelen] = '/';
- path[baselen + namelen + 1] = 0;
retval = do_for_each_ref(path, fn);
if (retval)
break;
return retval;
}
-int for_each_ref(int (*fn)(const char *path, unsigned char *sha1))
+int head_ref(int (*fn)(const char *path, const unsigned char *sha1))
+{
+ unsigned char sha1[20];
+ const char *headpath = git_path("HEAD");
+ if (!read_ref(headpath, sha1))
+ fn(headpath, sha1);
+ return do_for_each_ref(get_refs_directory(), fn);
+}
+
+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(get_refs_directory(), fn);
}
static char *ref_file_name(const char *ref)