Anonymous committed 99a0a6e

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.

Comments (0)

Files changed (1)

 #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];
 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;
 			if (namelen > 255)
 			memcpy(path + baselen, de->d_name, namelen+1);
-			if (lstat(path, &st) < 0)
+			if (lstat(git_path(path), &st) < 0)
 			if (S_ISDIR(st.st_mode)) {
 				retval = do_for_each_ref(path, fn);
 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)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.