| // Copyright 2014 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.runtime.commands; |
| |
| import com.google.common.annotations.VisibleForTesting; |
| import com.google.devtools.build.lib.analysis.BlazeVersionInfo; |
| import com.google.devtools.build.lib.analysis.NoBuildEvent; |
| import com.google.devtools.build.lib.events.Event; |
| import com.google.devtools.build.lib.runtime.BlazeCommand; |
| import com.google.devtools.build.lib.runtime.BlazeCommandResult; |
| import com.google.devtools.build.lib.runtime.Command; |
| import com.google.devtools.build.lib.runtime.CommandEnvironment; |
| import com.google.devtools.build.lib.server.FailureDetails; |
| import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; |
| import com.google.devtools.build.lib.server.FailureDetails.VersionCommand.Code; |
| import com.google.devtools.common.options.Option; |
| 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.OptionsParsingResult; |
| import java.util.Optional; |
| |
| /** |
| * The 'blaze version' command, which informs users about the blaze version |
| * information. |
| */ |
| @Command(name = "version", |
| options = { VersionCommand.VersionOptions.class }, |
| allowResidue = false, |
| mustRunInWorkspace = false, |
| help = "resource:version.txt", |
| shortDescription = "Prints version information for %{product}.") |
| public final class VersionCommand implements BlazeCommand { |
| /** Options for the "version" command. */ |
| public static class VersionOptions extends OptionsBase { |
| @Option( |
| name = "gnu_format", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.OUTPUT_PARAMETERS, |
| effectTags = {OptionEffectTag.AFFECTS_OUTPUTS, OptionEffectTag.EXECUTION}, |
| help = |
| "If set, write the version to stdout using the conventions described in the GNU" |
| + " standards." |
| ) |
| public boolean gnuFormat; |
| } |
| |
| @Override |
| public void editOptions(OptionsParser optionsParser) {} |
| |
| @Override |
| public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) { |
| env.getEventBus().post(new NoBuildEvent()); |
| |
| Optional<String> info = |
| getInfo( |
| env.getRuntime().getProductName(), |
| BlazeVersionInfo.instance(), |
| options.getOptions(VersionOptions.class).gnuFormat); |
| if (info.isPresent()) { |
| env.getReporter().getOutErr().printOutLn(info.get()); |
| return BlazeCommandResult.success(); |
| } |
| String message = "Version information not available"; |
| env.getReporter().handle(Event.error(message)); |
| return BlazeCommandResult.failureDetail( |
| FailureDetail.newBuilder() |
| .setMessage(message) |
| .setVersionCommand( |
| FailureDetails.VersionCommand.newBuilder().setCode(Code.NOT_AVAILABLE)) |
| .build()); |
| } |
| |
| @VisibleForTesting |
| static Optional<String> getInfo(String productName, BlazeVersionInfo info, boolean gnuFormat) { |
| if (info.getSummary() == null) { |
| return Optional.empty(); |
| } |
| if (gnuFormat) { |
| return Optional.of( |
| productName + " " + (info.isReleasedBlaze() ? info.getVersion() : "no_version")); |
| } |
| return Optional.of(info.getSummary()); |
| } |
| } |