[PATCH] Make do_each_ref() follow symlinks.
authorMatt Draisey <mattdraisey@sympatico.ca>
Tue, 16 Aug 2005 05:46:34 +0000 (01:46 -0400)
committerJunio C Hamano <junkio@cox.net>
Wed, 17 Aug 2005 01:33:51 +0000 (18:33 -0700)
Because there is no reason not to, and this makes things a bit
safer when running "git prune".

[jc: I do not necessarily agree with the reasoning of the
original author that it is a good way to keep "git prune" from
stomping on objects to have a symlink that points at .git/refs
of the repository A in the .git/refs of the repository B when
repository A borrows object database from repository B.  For one
thing, the object database that everybody borrows objects from
may not even have its own .git/refs hierarchy.  Come to think of
it, maybe we should disallow symlink inside .git/refs hierarchy;
we update the files there by creat/rename pair, so having
symlinks would not work anyway when you do anything that would
update them.]

Signed-off-by: Junio C Hamano <junkio@cox.net>
refs.c

diff --git a/refs.c b/refs.c
index a5c894661090549e1676c7dd26fd2f72eb330d9f..161018097def05f717ae20e59e3df6cc1b01ab77 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -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(git_path("%s", path), &st) < 0)
+                       if (stat(git_path("%s", path), &st) < 0)
                                continue;
                        if (S_ISDIR(st.st_mode)) {
                                retval = do_for_each_ref(path, fn);