Make "for_each_ref()" always use the "canonical" refname.
authorLinus Torvalds <torvalds@g5.osdl.org>
Fri, 8 Jul 2005 20:56:05 +0000 (13:56 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 8 Jul 2005 20:56:05 +0000 (13:56 -0700)
It always uses a git-relative pathname, ie "refs/heads/master" instead of
".git/refs/heads/master" or whatever your GIT_DIR might be.

This way when we send refs back-and-forth between repositories, there's
never any question about GIT_DIR on either side.

refs.c

diff --git a/refs.c b/refs.c
index 09c9f90..774f163 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -3,10 +3,10 @@
 
 #include <errno.h>
 
-static int read_ref(const char *path, unsigned char *sha1)
+static int read_ref(const char *refname, unsigned char *sha1)
 {
        int ret = -1;
-       int fd = open(path, O_RDONLY);
+       int fd = open(git_path(refname), O_RDONLY);
 
        if (fd >= 0) {
                char buffer[60];
@@ -20,7 +20,7 @@ static int read_ref(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);
+       DIR *dir = opendir(git_path(base));
 
        if (dir) {
                struct dirent *de;
@@ -46,7 +46,7 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u
                        if (namelen > 255)
                                continue;
                        memcpy(path + baselen, de->d_name, namelen+1);
-                       if (lstat(path, &st) < 0)
+                       if (lstat(git_path(path), &st) < 0)
                                continue;
                        if (S_ISDIR(st.st_mode)) {
                                retval = do_for_each_ref(path, fn);
@@ -71,15 +71,14 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u
 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))
-               return fn(headpath, sha1);
+       if (!read_ref("HEAD", sha1))
+               return fn("HEAD", sha1);
        return 0;
 }
 
 int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1))
 {
-       return do_for_each_ref(get_refs_directory(), fn);
+       return do_for_each_ref("refs", fn);
 }
 
 static char *ref_file_name(const char *ref)