aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/query2
diff options
context:
space:
mode:
authorGravatar twerth <twerth@google.com>2018-08-02 07:30:30 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-08-02 07:31:54 -0700
commitf621bbe84e8c2bff47d8d060f28be2a8b5bae834 (patch)
tree280e9ae5b9b73c17c4269a76ba330fb253c2e030 /src/main/java/com/google/devtools/build/lib/query2
parentf32aa9a7de90a268a468c60500c8bb178fd3ce9f (diff)
Add text output to aquery.
RELNOTES[NEW]: The aquery command now supports --output=text. PiperOrigin-RevId: 207096607
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/query2')
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java155
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/BUILD2
3 files changed, 159 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java
index e3dd353a0b..47509b5f2e 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java
@@ -140,6 +140,8 @@ public class ActionGraphQueryEnvironment
OutputStream out = reporter.getOutErr().getOutputStream();
return ImmutableList.of(
new ActionGraphProtoOutputFormatterCallback(
+ reporter, aqueryOptions, out, skyframeExecutor, accessor),
+ new ActionGraphTextOutputFormatterCallback(
reporter, aqueryOptions, out, skyframeExecutor, accessor));
}
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
new file mode 100644
index 0000000000..23be8bd10a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
@@ -0,0 +1,155 @@
+// Copyright 2018 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.query2;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Streams;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.ActionExecutionMetadata;
+import com.google.devtools.build.lib.actions.ActionKeyContext;
+import com.google.devtools.build.lib.actions.ActionOwner;
+import com.google.devtools.build.lib.actions.CommandLineExpansionException;
+import com.google.devtools.build.lib.analysis.actions.SpawnAction;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.events.Reporter;
+import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor;
+import com.google.devtools.build.lib.query2.output.AqueryOptions;
+import com.google.devtools.build.lib.skyframe.ConfiguredTargetValue;
+import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
+import com.google.devtools.build.lib.util.CommandDescriptionForm;
+import com.google.devtools.build.lib.util.CommandFailureUtils;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** Output callback for aquery, prints human readable output. */
+public class ActionGraphTextOutputFormatterCallback extends AqueryThreadsafeCallback {
+
+ private final ActionKeyContext actionKeyContext = new ActionKeyContext();
+
+ ActionGraphTextOutputFormatterCallback(
+ Reporter reporter,
+ AqueryOptions options,
+ OutputStream out,
+ SkyframeExecutor skyframeExecutor,
+ TargetAccessor<ConfiguredTargetValue> accessor) {
+ super(reporter, options, out, skyframeExecutor, accessor);
+ }
+
+ @Override
+ public String getName() {
+ return "text";
+ }
+
+ @Override
+ public void processOutput(Iterable<ConfiguredTargetValue> partialResult)
+ throws IOException, InterruptedException {
+ try {
+ for (ConfiguredTargetValue configuredTargetValue : partialResult) {
+ List<ActionAnalysisMetadata> actions = configuredTargetValue.getActions();
+ for (ActionAnalysisMetadata action : actions) {
+ writeAction(action, printStream);
+ }
+ }
+ } catch (CommandLineExpansionException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ private void writeAction(ActionAnalysisMetadata action, PrintStream printStream)
+ throws IOException, CommandLineExpansionException {
+ ActionOwner actionOwner = action.getOwner();
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder
+ .append(action.prettyPrint())
+ .append('\n')
+ .append(" Mnemonic: ")
+ .append(action.getMnemonic())
+ .append('\n');
+
+ if (actionOwner != null) {
+ BuildEvent configuration = actionOwner.getConfiguration();
+ BuildEventStreamProtos.Configuration configProto =
+ configuration.asStreamProto(/*context=*/ null).getConfiguration();
+ stringBuilder
+ .append(" Owner: ")
+ .append(actionOwner.getLabel().toString())
+ .append('\n')
+ .append(" Configuration: ")
+ .append(configProto.getMnemonic())
+ .append('\n');
+ }
+
+ if (action instanceof ActionExecutionMetadata) {
+ ActionExecutionMetadata actionExecutionMetadata = (ActionExecutionMetadata) action;
+ stringBuilder
+ .append(" ActionKey: ")
+ .append(actionExecutionMetadata.getKey(actionKeyContext))
+ .append('\n');
+ }
+
+ stringBuilder
+ .append(" Inputs: [")
+ .append(
+ Streams.stream(action.getInputs())
+ .map(input -> input.getExecPathString())
+ .sorted()
+ .collect(Collectors.joining(", ")))
+ .append("]\n")
+ .append(" Outputs: [")
+ .append(
+ Streams.stream(action.getOutputs())
+ .map(input -> input.getExecPathString())
+ .sorted()
+ .collect(Collectors.joining(", ")))
+ .append("]\n");
+
+ if (action instanceof SpawnAction) {
+ SpawnAction spawnAction = (SpawnAction) action;
+ // TODO(twerth): This handles the fixed environment. We probably want to output the inherited
+ // environment as well.
+ ImmutableMap<String, String> fixedEnvironment = spawnAction.getEnvironment().getFixedEnv();
+ stringBuilder
+ .append(" Environment: [")
+ .append(
+ Streams.stream(fixedEnvironment.entrySet())
+ .map(
+ environmentVariable ->
+ environmentVariable.getKey() + "=" + environmentVariable.getValue())
+ .sorted()
+ .collect(Collectors.joining(", ")))
+ .append("]\n")
+
+ // TODO(twerth): Add option to only optionally include the command line.
+ .append(" Command Line: ")
+ .append(
+ CommandFailureUtils.describeCommand(
+ CommandDescriptionForm.COMPLETE,
+ /* prettyPrintArgs= */ true,
+ spawnAction.getArguments(),
+ /* environment= */ null,
+ /* cwd= */ null))
+ .append("\n");
+ }
+
+ stringBuilder.append('\n');
+
+ printStream.write(stringBuilder.toString().getBytes(UTF_8));
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD
index b3ded139a2..3ccf9fb5bd 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -27,6 +27,8 @@ java_library(
"//src/main/java/com/google/devtools/build/lib:packages-internal",
"//src/main/java/com/google/devtools/build/lib:util",
"//src/main/java/com/google/devtools/build/lib/actions",
+ "//src/main/java/com/google/devtools/build/lib/buildeventstream",
+ "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
"//src/main/java/com/google/devtools/build/lib/causes",
"//src/main/java/com/google/devtools/build/lib/collect/compacthashset",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",