aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar juliexxia <juliexxia@google.com>2018-04-11 10:34:00 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-11 10:37:03 -0700
commit5f135e8355b20a28a561c58f5631811fbf467248 (patch)
treeb3c1111f1b9f2e9a8730f86518e3b9e7c7d4e43e /src/main/java/com/google
parentd0de24bb0f5b4d31f05411040d9be482607e7ada (diff)
Create a new proto output formatter for cquery. Also add flag --[no]proto:include_configurations which when used, makes cquery proto output appear exactly like query proto output so tools that are already using this can seamlessly transition.
PiperOrigin-RevId: 192470626
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/ProtoOutputFormatterCallback.java103
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java10
8 files changed, 138 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java
index 52f3752781..6883e7982e 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java
@@ -133,7 +133,8 @@ public class CqueryBuildTool extends BuildTool {
cqueryOptions,
env.getReporter(),
env.getSkyframeExecutor(),
- hostConfiguration);
+ hostConfiguration,
+ cqueryOptions.aspectDeps.createResolver(env.getPackageManager(), env.getReporter()));
CqueryThreadsafeCallback callback =
CqueryThreadsafeCallback.getCallback(cqueryOptions.outputFormat, callbacks);
if (callback == null) {
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 196a23d5c9..cb0dc139d8 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -36,6 +36,8 @@ java_library(
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
+ "//src/main/protobuf:analysis_java_proto",
+ "//src/main/protobuf:build_java_proto",
"//third_party:guava",
"//third_party:jsr305",
],
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 4014f825a1..bae38019ac 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
@@ -52,6 +52,7 @@ import com.google.devtools.build.lib.query2.engine.QueryUtil.ThreadSafeMutableKe
import com.google.devtools.build.lib.query2.engine.QueryUtil.UniquifierImpl;
import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback;
import com.google.devtools.build.lib.query2.engine.Uniquifier;
+import com.google.devtools.build.lib.query2.output.AspectResolver;
import com.google.devtools.build.lib.query2.output.CqueryOptions;
import com.google.devtools.build.lib.query2.output.QueryOptions;
import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
@@ -210,15 +211,19 @@ public class ConfiguredTargetQueryEnvironment
CqueryOptions options,
Reporter reporter,
SkyframeExecutor skyframeExecutor,
- BuildConfiguration hostConfiguration) {
+ BuildConfiguration hostConfiguration,
+ AspectResolver resolver) {
OutputStream out = reporter.getOutErr().getOutputStream();
return new ImmutableList.Builder<CqueryThreadsafeCallback>()
.add(
new LabelAndConfigurationOutputFormatterCallback(
- reporter, options, out, skyframeExecutor))
+ reporter, options, out, skyframeExecutor, accessor))
.add(
new TransitionsOutputFormatterCallback(
reporter, options, out, skyframeExecutor, accessor, hostConfiguration))
+ .add(
+ new ProtoOutputFormatterCallback(
+ reporter, options, out, skyframeExecutor, accessor, resolver))
.build();
}
@@ -660,3 +665,4 @@ public class ConfiguredTargetQueryEnvironment
return parser.getOptions(QueryOptions.class);
}
}
+
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 2a5a2dc060..1466433c9a 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
@@ -19,6 +19,7 @@ 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.QueryEnvironment.TargetAccessor;
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;
@@ -39,6 +40,7 @@ public abstract class CqueryThreadsafeCallback
protected final CqueryOptions options;
protected PrintStream printStream = null;
protected final SkyframeExecutor skyframeExecutor;
+ protected final ConfiguredTargetAccessor accessor;
private final List<String> result = new ArrayList<>();
@@ -46,13 +48,15 @@ public abstract class CqueryThreadsafeCallback
Reporter reporter,
CqueryOptions options,
OutputStream out,
- SkyframeExecutor skyframeExecutor) {
+ SkyframeExecutor skyframeExecutor,
+ TargetAccessor<ConfiguredTarget> accessor) {
this.reporter = reporter;
this.options = options;
if (out != null) {
this.printStream = new PrintStream(out);
}
this.skyframeExecutor = skyframeExecutor;
+ this.accessor = (ConfiguredTargetAccessor) accessor;
}
public abstract String getName();
@@ -87,3 +91,4 @@ public abstract class CqueryThreadsafeCallback
}
}
}
+
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 ccc7b91fe7..e8446db22b 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
@@ -17,6 +17,7 @@ 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.engine.QueryEnvironment.TargetAccessor;
import com.google.devtools.build.lib.query2.output.CqueryOptions;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import java.io.OutputStream;
@@ -28,8 +29,9 @@ public class LabelAndConfigurationOutputFormatterCallback extends CqueryThreadsa
Reporter reporter,
CqueryOptions options,
OutputStream out,
- SkyframeExecutor skyframeExecutor) {
- super(reporter, options, out, skyframeExecutor);
+ SkyframeExecutor skyframeExecutor,
+ TargetAccessor<ConfiguredTarget> accessor) {
+ super(reporter, options, out, skyframeExecutor, accessor);
}
@Override
@@ -52,4 +54,4 @@ public class LabelAndConfigurationOutputFormatterCallback extends CqueryThreadsa
addResult(output.toString());
}
}
-}
+} \ No newline at end of file
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ProtoOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/ProtoOutputFormatterCallback.java
new file mode 100644
index 0000000000..ff405e4bb6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/query2/ProtoOutputFormatterCallback.java
@@ -0,0 +1,103 @@
+// 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 com.google.common.annotations.VisibleForTesting;
+import com.google.devtools.build.lib.analysis.AnalysisProtos;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+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.AspectResolver;
+import com.google.devtools.build.lib.query2.output.CqueryOptions;
+import com.google.devtools.build.lib.query2.output.ProtoOutputFormatter;
+import com.google.devtools.build.lib.query2.proto.proto2api.Build;
+import com.google.devtools.build.lib.query2.proto.proto2api.Build.QueryResult.Builder;
+import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/** Proto output formatter for cquery results. */
+public class ProtoOutputFormatterCallback extends CqueryThreadsafeCallback {
+
+ private final AspectResolver resolver;
+
+ private AnalysisProtos.CqueryResult.Builder protoResult;
+
+ ProtoOutputFormatterCallback(
+ Reporter reporter,
+ CqueryOptions options,
+ OutputStream out,
+ SkyframeExecutor skyframeExecutor,
+ TargetAccessor<ConfiguredTarget> accessor,
+ AspectResolver resolver) {
+ super(reporter, options, out, skyframeExecutor, accessor);
+ this.resolver = resolver;
+ }
+
+ @Override
+ public void start() {
+ protoResult = AnalysisProtos.CqueryResult.newBuilder();
+ }
+
+ @Override
+ public void close(boolean failFast) throws IOException {
+ if (!failFast && printStream != null) {
+ if (options.protoIncludeConfigurations) {
+ protoResult.build().writeTo(printStream);
+ } else {
+ // Documentation promises that setting this flag to false means we convert directly
+ // to the build.proto format. This is hard to test in integration testing due to the way
+ // proto output is turned readable (codex). So change the following code with caution.
+ Builder queryResult = Build.QueryResult.newBuilder();
+ protoResult.getResultsList().forEach(ct -> queryResult.addTarget(ct.getTarget()));
+ queryResult.build().writeTo(printStream);
+ }
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "proto";
+ }
+
+ @VisibleForTesting
+ public AnalysisProtos.CqueryResult getProtoResult() {
+ return protoResult.build();
+ }
+
+ @Override
+ public void processOutput(Iterable<ConfiguredTarget> partialResult) throws InterruptedException {
+ ProtoOutputFormatter formatter = new ProtoOutputFormatter();
+ formatter.setOptions(options, resolver);
+ for (ConfiguredTarget configuredTarget : partialResult) {
+ AnalysisProtos.ConfiguredTarget.Builder builder =
+ AnalysisProtos.ConfiguredTarget.newBuilder();
+
+ // Re: testing. Since this formatter relies on the heavily tested ProtoOutputFormatter class
+ // for all its work with targets, ProtoOuputFormatterCallbackTest doesn't test any of the
+ // logic in this next line. If this were to change (i.e. we manipulate targets any further),
+ // we will want to add relevant tests.
+ builder.setTarget(
+ formatter.toTargetProtoBuffer(accessor.getTargetFromConfiguredTarget(configuredTarget)));
+
+ if (options.protoIncludeConfigurations) {
+ String checksum = configuredTarget.getConfigurationChecksum();
+ builder.setConfiguration(
+ AnalysisProtos.Configuration.newBuilder().setChecksum(String.valueOf(checksum)));
+ }
+
+ protoResult.addResults(builder.build());
+ }
+ }
+}
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 06e1069fb5..92922d5d0a 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
@@ -68,7 +68,6 @@ import java.util.stream.Collectors;
*/
public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback {
- protected final ConfiguredTargetAccessor accessor;
protected final BuildConfiguration hostConfiguration;
private final HashMap<Label, Target> partialResultMap;
@@ -89,8 +88,7 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback
SkyframeExecutor skyframeExecutor,
TargetAccessor<ConfiguredTarget> accessor,
BuildConfiguration hostConfiguration) {
- super(reporter, options, out, skyframeExecutor);
- this.accessor = (ConfiguredTargetAccessor) accessor;
+ super(reporter, options, out, skyframeExecutor, accessor);
this.hostConfiguration = hostConfiguration;
this.partialResultMap = Maps.newHashMap();
}
@@ -280,3 +278,4 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback
}
}
}
+
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java b/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java
index 9d9cb0d099..860e3ca9ae 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java
@@ -46,4 +46,14 @@ public class CqueryOptions extends CommonQueryOptions {
)
public Transitions transitions;
+ @Option(
+ name = "proto:include_configurations",
+ defaultValue = "true",
+ documentationCategory = OptionDocumentationCategory.QUERY,
+ effectTags = {OptionEffectTag.AFFECTS_OUTPUTS},
+ help =
+ "if enabled, proto output will include information about configurations. When disabled,"
+ + "cquery proto output format resembles query output format"
+ )
+ public boolean protoIncludeConfigurations;
}