aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java22
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());
}
}