Commit 3405f78754703948475b4677d03fcdbfb099b6a4

Vicent Martí 2013-05-06T06:51:21

Merge pull request #1547 from ethomson/win32_stat p_stat() should follow symlinks on windows

diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c
index a817d42..52eb463 100644
--- a/src/win32/posix_w32.c
+++ b/src/win32/posix_w32.c
@@ -295,7 +295,18 @@ int p_getcwd(char *buffer_out, size_t size)
 
 int p_stat(const char* path, struct stat* buf)
 {
-	return do_lstat(path, buf, 0);
+	char target[GIT_WIN_PATH];
+	int error = 0;
+
+	error = do_lstat(path, buf, 0);
+
+	/* We need not do this in a loop to unwind chains of symlinks since
+	 * p_readlink calls GetFinalPathNameByHandle which does it for us. */
+	if (error >= 0 && S_ISLNK(buf->st_mode) &&
+		(error = p_readlink(path, target, GIT_WIN_PATH)) >= 0)
+		error = do_lstat(target, buf, 0);
+
+	return error;
 }
 
 int p_chdir(const char* path)