aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2018-02-02 07:45:22 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-02 07:47:16 -0800
commit8b5a64b87f13cf613f9e72d7710294304c091ff1 (patch)
tree4fb5ed505a36d5e228f3ff61de9854a9dd141a0e /src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java
parent757fe08b455d8b88fd89505a506c7303988cc639 (diff)
Fix error handling in skyframe target pattern parsing
Bazel completely swallowed errors in some cases, e.g., if the pattern is invalid like bazel build foo//bar:baz. Note that it previously silently ignored empty targets if --experimental_skyframe_target_pattern_evaluator was passed, and now fails (which is consistent with legacy behavior). This is an intentional change, but may break users who are using the experimental flag and are passing empty strings to Bazel. PiperOrigin-RevId: 184282856
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java
new file mode 100644
index 0000000000..cf21520c85
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java
@@ -0,0 +1,61 @@
+// Copyright 2015 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.skyframe;
+
+import com.google.devtools.build.lib.cmdline.TargetParsingException;
+import com.google.devtools.build.skyframe.LegacySkyKey;
+import com.google.devtools.build.skyframe.SkyFunction;
+import com.google.devtools.build.skyframe.SkyFunctionException;
+import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.SkyValue;
+import javax.annotation.Nullable;
+
+/**
+ * SkyFunction that throws a {@link TargetParsingException} for target pattern that could not be
+ * parsed. Must only be requested when a SkyFunction wishes to ignore the errors
+ * in a target pattern in keep_going mode, but to shut down the build in nokeep_going mode.
+ *
+ * <p>This SkyFunction never returns a value, only throws a {@link TargetParsingException}, and
+ * should never return null, since all of its dependencies should already be present.
+ */
+public class TargetPatternErrorFunction implements SkyFunction {
+ // We pass in the error message, which isn't ideal. We could consider reparsing the original
+ // pattern instead, but that requires more information.
+ public static SkyKey key(String errorMessage) {
+ return LegacySkyKey.create(SkyFunctions.TARGET_PATTERN_ERROR, errorMessage);
+ }
+
+ @Nullable
+ @Override
+ public SkyValue compute(SkyKey skyKey, Environment env)
+ throws TargetErrorFunctionException, InterruptedException {
+ String errorMessage = (String) skyKey.argument();
+ throw new TargetErrorFunctionException(
+ new TargetParsingException(errorMessage), Transience.PERSISTENT);
+ }
+
+ @Nullable
+ @Override
+ public String extractTag(SkyKey skyKey) {
+ return null;
+ }
+
+ private static class TargetErrorFunctionException extends SkyFunctionException {
+ public TargetErrorFunctionException(
+ TargetParsingException cause, Transience transience) {
+ super(cause, transience);
+ }
+ }
+}