diff options
Diffstat (limited to 'src')
3 files changed, 25 insertions, 9 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 67b3f40261..3845e32ce2 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 @@ -223,7 +223,7 @@ public final class FilesetEntryFunction implements SkyFunction { SkyKey depKey = RecursiveFilesystemTraversalValue.key( new RecursiveFilesystemTraversalValue.TraversalRequest(traversal.getRoot().asRootedPath(), traversal.isGenerated(), traversal.getPackageBoundaryMode(), traversal.isPackage(), - errorInfo)); + errorInfo, /*pattern=*/null)); RecursiveFilesystemTraversalValue v = (RecursiveFilesystemTraversalValue) env.getValue(depKey); if (env.valuesMissing()) { throw new MissingDepException(); 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 ab2faa2c5f..2627968ac2 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 @@ -122,8 +122,14 @@ public final class RecursiveFilesystemTraversalFunction implements SkyFunction { } if (rootInfo.type.isFile()) { - // The root is a file or a symlink to one. - return resultForFileRoot(traversal.path, rootInfo); + if (traversal.pattern == null + || traversal.pattern.matcher( + rootInfo.realPath.getRelativePath().getPathString()).matches()) { + // The root is a file or a symlink to one. + return resultForFileRoot(traversal.path, rootInfo); + } else { + return RecursiveFilesystemTraversalValue.EMPTY; + } } // Otherwise the root is a directory or a symlink to one. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java index f72792fd08..42b73b510b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java @@ -29,6 +29,8 @@ import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; +import java.util.regex.Pattern; + import javax.annotation.Nullable; /** @@ -132,22 +134,27 @@ public final class RecursiveFilesystemTraversalValue implements SkyValue { */ final boolean skipTestingForSubpackage; + /** A pattern that files must match to be included in this traversal (may be null.) */ + @Nullable + final Pattern pattern; + /** Information to be attached to any error messages that may be reported. */ @Nullable final String errorInfo; public TraversalRequest(RootedPath path, boolean isRootGenerated, PackageBoundaryMode crossPkgBoundaries, boolean skipTestingForSubpackage, - @Nullable String errorInfo) { + @Nullable String errorInfo, @Nullable Pattern pattern) { this.path = path; this.isGenerated = isRootGenerated; this.crossPkgBoundaries = crossPkgBoundaries; this.skipTestingForSubpackage = skipTestingForSubpackage; this.errorInfo = errorInfo; + this.pattern = pattern; } private TraversalRequest duplicate(RootedPath newRoot, boolean newSkipTestingForSubpackage) { return new TraversalRequest(newRoot, isGenerated, crossPkgBoundaries, - newSkipTestingForSubpackage, errorInfo); + newSkipTestingForSubpackage, errorInfo, pattern); } /** Creates a new request to traverse a child element in the current directory (the root). */ @@ -177,20 +184,23 @@ public final class RecursiveFilesystemTraversalValue implements SkyValue { TraversalRequest o = (TraversalRequest) obj; return path.equals(o.path) && isGenerated == o.isGenerated && crossPkgBoundaries == o.crossPkgBoundaries - && skipTestingForSubpackage == o.skipTestingForSubpackage; + && skipTestingForSubpackage == o.skipTestingForSubpackage + && Objects.equal(pattern, o.pattern); } @Override public int hashCode() { - return Objects.hashCode(path, isGenerated, crossPkgBoundaries, skipTestingForSubpackage); + return Objects.hashCode(path, isGenerated, crossPkgBoundaries, skipTestingForSubpackage, + pattern); } @Override public String toString() { return String.format( "TraversalParams(root=%s, is_generated=%d, skip_testing_for_subpkg=%d," - + " pkg_boundaries=%s)", path, isGenerated ? 1 : 0, skipTestingForSubpackage ? 1 : 0, - crossPkgBoundaries); + + " pkg_boundaries=%s, pattern=%s)", path, isGenerated ? 1 : 0, + skipTestingForSubpackage ? 1 : 0, crossPkgBoundaries, + pattern == null ? "null" : pattern.pattern()); } } |