diff options
author | Andreas Bergmeier <abergmeier@gmx.net> | 2016-08-10 09:49:00 +0000 |
---|---|---|
committer | Yue Gan <yueg@google.com> | 2016-08-10 13:54:57 +0000 |
commit | 18f005bde9a6b85167be9f899ab4abfb888fc4d8 (patch) | |
tree | 2593df7c714489cf25e4999bd6964231d8e901d3 /src/main | |
parent | 7e71f89f5ac0ef826fc1b9474155197946b031d3 (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')
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<>(); } |