Add the option to match by regexp in RecursiveFilesystemTraversal.

--
MOS_MIGRATED_REVID=91642690
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 f72792f..42b73b5 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.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
+import java.util.regex.Pattern;
+
 import javax.annotation.Nullable;
 
 /**
@@ -132,22 +134,27 @@
      */
     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 @@
       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());
     }
   }