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
parent
b10d0ec732
commit
99a0a6e09f
15
refs.c
15
refs.c
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue