// 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.util; import com.google.devtools.build.lib.shell.AbnormalTerminationException; import com.google.devtools.build.lib.shell.Command; import com.google.devtools.build.lib.shell.CommandException; import com.google.devtools.build.lib.shell.CommandResult; import java.util.Arrays; import java.util.Collection; import java.util.Map; /** * Utility methods relating to the {@link Command} class. */ public class CommandUtils { private CommandUtils() {} // Prevent instantiation. private static Collection<String> commandLine(Command command) { return Arrays.asList(command.getCommandLineElements()); } private static Map<String, String> env(Command command) { return command.getEnvironmentVariables(); } private static String cwd(Command command) { return command.getWorkingDirectory() == null ? null : command.getWorkingDirectory().getPath(); } /** * Construct an error message that describes a failed command invocation. * Currently this returns a message of the form "error executing command foo * bar baz". */ public static String describeCommandError(boolean verbose, Command command) { return CommandFailureUtils.describeCommandError(verbose, commandLine(command), env(command), cwd(command)); } /** * Construct an error message that describes a failed command invocation. * Currently this returns a message of the form "foo failed: error executing * command /dir/foo bar baz". */ public static String describeCommandFailure(boolean verbose, Command command) { return CommandFailureUtils.describeCommandFailure(verbose, commandLine(command), env(command), cwd(command)); } /** * Construct an error message that describes a failed command invocation. * Currently this returns a message of the form "foo failed: error executing * command /dir/foo bar baz: exception message", with the * command's stdout and stderr output appended if available. */ public static String describeCommandFailure(boolean verbose, CommandException exception) { String message = describeCommandFailure(verbose, exception.getCommand()) + ": " + exception.getMessage(); if (exception instanceof AbnormalTerminationException) { CommandResult result = ((AbnormalTerminationException) exception).getResult(); try { return message + "\n" + new String(result.getStdout()) + new String(result.getStderr()); } catch (IllegalStateException e) { // This can happen if the command didn't save stdout/stderr, // so ignore this exception and fall through to the ordinary case. } } return message; } }