diff options
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java | 35 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java | 4 |
2 files changed, 22 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java index f22718242c..d2e0132f3a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java @@ -75,7 +75,9 @@ public final class FilesetEntryFunction implements SkyFunction { } for (FilesetOutputSymlink s : nested.getSymlinks()) { - maybeStoreSymlink(s, t.getDestPath(), exclusions, outputSymlinks); + if (!exclusions.contains(s.name.getPathString())) { + maybeStoreSymlink(s, t.getDestPath(), outputSymlinks); + } } } else { // The "nested" traversal params are absent if and only if the "direct" traversal params are @@ -163,6 +165,15 @@ public final class FilesetEntryFunction implements SkyFunction { // Create one output symlink for each entry in the results. for (ResolvedFile f : results) { + // The linkName has to be under the traversal's root, which is also the prefix to remove. + PathFragment linkName = f.getNameInSymlinkTree().relativeTo(prefixToRemove); + + // Check whether the symlink is excluded before attempting to resolve it. + // It may be dangling, but excluding it is still fine. + if (exclusions.contains(linkName.getPathString())) { + continue; + } + PathFragment targetName; try { targetName = f.getTargetInSymlinkTree(direct.isFollowingSymlinks()); @@ -172,11 +183,7 @@ public final class FilesetEntryFunction implements SkyFunction { // Metadata field must be present. It can only be absent when stripped by tests. String metadata = Integer.toHexString(f.metadata.get().hashCode()); - - // The linkName has to be under the traversal's root, which is also the prefix to remove. - PathFragment linkName = f.getNameInSymlinkTree().relativeTo(prefixToRemove); - maybeStoreSymlink(linkName, targetName, metadata, t.getDestPath(), exclusions, - outputSymlinks); + maybeStoreSymlink(linkName, targetName, metadata, t.getDestPath(), outputSymlinks); } } @@ -185,20 +192,16 @@ public final class FilesetEntryFunction implements SkyFunction { /** Stores an output symlink unless it's excluded or would overwrite an existing one. */ private static void maybeStoreSymlink(FilesetOutputSymlink nestedLink, PathFragment destPath, - Set<String> exclusions, Map<PathFragment, FilesetOutputSymlink> result) { - maybeStoreSymlink(nestedLink.name, nestedLink.target, nestedLink.metadata, destPath, - exclusions, result); + Map<PathFragment, FilesetOutputSymlink> result) { + maybeStoreSymlink(nestedLink.name, nestedLink.target, nestedLink.metadata, destPath, result); } /** Stores an output symlink unless it's excluded or would overwrite an existing one. */ private static void maybeStoreSymlink(PathFragment linkName, PathFragment linkTarget, - String metadata, PathFragment destPath, Set<String> exclusions, - Map<PathFragment, FilesetOutputSymlink> result) { - if (!exclusions.contains(linkName.getPathString())) { - linkName = destPath.getRelative(linkName); - if (!result.containsKey(linkName)) { - result.put(linkName, new FilesetOutputSymlink(linkName, linkTarget, metadata)); - } + String metadata, PathFragment destPath, Map<PathFragment, FilesetOutputSymlink> result) { + linkName = destPath.getRelative(linkName); + if (!result.containsKey(linkName)) { + result.put(linkName, new FilesetOutputSymlink(linkName, linkTarget, metadata)); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java index 6181a11763..7684a5980c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java @@ -84,7 +84,9 @@ public final class RecursiveFilesystemTraversalFunction implements SkyFunction { public final String unresolvedLink; public DanglingSymlinkException(String path, String unresolvedLink) { - super("Found dangling symlink: " + path + ", unresolved path: "); + super( + String.format( + "Found dangling symlink: %s, unresolved path: \"%s\"", path, unresolvedLink)); Preconditions.checkArgument(path != null && !path.isEmpty()); Preconditions.checkArgument(unresolvedLink != null && !unresolvedLink.isEmpty()); this.path = path; |