Skip to content

Commit

Permalink
Add jsonproto option to query --output flag (#18438)
Browse files Browse the repository at this point in the history
Addresses #17627

Closes #18187.

PiperOrigin-RevId: 530859727
Change-Id: Ie12e6c783448def4b891055647cfe568f7b71b14

Co-authored-by: Chirag Ramani <[email protected]>
  • Loading branch information
iancha1992 and chiragramani authored May 19, 2023
1 parent 5756652 commit a5c0d85
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,6 @@ java_library(
"//third_party:guava",
"//third_party:jsr305",
"//third_party/protobuf:protobuf_java",
"//third_party/protobuf:protobuf_java_util",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright 2023 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.query.output;

import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.query2.engine.OutputFormatterCallback;
import com.google.protobuf.util.JsonFormat;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

/**
* An output formatter that outputs a protocol buffer json representation of a query result and
* outputs the json to the output print stream.
*/
public class JSONProtoOutputFormatter extends ProtoOutputFormatter {
@Override
public String getName() {
return "jsonproto";
}

private final JsonFormat.Printer jsonPrinter = JsonFormat.printer();

@Override
public OutputFormatterCallback<Target> createPostFactoStreamCallback(
final OutputStream out, final QueryOptions options, RepositoryMapping mainRepoMapping) {
return new OutputFormatterCallback<Target>() {
@Override
public void processOutput(Iterable<Target> partialResult)
throws IOException, InterruptedException {
for (Target target : partialResult) {
out.write(
jsonPrinter.print(toTargetProtoBuffer(target)).getBytes(StandardCharsets.UTF_8));
}
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public static ImmutableList<OutputFormatter> getDefaultFormatters() {
new PackageOutputFormatter(),
new LocationOutputFormatter(),
new GraphOutputFormatter(),
new JSONProtoOutputFormatter(),
new XmlOutputFormatter(),
new ProtoOutputFormatter(),
new StreamedProtoOutputFormatter());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ public OrderOutputConverter() {
documentationCategory = OptionDocumentationCategory.QUERY,
effectTags = {OptionEffectTag.TERMINAL_OUTPUT},
help =
"The format in which the query results should be printed. Allowed values for query are: "
+ "build, graph, label, label_kind, location, maxrank, minrank, package, proto, xml.")
"The format in which the query results should be printed. Allowed values for query are:"
+ " build, graph, jsonproto, label, label_kind, location, maxrank, minrank, package,"
+ " proto, xml.")
public String outputFormat;

@Option(
Expand Down
25 changes: 24 additions & 1 deletion src/test/shell/integration/bazel_query_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ genquery(name='q',
opts = ["--output=blargh"],)
EOF

local expected_error_msg="in genquery rule //starfruit:q: Invalid output format 'blargh'. Valid values are: label, label_kind, build, minrank, maxrank, package, location, graph, xml, proto"
local expected_error_msg="in genquery rule //starfruit:q: Invalid output format 'blargh'. Valid values are: label, label_kind, build, minrank, maxrank, package, location, graph, jsonproto, xml, proto"
bazel build //starfruit:q >& $TEST_log && fail "Expected failure"
expect_log "$expected_error_msg"
}
Expand Down Expand Up @@ -1064,4 +1064,27 @@ EOF
expect_log "//${package}:hint"
}

function test_basic_query_jsonproto() {
local pkg="${FUNCNAME[0]}"
mkdir -p "$pkg" || fail "mkdir -p $pkg"
cat > "$pkg/BUILD" <<'EOF'
genrule(
name = "bar",
srcs = ["dummy.txt"],
outs = ["bar_out.txt"],
cmd = "echo unused > $(OUTS)",
)
EOF
bazel query --output=jsonproto --noimplicit_deps "//$pkg:bar" > output 2> "$TEST_log" \
|| fail "Expected success"
cat output >> "$TEST_log"

# Verify that the appropriate attributes were included.
assert_contains "\"ruleClass\": \"genrule\"" output
assert_contains "\"name\": \"//$pkg:bar\"" output
assert_contains "\"ruleInput\": \[\"//$pkg:dummy.txt\"\]" output
assert_contains "\"ruleOutput\": \[\"//$pkg:bar_out.txt\"\]" output
assert_contains "echo unused" output
}

run_suite "${PRODUCT_NAME} query tests"

0 comments on commit a5c0d85

Please sign in to comment.