diff options
author | juliexxia <juliexxia@google.com> | 2018-04-05 09:54:22 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-04-05 09:55:33 -0700 |
commit | 08dda865f6be27cb85f271e8c9343e2135bc412e (patch) | |
tree | e94b11d24dde707bf2e094fdc10d5e90f2afc305 /src/main/java/com/google/devtools/build/lib/query2 | |
parent | e1ed9e9e567334fdf7c26cd0db6f20c64840f119 (diff) |
Error out gracefully instead of crashing blaze when --output=transitions is used without the --transitions flag
PiperOrigin-RevId: 191755762
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/query2')
4 files changed, 32 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java index 0f11262099..4014f825a1 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet; import com.google.devtools.build.lib.concurrent.MultisetSemaphore; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.packages.DependencyFilter; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.Rule; @@ -207,14 +208,17 @@ public class ConfiguredTargetQueryEnvironment public ImmutableList<CqueryThreadsafeCallback> getDefaultOutputFormatters( TargetAccessor<ConfiguredTarget> accessor, CqueryOptions options, - OutputStream out, + Reporter reporter, SkyframeExecutor skyframeExecutor, BuildConfiguration hostConfiguration) { + OutputStream out = reporter.getOutErr().getOutputStream(); return new ImmutableList.Builder<CqueryThreadsafeCallback>() - .add(new LabelAndConfigurationOutputFormatterCallback(options, out, skyframeExecutor)) + .add( + new LabelAndConfigurationOutputFormatterCallback( + reporter, options, out, skyframeExecutor)) .add( new TransitionsOutputFormatterCallback( - options, out, skyframeExecutor, accessor, hostConfiguration)) + reporter, options, out, skyframeExecutor, accessor, hostConfiguration)) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java b/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java index b84bfb3b28..2a5a2dc060 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java @@ -18,6 +18,7 @@ import static java.util.stream.Collectors.joining; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Streams; import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback; import com.google.devtools.build.lib.query2.output.CqueryOptions; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; @@ -34,6 +35,7 @@ import java.util.List; public abstract class CqueryThreadsafeCallback extends ThreadSafeOutputFormatterCallback<ConfiguredTarget> { + protected final Reporter reporter; protected final CqueryOptions options; protected PrintStream printStream = null; protected final SkyframeExecutor skyframeExecutor; @@ -41,7 +43,11 @@ public abstract class CqueryThreadsafeCallback private final List<String> result = new ArrayList<>(); CqueryThreadsafeCallback( - CqueryOptions options, OutputStream out, SkyframeExecutor skyframeExecutor) { + Reporter reporter, + CqueryOptions options, + OutputStream out, + SkyframeExecutor skyframeExecutor) { + this.reporter = reporter; this.options = options; if (out != null) { this.printStream = new PrintStream(out); diff --git a/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java index cba2cb8b3e..ccc7b91fe7 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.query2; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.events.NullEventHandler; +import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.query2.output.CqueryOptions; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; import java.io.OutputStream; @@ -24,8 +25,11 @@ import java.io.OutputStream; public class LabelAndConfigurationOutputFormatterCallback extends CqueryThreadsafeCallback { LabelAndConfigurationOutputFormatterCallback( - CqueryOptions options, OutputStream out, SkyframeExecutor skyframeExecutor) { - super(options, out, skyframeExecutor); + Reporter reporter, + CqueryOptions options, + OutputStream out, + SkyframeExecutor skyframeExecutor) { + super(reporter, options, out, skyframeExecutor); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java index 5d5e8e628f..06e1069fb5 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java @@ -41,7 +41,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; -import com.google.devtools.build.lib.events.NullEventHandler; +import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper; @@ -83,12 +83,13 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback * @param hostConfiguration host configuration for this query. */ TransitionsOutputFormatterCallback( + Reporter reporter, CqueryOptions options, OutputStream out, SkyframeExecutor skyframeExecutor, TargetAccessor<ConfiguredTarget> accessor, BuildConfiguration hostConfiguration) { - super(options, out, skyframeExecutor); + super(reporter, options, out, skyframeExecutor); this.accessor = (ConfiguredTargetAccessor) accessor; this.hostConfiguration = hostConfiguration; this.partialResultMap = Maps.newHashMap(); @@ -98,17 +99,20 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback public void processOutput(Iterable<ConfiguredTarget> partialResult) throws IOException, InterruptedException { CqueryOptions.Transitions verbosity = options.transitions; - Preconditions.checkArgument( - !verbosity.equals(CqueryOptions.Transitions.NONE), - "Instead of using --output=transitions, set the --transition flag explicitly to 'lite' or" - + "'full'"); + if (verbosity.equals(CqueryOptions.Transitions.NONE)) { + reporter.handle( + Event.error( + "Instead of using --output=transitions, set the --transition flag" + + " explicitly to 'lite' or 'full'")); + return; + } partialResult.forEach( ct -> partialResultMap.put(ct.getLabel(), accessor.getTargetFromConfiguredTarget(ct))); for (ConfiguredTarget configuredTarget : partialResult) { Target target = partialResultMap.get(configuredTarget.getLabel()); BuildConfiguration config = skyframeExecutor.getConfiguration( - NullEventHandler.INSTANCE, configuredTarget.getConfigurationKey()); + reporter, configuredTarget.getConfigurationKey()); addResult( getRuleClassTransition(configuredTarget, target) + configuredTarget.getLabel() @@ -128,7 +132,7 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback // Also, we don't actually use fromOptions in our implementation of DependencyResolver but // passing to avoid passing a null and since we have the information anyway. deps = - new FormatterDependencyResolver(configuredTarget, NullEventHandler.INSTANCE) + new FormatterDependencyResolver(configuredTarget, reporter) .dependentNodeMap( new TargetAndConfiguration(target, config), hostConfiguration, |