Commit 1e3a639d4af0e8acdf710b74ee7b230c39df84ae

Edward Thomson 2019-05-12T21:54:39

Merge pull request #5065 from danielgindi/feature/win32_symlink_dir Support symlinks for directories in win32

diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c
index fcaf77e..05ac79a 100644
--- a/src/win32/posix_w32.c
+++ b/src/win32/posix_w32.c
@@ -397,13 +397,18 @@ int p_readlink(const char *path, char *buf, size_t bufsiz)
 int p_symlink(const char *target, const char *path)
 {
 	git_win32_path target_w, path_w;
+	DWORD dwFlags;
 
 	if (git_win32_path_from_utf8(path_w, path) < 0 ||
 		git__utf8_to_16(target_w, MAX_PATH, target) < 0)
 		return -1;
 
-	if (!CreateSymbolicLinkW(path_w, target_w,
-	    SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE))
+	dwFlags = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE;
+
+	if (GetFileAttributesW(target_w) & FILE_ATTRIBUTE_DIRECTORY)
+		dwFlags |= SYMBOLIC_LINK_FLAG_DIRECTORY;
+
+	if (!CreateSymbolicLinkW(path_w, target_w, dwFlags))
 		return -1;
 
 	return 0;