diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
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; } |