X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=refs.c;h=6ca04d3b0fb4b9c40e816820309fd879ffc1d40b;hb=41cb7488b9e5998ce1d665bbe10beca0a0f69c1c;hp=0a99dd1458d3d910c04803420556cbc092fe9ea9;hpb=8a65ff7666db1299449a397bab3d39d74b82aa54;p=git.git diff --git a/refs.c b/refs.c index 0a99dd14..6ca04d3b 100644 --- a/refs.c +++ b/refs.c @@ -17,7 +17,7 @@ static int read_ref(const char *path, unsigned char *sha1) 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); @@ -26,7 +26,14 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, unsigne 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]; @@ -42,8 +49,6 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, unsigne 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; @@ -63,9 +68,18 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, unsigne 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)