Make "for_each_ref()" always use the "canonical" refname.

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.
maint
Linus Torvalds 2005-07-08 13:56:05 -07:00
parent b10d0ec732
commit 99a0a6e09f
1 changed files with 7 additions and 8 deletions

15
refs.c
View File

@ -3,10 +3,10 @@


#include <errno.h> #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 ret = -1;
int fd = open(path, O_RDONLY); int fd = open(git_path(refname), O_RDONLY);


if (fd >= 0) { if (fd >= 0) {
char buffer[60]; 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)) static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1))
{ {
int retval = 0; int retval = 0;
DIR *dir = opendir(base); DIR *dir = opendir(git_path(base));


if (dir) { if (dir) {
struct dirent *de; 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) if (namelen > 255)
continue; continue;
memcpy(path + baselen, de->d_name, namelen+1); memcpy(path + baselen, de->d_name, namelen+1);
if (lstat(path, &st) < 0) if (lstat(git_path(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);
@ -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)) int head_ref(int (*fn)(const char *path, const unsigned char *sha1))
{ {
unsigned char sha1[20]; unsigned char sha1[20];
const char *headpath = git_path("HEAD"); if (!read_ref("HEAD", sha1))
if (!read_ref(headpath, sha1)) return fn("HEAD", sha1);
return fn(headpath, sha1);
return 0; return 0;
} }


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(get_refs_directory(), fn); return do_for_each_ref("refs", fn);
} }


static char *ref_file_name(const char *ref) static char *ref_file_name(const char *ref)