Skip to content

Commit

Permalink
Add jsonproto option to query --output flag
Browse files Browse the repository at this point in the history
  • Loading branch information
chiragramani committed Apr 24, 2023
1 parent bbf78a2 commit 6b9d7f4
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,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
Expand Up @@ -39,6 +39,7 @@ public static ImmutableList<OutputFormatter> getDefaultFormatters() {
new GraphOutputFormatter(),
new XmlOutputFormatter(),
new ProtoOutputFormatter(),
new ProtoJSONOutputFormatter(),
new StreamedProtoOutputFormatter());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// 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 java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import com.google.protobuf.util.JsonFormat;

/**
* 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 ProtoJSONOutputFormatter 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));
}
}
};
}
}
23 changes: 23 additions & 0 deletions src/test/shell/integration/bazel_query_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1098,4 +1098,27 @@ EOF
expect_log "//pkg3:t4"
}

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 action was 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 6b9d7f4

Please sign in to comment.