aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar fwe <fwe@google.com>2017-09-14 18:01:48 +0200
committerGravatar Philipp Wollermann <philwo@google.com>2017-09-14 18:48:57 +0200
commit346c8ff48419cf612c34a2fc9d7daa885f8f16c0 (patch)
treea048a015e637e466813759e0cd965dc54e97776a /src/main/java/com/google/devtools/build
parent429375327379176a30e30b50cf6346c1e1c0f563 (diff)
Introduce "bazel help flags-as-proto" to print information about supported flags as a text protobuf.
PiperOrigin-RevId: 168695297
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java46
2 files changed, 47 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 6149e5fc02..6b5460458e 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -1000,6 +1000,7 @@ java_library(
"//src/main/java/com/google/devtools/common/options",
"//src/main/java/com/google/devtools/common/options:invocation_policy",
"//src/main/protobuf:action_cache_java_proto",
+ "//src/main/protobuf:bazel_flags_java_proto",
"//src/main/protobuf:build_java_proto",
"//src/main/protobuf:command_server_java_grpc",
"//src/main/protobuf:command_server_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
index 5e42732d5e..a3669efccc 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
@@ -34,24 +34,30 @@ import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.BlazeRuntime;
import com.google.devtools.build.lib.runtime.Command;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.build.lib.runtime.commands.proto.BazelFlagsProto;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.build.lib.util.StringUtil;
import com.google.devtools.build.lib.util.io.OutErr;
import com.google.devtools.common.options.Converters;
import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDefinition;
import com.google.devtools.common.options.OptionDocumentationCategory;
import com.google.devtools.common.options.OptionEffectTag;
import com.google.devtools.common.options.OptionsBase;
import com.google.devtools.common.options.OptionsParser;
import com.google.devtools.common.options.OptionsProvider;
import java.util.ArrayList;
+import java.util.Base64;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.function.BiConsumer;
import java.util.function.Consumer;
+import java.util.function.Predicate;
/** The 'blaze help' command, which prints all available commands as well as specific help pages. */
@Command(
@@ -189,6 +195,9 @@ public final class HelpCommand implements BlazeCommand {
} else if (helpSubject.equals("completion")) {
emitCompletionHelp(runtime, outErr);
return ExitCode.SUCCESS;
+ } else if (helpSubject.equals("flags-as-proto")) {
+ emitFlagsAsProtoHelp(runtime, outErr);
+ return ExitCode.SUCCESS;
} else if (helpSubject.equals("everything-as-html")) {
new HtmlEmitter(runtime).emit(outErr);
return ExitCode.SUCCESS;
@@ -274,6 +283,43 @@ public final class HelpCommand implements BlazeCommand {
visitAllOptions(runtime, startupOptionVisitor, commandOptionVisitor);
}
+ private void emitFlagsAsProtoHelp(BlazeRuntime runtime, OutErr outErr) {
+ Map<String, BazelFlagsProto.FlagInfo.Builder> flags = new HashMap<>();
+
+ Predicate<OptionDefinition> allOptions = option -> true;
+ BiConsumer<String, OptionDefinition> visitor =
+ (commandName, option) -> {
+ BazelFlagsProto.FlagInfo.Builder info =
+ flags.computeIfAbsent(option.getOptionName(), key -> createFlagInfo(option));
+ info.addCommands(commandName);
+ };
+ Consumer<OptionsParser> startupOptionVisitor =
+ parser -> {
+ parser.visitOptions(allOptions, option -> visitor.accept("startup", option));
+ };
+ CommandOptionVisitor commandOptionVisitor =
+ (commandName, commandAnnotation, parser) -> {
+ parser.visitOptions(allOptions, option -> visitor.accept(commandName, option));
+ };
+
+ visitAllOptions(runtime, startupOptionVisitor, commandOptionVisitor);
+
+ BazelFlagsProto.FlagCollection.Builder collectionBuilder =
+ BazelFlagsProto.FlagCollection.newBuilder();
+ for (BazelFlagsProto.FlagInfo.Builder info : flags.values()) {
+ collectionBuilder.addFlagInfos(info);
+ }
+ outErr.printOut(Base64.getEncoder().encodeToString(collectionBuilder.build().toByteArray()));
+ }
+
+ private BazelFlagsProto.FlagInfo.Builder createFlagInfo(OptionDefinition option) {
+ BazelFlagsProto.FlagInfo.Builder flagBuilder = BazelFlagsProto.FlagInfo.newBuilder();
+ flagBuilder.setName(option.getOptionName());
+ flagBuilder.setHasNegativeFlag(option.hasNegativeOption());
+ flagBuilder.setDocumentation(option.getHelpText());
+ return flagBuilder;
+ }
+
private void visitAllOptions(
BlazeRuntime runtime,
Consumer<OptionsParser> startupOptionVisitor,