aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystemWithCustomStat.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/UnixFileSystem.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystem.java2
14 files changed, 50 insertions, 39 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
index 936c4b9fa4..eb8af1801f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
@@ -171,7 +171,7 @@ public final class BinTools {
}
private void linkTool(Path sourcePath, Path linkPath) throws ExecException {
- if (linkPath.getFileSystem().supportsSymbolicLinks()) {
+ if (linkPath.getFileSystem().supportsSymbolicLinksNatively()) {
try {
if (!linkPath.isSymbolicLink()) {
// ensureSymbolicLink() does not handle the case where there is already
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
index 02252f488a..5261bd7a79 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
@@ -85,7 +85,7 @@ public class AndroidNdkRepositoryFunction extends RepositoryFunction {
}
if (!symlinkLocalRepositoryContents(
- ndkSymlinkTreeDirectory, getOutputBase().getFileSystem().getPath(pathFragment), env)) {
+ ndkSymlinkTreeDirectory, getOutputBase().getFileSystem().getPath(pathFragment))) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
index 71996c8c18..1e2a4dd360 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
@@ -44,9 +44,7 @@ public class AndroidSdkRepositoryFunction extends RepositoryFunction {
PathFragment pathFragment = getTargetPath(rule, getWorkspace());
if (!symlinkLocalRepositoryContents(
- outputDirectory,
- getOutputBase().getFileSystem().getPath(pathFragment),
- env)) {
+ outputDirectory, getOutputBase().getFileSystem().getPath(pathFragment))) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index b4dd117718..295dc0596a 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -351,16 +351,14 @@ public class ExecutionTool {
startLocalOutputBuild(); // TODO(bazel-team): this could be just another OutputService
}
- if (getWorkspace().getFileSystem().supportsSymbolicLinks()) {
- List<BuildConfiguration> targetConfigurations = configurations.getTargetConfigurations();
- BuildConfiguration targetConfiguration = targetConfigurations.size() == 1
- ? targetConfigurations.get(0) : null;
- if (targetConfigurations.size() == 1) {
- OutputDirectoryLinksUtils.createOutputDirectoryLinks(
- runtime.getWorkspaceName(), getWorkspace(), getExecRoot(),
- runtime.getOutputPath(), getReporter(), targetConfiguration,
- request.getBuildOptions().getSymlinkPrefix());
- }
+ List<BuildConfiguration> targetConfigurations = configurations.getTargetConfigurations();
+ BuildConfiguration targetConfiguration = targetConfigurations.size() == 1
+ ? targetConfigurations.get(0) : null;
+ if (targetConfigurations.size() == 1) {
+ OutputDirectoryLinksUtils.createOutputDirectoryLinks(
+ runtime.getWorkspaceName(), getWorkspace(), getExecRoot(),
+ runtime.getOutputPath(), getReporter(), targetConfiguration,
+ request.getBuildOptions().getSymlinkPrefix());
}
ActionCache actionCache = getActionCache();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
index 7bb54e1c1a..400783e1b4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
@@ -20,6 +20,8 @@ import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.skyframe.FileValue;
import com.google.devtools.build.lib.skyframe.RepositoryValue;
import com.google.devtools.build.lib.syntax.Type;
+import com.google.devtools.build.lib.vfs.FileSystem;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyFunction.Environment;
@@ -44,7 +46,14 @@ public class LocalRepositoryFunction extends RepositoryFunction {
AggregatingAttributeMapper mapper = AggregatingAttributeMapper.of(rule);
PathFragment pathFragment = new PathFragment(mapper.get("path", Type.STRING));
try {
- outputDirectory.createSymbolicLink(pathFragment);
+ FileSystem fs = outputDirectory.getFileSystem();
+ if (fs.supportsSymbolicLinksNatively()) {
+ outputDirectory.createSymbolicLink(pathFragment);
+ } else {
+ FileSystemUtils.createDirectoryAndParents(outputDirectory);
+ FileSystemUtils.copyTreesBelow(
+ fs.getPath(getTargetPath(rule, getWorkspace())), outputDirectory);
+ }
} catch (IOException e) {
throw new RepositoryFunctionException(
new IOException("Could not create symlink to repository " + pathFragment + ": "
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
index 3557a3bc76..27bdc9a1c4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
@@ -44,9 +44,7 @@ public class NewLocalRepositoryFunction extends RepositoryFunction {
// Link x/y/z to /some/path/to/y/z.
if (!symlinkLocalRepositoryContents(
- outputDirectory,
- getOutputBase().getFileSystem().getPath(pathFragment),
- env)) {
+ outputDirectory, getOutputBase().getFileSystem().getPath(pathFragment))) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
index 6979a42598..f5fdd79e5e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
@@ -37,6 +37,7 @@ import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.build.lib.util.Preconditions;
+import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -336,13 +337,19 @@ public abstract class RepositoryFunction {
* </pre>
*/
public static boolean symlinkLocalRepositoryContents(
- Path repositoryDirectory, Path targetDirectory, Environment env)
+ Path repositoryDirectory, Path targetDirectory)
throws RepositoryFunctionException {
try {
- for (Path target : targetDirectory.getDirectoryEntries()) {
- Path symlinkPath =
- repositoryDirectory.getRelative(target.getBaseName());
- createSymbolicLink(symlinkPath, target);
+ FileSystemUtils.createDirectoryAndParents(repositoryDirectory);
+ FileSystem fs = repositoryDirectory.getFileSystem();
+ if (repositoryDirectory.getFileSystem().supportsSymbolicLinksNatively()) {
+ for (Path target : targetDirectory.getDirectoryEntries()) {
+ Path symlinkPath =
+ repositoryDirectory.getRelative(target.getBaseName());
+ createSymbolicLink(symlinkPath, target);
+ }
+ } else {
+ FileSystemUtils.copyTreesBelow(targetDirectory, repositoryDirectory);
}
} catch (IOException e) {
throw new RepositoryFunctionException(e, Transience.TRANSIENT);
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
index 55d49ed89c..9cee3c98b2 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
@@ -122,10 +122,11 @@ public abstract class FileSystem {
* <li>{@link #readSymbolicLink(Path)} where the link points to a non-existent file</li>
* </ul>
*
- * The above calls will result in an {@link UnsupportedOperationException} on
- * a FileSystem where this method returns {@code false}.
+ * The above calls may result in an {@link UnsupportedOperationException} on
+ * a FileSystem where this method returns {@code false}. The implementation can try to emulate
+ * these calls at its own discretion.
*/
- public abstract boolean supportsSymbolicLinks();
+ public abstract boolean supportsSymbolicLinksNatively();
/**
* Returns the type of the file system path belongs to.
@@ -176,7 +177,7 @@ public abstract class FileSystem {
* Returns the size in bytes of the file denoted by {@code path}. See
* {@link Path#getFileSize(Symlinks)} for specification.
*
- * <p>Note: for <@link FileSystem>s where {@link #supportsSymbolicLinks()}
+ * <p>Note: for <@link FileSystem>s where {@link #supportsSymbolicLinksNatively()}
* returns false, this method will throw an
* {@link UnsupportedOperationException} if {@code followSymLinks=false}.
*/
@@ -192,7 +193,7 @@ public abstract class FileSystem {
* Returns the last modification time of the file denoted by {@code path}.
* See {@link Path#getLastModifiedTime(Symlinks)} for specification.
*
- * Note: for {@link FileSystem}s where {@link #supportsSymbolicLinks()} returns
+ * Note: for {@link FileSystem}s where {@link #supportsSymbolicLinksNatively()} returns
* false, this method will throw an {@link UnsupportedOperationException} if
* {@code followSymLinks=false}.
*/
@@ -471,7 +472,7 @@ public abstract class FileSystem {
* Creates a symbolic link. See {@link Path#createSymbolicLink(Path)} for
* specification.
*
- * <p>Note: for {@link FileSystem}s where {@link #supportsSymbolicLinks()}
+ * <p>Note: for {@link FileSystem}s where {@link #supportsSymbolicLinksNatively()}
* returns false, this method will throw an
* {@link UnsupportedOperationException}
*/
@@ -482,7 +483,7 @@ public abstract class FileSystem {
* Returns the target of a symbolic link. See {@link Path#readSymbolicLink}
* for specification.
*
- * <p>Note: for {@link FileSystem}s where {@link #supportsSymbolicLinks()}
+ * <p>Note: for {@link FileSystem}s where {@link #supportsSymbolicLinksNatively()}
* returns false, this method will throw an
* {@link UnsupportedOperationException} if the link points to a non-existent
* file.
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java
index d4e69582e7..b03ceccbd3 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java
@@ -172,7 +172,7 @@ public class JavaIoFileSystem extends AbstractFileSystemWithCustomStat {
}
@Override
- public boolean supportsSymbolicLinks() {
+ public boolean supportsSymbolicLinksNatively() {
return true;
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java
index e3cf56fe3a..ba696cb2c9 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java
@@ -71,7 +71,7 @@ public abstract class ReadonlyFileSystem extends AbstractFileSystem {
}
@Override
- public boolean supportsSymbolicLinks() {
+ public boolean supportsSymbolicLinksNatively() {
return false;
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystemWithCustomStat.java b/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystemWithCustomStat.java
index fa441250ce..2f169dd75d 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystemWithCustomStat.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystemWithCustomStat.java
@@ -56,7 +56,7 @@ public abstract class ReadonlyFileSystemWithCustomStat extends AbstractFileSyste
}
@Override
- public boolean supportsSymbolicLinks() {
+ public boolean supportsSymbolicLinksNatively() {
return false;
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java
index 28cf7df0a7..4f43ea7d87 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java
@@ -160,7 +160,7 @@ public class UnionFileSystem extends FileSystem {
}
@Override
- public boolean supportsSymbolicLinks() {
+ public boolean supportsSymbolicLinksNatively() {
return true;
}
@@ -256,7 +256,7 @@ public class UnionFileSystem extends FileSystem {
@Override
protected void createSymbolicLink(Path linkPath, PathFragment targetFragment) throws IOException {
checkModifiable();
- if (!supportsSymbolicLinks()) {
+ if (!supportsSymbolicLinksNatively()) {
throw new UnsupportedOperationException(
"Attempted to create a symlink, but symlink support is disabled.");
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/UnixFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/UnixFileSystem.java
index ee6af3fb39..bc27e2b72e 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/UnixFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/UnixFileSystem.java
@@ -347,8 +347,8 @@ public class UnixFileSystem extends AbstractFileSystemWithCustomStat {
}
@Override
- public boolean supportsSymbolicLinks() {
- return true;
+ public boolean supportsSymbolicLinksNatively() {
+ return symlinkStrategy != SymlinkStrategy.WINDOWS_COMPATIBLE;
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystem.java
index b4a98e5eb5..9ca5e8b5cc 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystem.java
@@ -650,7 +650,7 @@ public class InMemoryFileSystem extends ScopeEscapableFileSystem {
}
@Override
- public boolean supportsSymbolicLinks() {
+ public boolean supportsSymbolicLinksNatively() {
return true;
}