diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java index c7ff1c4eb2529b..2e908fc4a681b3 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java @@ -144,7 +144,6 @@ import java.util.concurrent.Phaser; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; -import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nullable; @@ -217,18 +216,25 @@ public RemoteExecutionService( this.scheduler = Schedulers.from(executor, /*interruptibleWorker=*/ true); - String regex = remoteOptions.remoteDownloadRegex; // TODO(bazel-team): Consider adding a warning or more validation if the remoteDownloadRegex is - // used without RemoteOutputsMode.MINIMAL. - this.shouldForceDownloads = - !regex.isEmpty() - && (remoteOptions.remoteOutputsMode == RemoteOutputsMode.MINIMAL - || remoteOptions.remoteOutputsMode == RemoteOutputsMode.TOPLEVEL); - Pattern pattern = Pattern.compile(regex); + // used without Build without the Bytes. + ImmutableList.Builder builder = ImmutableList.builder(); + if (remoteOptions.remoteOutputsMode == RemoteOutputsMode.MINIMAL + || remoteOptions.remoteOutputsMode == RemoteOutputsMode.TOPLEVEL) { + for (String regex : remoteOptions.remoteDownloadRegex) { + builder.add(Pattern.compile(regex)); + } + } + ImmutableList patterns = builder.build(); + this.shouldForceDownloads = !patterns.isEmpty(); this.shouldForceDownloadPredicate = path -> { - Matcher m = pattern.matcher(path); - return m.matches(); + for (Pattern pattern : patterns) { + if (pattern.matcher(path).find()) { + return true; + } + } + return false; }; } diff --git a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java index 2ff52777dabc92..bb66e67bbbdafe 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java +++ b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java @@ -589,15 +589,16 @@ public RemoteOutputsStrategyConverter() { @Option( name = "experimental_remote_download_regex", - defaultValue = "", + defaultValue = "null", + allowMultiple = true, documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, help = "Force Bazel to download the artifacts that match the given regexp. To be used in" - + " conjunction with --remote_download_minimal or --remote_download_toplevel to allow" + + " conjunction with Build without the Bytes (or the internal equivalent) to allow" + " the client to request certain artifacts that might be needed locally (e.g. IDE" + " support)") - public String remoteDownloadRegex; + public List remoteDownloadRegex; // The below options are not configurable by users, only tests. // This is part of the effort to reduce the overall number of flags.