aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Andreas Bergmeier <abergmeier@gmx.net>2016-08-10 09:49:00 +0000
committerGravatar Yue Gan <yueg@google.com>2016-08-10 13:54:57 +0000
commit18f005bde9a6b85167be9f899ab4abfb888fc4d8 (patch)
tree2593df7c714489cf25e4999bd6964231d8e901d3 /src/main
parent7e71f89f5ac0ef826fc1b9474155197946b031d3 (diff)
Added support for null terminated queries.
Closes #1496. -- Reviewed-on: https://github.com/bazelbuild/bazel/pull/1496 MOS_MIGRATED_REVID=129846158
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java68
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/QueryOptions.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/QueryOutputUtils.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java3
8 files changed, 85 insertions, 45 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java
index a4fad3a45f..0d7c9406ff 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java
@@ -23,7 +23,6 @@ import com.google.devtools.build.lib.graph.LabelSerializer;
import com.google.devtools.build.lib.graph.Node;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.query2.output.QueryOptions.OrderOutput;
-
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -56,18 +55,19 @@ class GraphOutputFormatter extends OutputFormatter {
if (options.graphFactored) {
outputFactored(result, new PrintWriter(out), sortLabels);
} else {
- outputUnfactored(result, new PrintWriter(out), sortLabels);
+ outputUnfactored(result, new PrintWriter(out), sortLabels, options);
}
}
- private void outputUnfactored(Digraph<Target> result, PrintWriter out, boolean sortLabels) {
+ private void outputUnfactored(
+ Digraph<Target> result, PrintWriter out, boolean sortLabels, final QueryOptions options) {
result.visitNodesBeforeEdges(
new DotOutputVisitor<Target>(out, LABEL_STRINGIFIER) {
@Override
public void beginVisit() {
super.beginVisit();
// TODO(bazel-team): (2009) make this the default in Digraph.
- out.println(" node [shape=box];");
+ out.printf(" node [shape=box];%s", options.getLineTerminator());
}
},
sortLabels ? new TargetOrdering() : null);
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
index b82d048c4b..f47d94942b 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
@@ -36,7 +36,6 @@ import com.google.devtools.build.lib.syntax.EvalUtils;
import com.google.devtools.build.lib.syntax.Printer;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.common.options.EnumConverter;
-
import java.io.IOException;
import java.io.PrintStream;
import java.io.Serializable;
@@ -49,7 +48,6 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-
import javax.annotation.Nullable;
/**
@@ -180,7 +178,7 @@ public abstract class OutputFormatter implements Serializable {
* <p>Takes any options specified via the most recent call to {@link #setOptions} into
* consideration.
*/
- OutputFormatterCallback<Target> createStreamCallback(PrintStream out);
+ OutputFormatterCallback<Target> createStreamCallback(PrintStream out, QueryOptions options);
}
/**
@@ -215,8 +213,7 @@ public abstract class OutputFormatter implements Serializable {
AspectResolver aspectResolver) throws IOException, InterruptedException {
setOptions(options, aspectResolver);
OutputFormatterCallback.processAllTargets(
- createStreamCallback(out),
- getOrderedTargets(result, options));
+ createStreamCallback(out, options), getOrderedTargets(result, options));
}
}
@@ -238,7 +235,8 @@ public abstract class OutputFormatter implements Serializable {
}
@Override
- public OutputFormatterCallback<Target> createStreamCallback(final PrintStream out) {
+ public OutputFormatterCallback<Target> createStreamCallback(
+ final PrintStream out, final QueryOptions options) {
return new OutputFormatterCallback<Target>() {
@Override
@@ -249,7 +247,8 @@ public abstract class OutputFormatter implements Serializable {
out.print(target.getTargetKind());
out.print(' ');
}
- out.println(target.getLabel().getDefaultCanonicalForm());
+ out.printf(
+ "%s%s", target.getLabel().getDefaultCanonicalForm(), options.getLineTerminator());
}
}
};
@@ -272,13 +271,16 @@ public abstract class OutputFormatter implements Serializable {
* set, in lexicographical order without duplicates.
*/
private static class PackageOutputFormatter extends AbstractUnorderedFormatter {
+
+
@Override
public String getName() {
return "package";
}
@Override
- public OutputFormatterCallback<Target> createStreamCallback(final PrintStream out) {
+ public OutputFormatterCallback<Target> createStreamCallback(
+ final PrintStream out, final QueryOptions options) {
return new OutputFormatterCallback<Target>() {
private final Set<String> packageNames = Sets.newTreeSet();
@@ -293,8 +295,9 @@ public abstract class OutputFormatter implements Serializable {
@Override
public void close() throws IOException {
+ final String lineTerm = options.getLineTerminator();
for (String packageName : packageNames) {
- out.println(packageName);
+ out.printf("%s%s", packageName, lineTerm);
}
}
};
@@ -308,22 +311,30 @@ public abstract class OutputFormatter implements Serializable {
* line 1 is given.
*/
private static class LocationOutputFormatter extends AbstractUnorderedFormatter {
+
@Override
public String getName() {
return "location";
}
@Override
- public OutputFormatterCallback<Target> createStreamCallback(final PrintStream out) {
+ public OutputFormatterCallback<Target> createStreamCallback(
+ final PrintStream out, final QueryOptions options) {
return new OutputFormatterCallback<Target>() {
@Override
protected void processOutput(Iterable<Target> partialResult)
throws IOException, InterruptedException {
+ final String lineTerm = options.getLineTerminator();
for (Target target : partialResult) {
Location location = target.getLocation();
- out.println(location.print() + ": " + target.getTargetKind()
- + " " + target.getLabel().getDefaultCanonicalForm());
+ out.print(
+ location.print()
+ + ": "
+ + target.getTargetKind()
+ + " "
+ + target.getLabel().getDefaultCanonicalForm()
+ + lineTerm);
}
}
};
@@ -336,20 +347,23 @@ public abstract class OutputFormatter implements Serializable {
* printed only once.
*/
private static class BuildOutputFormatter extends AbstractUnorderedFormatter {
+
@Override
public String getName() {
return "build";
}
@Override
- public OutputFormatterCallback<Target> createStreamCallback(final PrintStream out) {
+ public OutputFormatterCallback<Target> createStreamCallback(
+ final PrintStream out, final QueryOptions options) {
return new OutputFormatterCallback<Target>() {
private final Set<Label> printed = CompactHashSet.create();
private void outputRule(Rule rule, PrintStream out) {
- out.printf("# %s%n", rule.getLocation());
- out.printf("%s(%n", rule.getRuleClass());
- out.printf(" name = \"%s\",%n", rule.getName());
+ final String lineTerm = options.getLineTerminator();
+ out.printf("# %s%s", rule.getLocation(), lineTerm);
+ out.printf("%s(%s", rule.getRuleClass(), lineTerm);
+ out.printf(" name = \"%s\",%s", rule.getName(), lineTerm);
for (Attribute attr : rule.getAttributes()) {
Pair<Iterable<Object>, AttributeValueSource> values =
@@ -378,9 +392,9 @@ public abstract class OutputFormatter implements Serializable {
StringBuilder builder = new StringBuilder();
Printer.write(builder, value);
out.print(builder);
- out.println(",");
+ out.printf(",%s", lineTerm);
}
- out.printf(")\n%n");
+ out.printf(")\n%s", lineTerm);
}
@Override
@@ -434,17 +448,22 @@ public abstract class OutputFormatter implements Serializable {
* correspond to the shortest path from x to each of its prerequisites.
*/
private static class MinrankOutputFormatter extends OutputFormatter {
+
@Override
public String getName() {
return "minrank";
}
private static void outputToStreamOrSave(
- int rank, Label label, PrintStream out, @Nullable List<RankAndLabel> toSave) {
+ int rank,
+ Label label,
+ PrintStream out,
+ @Nullable List<RankAndLabel> toSave,
+ final String lineTerminator) {
if (toSave != null) {
toSave.add(new RankAndLabel(rank, label));
} else {
- out.println(rank + " " + label.getDefaultCanonicalForm());
+ out.print(rank + " " + label.getDefaultCanonicalForm() + lineTerminator);
}
}
@@ -462,11 +481,12 @@ public abstract class OutputFormatter implements Serializable {
Set<Node<Set<Node<Target>>>> rankNodes = scGraph.getRoots();
Set<Node<Set<Node<Target>>>> seen = new HashSet<>();
seen.addAll(rankNodes);
+ final String lineTerm = options.getLineTerminator();
for (int rank = 0; !rankNodes.isEmpty(); rank++) {
// Print out this rank:
for (Node<Set<Node<Target>>> xScc : rankNodes) {
for (Node<Target> x : xScc.getLabel()) {
- outputToStreamOrSave(rank, x.getLabel().getLabel(), out, outputToOrder);
+ outputToStreamOrSave(rank, x.getLabel().getLabel(), out, outputToOrder, lineTerm);
}
}
@@ -484,7 +504,7 @@ public abstract class OutputFormatter implements Serializable {
if (outputToOrder != null) {
Collections.sort(outputToOrder);
for (RankAndLabel item : outputToOrder) {
- out.println(item);
+ out.printf("%s%s", item, lineTerm);
}
}
}
@@ -502,6 +522,7 @@ public abstract class OutputFormatter implements Serializable {
* correspond to the longest path from x to each of its prerequisites.
*/
private static class MaxrankOutputFormatter extends OutputFormatter {
+
@Override
public String getName() {
return "maxrank";
@@ -556,8 +577,9 @@ public abstract class OutputFormatter implements Serializable {
}
});
}
+ final String lineTerm = options.getLineTerminator();
for (RankAndLabel item : output) {
- out.println(item);
+ out.printf("%s%s", item, lineTerm);
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
index 4f8c709ee9..c10b6f10be 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
@@ -87,7 +87,8 @@ public class ProtoOutputFormatter extends AbstractUnorderedFormatter {
}
@Override
- public OutputFormatterCallback<Target> createStreamCallback(final PrintStream out) {
+ public OutputFormatterCallback<Target> createStreamCallback(
+ final PrintStream out, final QueryOptions options) {
return new OutputFormatterCallback<Target>() {
private Builder queryResult;
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/QueryOptions.java b/src/main/java/com/google/devtools/build/lib/query2/output/QueryOptions.java
index eacc2d74ab..e17fa48a90 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/QueryOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/QueryOptions.java
@@ -18,7 +18,6 @@ import com.google.devtools.common.options.Converters;
import com.google.devtools.common.options.EnumConverter;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;
-
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
@@ -50,6 +49,23 @@ public class QueryOptions extends OptionsBase {
public String outputFormat;
@Option(
+ name = "null",
+ defaultValue = "null",
+ category = "query",
+ expansion = {"--line_terminator_null=true"},
+ help = "Whether each format is terminated with \0 instead of newline."
+ )
+ public Void isNull;
+
+ @Option(
+ name = "line_terminator_null",
+ defaultValue = "false",
+ category = "query",
+ help = "Whether each format is terminated with \0 instead of newline."
+ )
+ public boolean lineTerminatorNull;
+
+ @Option(
name = "order_results",
defaultValue = "null",
category = "query",
@@ -224,10 +240,17 @@ public class QueryOptions extends OptionsBase {
+ "command line. It is an error to specify a file here as well as a command-line query."
)
public String queryFile;
+
+ /** Ugly workaround since line terminator option default has to be constant expression. */
+ public String getLineTerminator() {
+ if (lineTerminatorNull) {
+ return "\0";
+ }
+
+ return System.lineSeparator();
+ }
- /**
- * Return the current options as a set of QueryEnvironment settings.
- */
+ /** Return the current options as a set of QueryEnvironment settings. */
public Set<Setting> toSettings() {
Set<Setting> settings = EnumSet.noneOf(Setting.class);
if (strictTestSuite) {
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/QueryOutputUtils.java b/src/main/java/com/google/devtools/build/lib/query2/output/QueryOutputUtils.java
index 3235d9952c..6c63c6bf5a 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/QueryOutputUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/QueryOutputUtils.java
@@ -19,7 +19,6 @@ import com.google.devtools.build.lib.query2.engine.OutputFormatterCallback;
import com.google.devtools.build.lib.query2.engine.QueryEvalResult;
import com.google.devtools.build.lib.query2.output.OutputFormatter.StreamedFormatter;
import com.google.devtools.build.lib.query2.output.QueryOptions.OrderOutput;
-
import java.io.IOException;
import java.io.PrintStream;
import java.util.Set;
@@ -52,7 +51,7 @@ public class QueryOutputUtils {
StreamedFormatter streamedFormatter = (StreamedFormatter) formatter;
streamedFormatter.setOptions(queryOptions, aspectResolver);
OutputFormatterCallback.processAllTargets(
- streamedFormatter.createStreamCallback(outputStream), targetsResult);
+ streamedFormatter.createStreamCallback(outputStream, queryOptions), targetsResult);
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java
index b6df296d13..9a7aa0cfe0 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java
@@ -31,18 +31,12 @@ import com.google.devtools.build.lib.query2.engine.OutputFormatterCallback;
import com.google.devtools.build.lib.query2.output.AspectResolver.BuildFileDependencyMode;
import com.google.devtools.build.lib.query2.output.OutputFormatter.AbstractUnorderedFormatter;
import com.google.devtools.build.lib.util.Pair;
-
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
import java.io.IOException;
import java.io.PrintStream;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
@@ -52,6 +46,9 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
/**
* An output formatter that prints the result as XML.
@@ -63,13 +60,13 @@ class XmlOutputFormatter extends AbstractUnorderedFormatter {
}
@Override
- public OutputFormatterCallback<Target> createStreamCallback(final PrintStream out) {
+ public OutputFormatterCallback<Target> createStreamCallback(
+ final PrintStream out, final QueryOptions options) {
return new OutputFormatterCallback<Target>() {
private Document doc;
private Element queryElem;
-
@Override
public void start() {
try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
index b4c074a6d2..c5ebb6f8b3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
@@ -281,7 +281,6 @@ public class GenQuery implements RuleConfiguredTargetFactory {
// time we get there.
formatter = OutputFormatter.getFormatter(
Preconditions.checkNotNull(outputFormatters), queryOptions.outputFormat);
-
// All the packages are already loaded at this point, so there is no need
// to start up many threads. 4 are started up to make good use of multiple
// cores.
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
index f3470d6015..1e587d787a 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
@@ -46,7 +46,6 @@ import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.common.options.OptionsParser;
import com.google.devtools.common.options.OptionsProvider;
-
import java.io.IOException;
import java.io.PrintStream;
import java.nio.channels.ClosedByInterruptException;
@@ -163,7 +162,7 @@ public final class QueryCommand implements BlazeCommand {
streamedFormatter.setOptions(
queryOptions,
queryOptions.aspectDeps.createResolver(env.getPackageManager(), env.getReporter()));
- callback = streamedFormatter.createStreamCallback(output);
+ callback = streamedFormatter.createStreamCallback(output, queryOptions);
} else {
callback = new AggregateAllOutputFormatterCallback<>();
}