diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java index 7edea00bc173ed..9c351785872e1a 100644 --- a/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java +++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java @@ -79,15 +79,15 @@ protected void createSymbolicLink(PathFragment linkPath, PathFragment targetFrag try { java.nio.file.Path link = getIoFile(linkPath).toPath(); java.nio.file.Path target = getIoFile(targetPath).toPath(); - // Still Create a dangling junction if the target doesn't exist. - if (!target.toFile().exists() || target.toFile().isDirectory()) { + if (target.toFile().isDirectory()) { + WindowsFileOperations.createJunction(link.toString(), target.toString()); + } else if (createSymbolicLinks) { + WindowsFileOperations.createSymlink(link.toString(), target.toString()); + } else if (!target.toFile().exists()) { + // Still Create a dangling junction if the target doesn't exist. WindowsFileOperations.createJunction(link.toString(), target.toString()); } else { - if (createSymbolicLinks) { - WindowsFileOperations.createSymlink(link.toString(), target.toString()); - } else { - Files.copy(target, link); - } + Files.copy(target, link); } } catch (java.nio.file.FileAlreadyExistsException e) { throw new IOException(linkPath + ERR_FILE_EXISTS, e); diff --git a/src/main/native/windows/file.cc b/src/main/native/windows/file.cc index f20831e09bcfff..70809bde048900 100644 --- a/src/main/native/windows/file.cc +++ b/src/main/native/windows/file.cc @@ -505,7 +505,8 @@ int CreateSymlink(const wstring& symlink_name, const wstring& symlink_target, const wstring target = AddUncPrefixMaybe(symlink_target); DWORD attrs = GetFileAttributesW(target.c_str()); - if (attrs & FILE_ATTRIBUTE_DIRECTORY) { + if ((attrs != INVALID_FILE_ATTRIBUTES) && + (attrs & FILE_ATTRIBUTE_DIRECTORY)) { // Instead of creating a symlink to a directory use a Junction. return CreateSymlinkResult::kTargetIsDirectory; }