Introduce CommandEnvironment and pass it instead of BlazeRuntime.
The very long term plan is to make BlazeRuntime immutable, so that we can
run multiple commands in the same server.
--
MOS_MIGRATED_REVID=103080946
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java
index 61f46a8..c050043 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java
@@ -39,7 +39,7 @@
* shut down and the exit status will be 0 (in case the shutdown succeeds
* without error).
*
- * @param runtime The Blaze runtime requesting the execution of the command
+ * @param env The environment for the current command invocation
* @param options A parsed options instance initialized with the values for
* the options specified in {@link Command#options()}.
*
@@ -47,7 +47,7 @@
* @throws BlazeCommandDispatcher.ShutdownBlazeServerException Indicates
* that the command wants to shutdown the Blaze server.
*/
- ExitCode exec(BlazeRuntime runtime, OptionsProvider options)
+ ExitCode exec(CommandEnvironment env, OptionsProvider options)
throws BlazeCommandDispatcher.ShutdownBlazeServerException;
/**
@@ -55,9 +55,10 @@
* requirements. This method is called after all command-line and rc file options have been
* parsed.
*
- * @param runtime The Blaze runtime requesting the execution of the command
+ * @param env the command environment of the currently running command
+ * @param optionsParser the options parser for the current command
*
* @throws AbruptExitException if something went wrong
*/
- void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) throws AbruptExitException;
+ void editOptions(CommandEnvironment env, OptionsParser optionsParser) throws AbruptExitException;
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index 9b901e6..cb0a0f9 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -239,7 +239,7 @@
// the command's execution - that's why we do this separately,
// rather than in runtime.beforeCommand().
runtime.getTimestampGranularityMonitor().setCommandStartTime();
- runtime.initEventBus();
+ CommandEnvironment env = runtime.initCommand();
if (args.isEmpty()) { // Default to help command if no arguments specified.
args = HELP_COMMAND;
@@ -262,7 +262,7 @@
AbruptExitException exitCausingException = null;
for (BlazeModule module : runtime.getBlazeModules()) {
try {
- module.beforeCommand(runtime, commandAnnotation);
+ module.beforeCommand(runtime, commandAnnotation, env);
} catch (AbruptExitException e) {
// Don't let one module's complaints prevent the other modules from doing necessary
// setup. We promised to call beforeCommand exactly once per-module before each command
@@ -340,7 +340,7 @@
PrintStream savedErr = System.err;
EventHandler handler = createEventHandler(outErr, eventHandlerOptions);
- Reporter reporter = runtime.getReporter();
+ Reporter reporter = env.getReporter();
reporter.addHandler(handler);
// We register an ANSI-allowing handler associated with {@code handler} so that ANSI control
@@ -372,9 +372,10 @@
try {
// Notify the BlazeRuntime, so it can do some initial setup.
- runtime.beforeCommand(commandAnnotation, optionsParser, commonOptions, execStartTimeNanos);
+ runtime.beforeCommand(commandAnnotation, env, optionsParser, commonOptions,
+ execStartTimeNanos);
// Allow the command to edit options after parsing:
- command.editOptions(runtime, optionsParser);
+ command.editOptions(env, optionsParser);
} catch (AbruptExitException e) {
reporter.handle(Event.error(e.getMessage()));
return e.getExitCode().getNumericExitCode();
@@ -385,8 +386,8 @@
reporter.handle(Event.warn(warning));
}
- ExitCode outcome = command.exec(runtime, optionsParser);
- outcome = runtime.precompleteCommand(outcome);
+ ExitCode outcome = command.exec(env, optionsParser);
+ outcome = runtime.precompleteCommand(env, outcome);
numericExitCode = outcome.getNumericExitCode();
return numericExitCode;
} catch (ShutdownBlazeServerException e) {
@@ -400,7 +401,7 @@
: ExitCode.BLAZE_INTERNAL_ERROR.getNumericExitCode();
throw new ShutdownBlazeServerException(numericExitCode, e);
} finally {
- runtime.afterCommand(numericExitCode);
+ runtime.afterCommand(env, numericExitCode);
// Swallow IOException, as we are already in a finally clause
Flushables.flushQuietly(outErr.getOutputStream());
Flushables.flushQuietly(outErr.getErrorStream());
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
index bfc1d8f..68eed55 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
@@ -221,8 +221,16 @@
* Called before each command.
*/
@SuppressWarnings("unused")
- public void beforeCommand(BlazeRuntime blazeRuntime, Command command)
+ public void beforeCommand(Command command, CommandEnvironment env) throws AbruptExitException {
+ }
+
+ /**
+ * Called before each command.
+ */
+ @SuppressWarnings("unused")
+ public void beforeCommand(BlazeRuntime blazeRuntime, Command command, CommandEnvironment env)
throws AbruptExitException {
+ beforeCommand(command, env);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 7e4e41c..c1ec448 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -51,7 +51,6 @@
import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.buildtool.BuildTool;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.OutputFilter;
import com.google.devtools.build.lib.events.Reporter;
@@ -154,10 +153,11 @@
import javax.annotation.Nullable;
/**
- * The BlazeRuntime class encapsulates the runtime settings and services that
- * are available to most parts of any Blaze application for the duration of the
- * batch run or server lifetime. A single instance of this runtime will exist
- * and will be passed around as needed.
+ * The BlazeRuntime class encapsulates the immutable configuration of the current instance. These
+ * runtime settings and services are available to most parts of any Blaze application for the
+ * duration of the batch run or server lifetime.
+ *
+ * <p>The parts specific to the current command are stored in {@link CommandEnvironment}.
*/
public final class BlazeRuntime {
public static final String DO_NOT_BUILD_FILE_NAME = "DO_NOT_BUILD_HERE";
@@ -177,7 +177,6 @@
private final SkyframeExecutor skyframeExecutor;
private final Reporter reporter;
- private EventBus eventBus;
private final LoadingPhaseRunner loadingPhaseRunner;
private final PackageFactory packageFactory;
private final PackageRootResolver packageRootResolver;
@@ -187,7 +186,6 @@
private ActionCache actionCache;
private final TimestampGranularityMonitor timestampGranularityMonitor;
private final Clock clock;
- private final BuildTool buildTool;
private OutputService outputService;
@@ -270,8 +268,6 @@
this.eventBusExceptionHandler = eventBusExceptionHandler;
this.blazeModuleEnvironment = new BlazeModuleEnvironment();
- this.buildTool = new BuildTool(this);
- initEventBus();
if (inWorkspace()) {
writeOutputBaseReadmeFile();
@@ -311,26 +307,22 @@
return outputFileSystem;
}
- @VisibleForTesting
- public void initEventBus() {
- setEventBus(new EventBus(eventBusExceptionHandler));
+ public CommandEnvironment initCommand() {
+ EventBus eventBus = new EventBus(eventBusExceptionHandler);
+ skyframeExecutor.setEventBus(eventBus);
+ return new CommandEnvironment(this, eventBus);
}
private void clearEventBus() {
// EventBus does not have an unregister() method, so this is how we release memory associated
// with handlers.
- setEventBus(null);
- }
-
- private void setEventBus(EventBus eventBus) {
- this.eventBus = eventBus;
- skyframeExecutor.setEventBus(eventBus);
+ skyframeExecutor.setEventBus(null);
}
/**
* Conditionally enable profiling.
*/
- private final boolean initProfiler(CommonCommandOptions options,
+ private final boolean initProfiler(CommandEnvironment env, CommonCommandOptions options,
UUID buildID, long execStartTimeNanos) {
OutputStream out = null;
boolean recordFullProfilerData = false;
@@ -342,7 +334,7 @@
recordFullProfilerData = options.recordFullProfilerData;
out = new BufferedOutputStream(profilePath.getOutputStream(), 1024 * 1024);
- getReporter().handle(Event.info("Writing profile data to '" + profilePath + "'"));
+ env.getReporter().handle(Event.info("Writing profile data to '" + profilePath + "'"));
profiledTasks = ProfiledTaskKinds.ALL;
} else if (options.alwaysProfileSlowOperations) {
recordFullProfilerData = false;
@@ -357,7 +349,7 @@
return true;
}
} catch (IOException e) {
- getReporter().handle(Event.error("Error while creating profile file: " + e.getMessage()));
+ env.getReporter().handle(Event.error("Error while creating profile file: " + e.getMessage()));
}
return false;
}
@@ -517,13 +509,6 @@
return reporter;
}
- /**
- * Returns the current event bus. Only valid within the scope of a single Blaze command.
- */
- public EventBus getEventBus() {
- return eventBus;
- }
-
public BinTools getBinTools() {
return binTools;
}
@@ -542,13 +527,6 @@
return packageFactory;
}
- /**
- * Returns the build tool.
- */
- public BuildTool getBuildTool() {
- return buildTool;
- }
-
public ImmutableList<OutputFormatter> getQueryOutputFormatters() {
ImmutableList.Builder<OutputFormatter> result = ImmutableList.builder();
result.addAll(OutputFormatter.getDefaultFormatters());
@@ -702,12 +680,12 @@
* @param options The CommonCommandOptions used by every command.
* @throws AbruptExitException if this command is unsuitable to be run as specified
*/
- void beforeCommand(Command command, OptionsParser optionsParser,
+ void beforeCommand(Command command, CommandEnvironment env, OptionsParser optionsParser,
CommonCommandOptions options, long execStartTimeNanos)
throws AbruptExitException {
commandStartTime -= options.startupTime;
- eventBus.post(new GotOptionsEvent(startupOptionsProvider,
+ env.getEventBus().post(new GotOptionsEvent(startupOptionsProvider,
optionsParser));
throwPendingException();
@@ -753,7 +731,7 @@
// Conditionally enable profiling
// We need to compensate for launchTimeNanos (measurements taken outside of the jvm).
long startupTimeNanos = options.startupTime * 1000000L;
- if (initProfiler(options, this.getCommandId(), execStartTimeNanos - startupTimeNanos)) {
+ if (initProfiler(env, options, this.getCommandId(), execStartTimeNanos - startupTimeNanos)) {
Profiler profiler = Profiler.instance();
// Instead of logEvent() we're calling the low level function to pass the timings we took in
@@ -770,7 +748,7 @@
try {
MemoryProfiler.instance().start(memoryProfilePath.getOutputStream());
} catch (IOException e) {
- getReporter().handle(
+ env.getReporter().handle(
Event.error("Error while creating memory profile file: " + e.getMessage()));
}
}
@@ -802,7 +780,8 @@
module.handleOptions(optionsParser);
}
- eventBus.post(new CommandStartEvent(command.name(), commandId, clientEnv, workingDirectory));
+ env.getEventBus().post(
+ new CommandStartEvent(command.name(), commandId, clientEnv, workingDirectory));
// Initialize exit code to dummy value for afterCommand.
storedExitCode.set(ExitCode.RESERVED.getNumericExitCode());
}
@@ -811,8 +790,8 @@
* Hook method called by the BlazeCommandDispatcher right before the dispatch
* of each command ends (while its outcome can still be modified).
*/
- ExitCode precompleteCommand(ExitCode originalExit) {
- eventBus.post(new CommandPrecompleteEvent(originalExit));
+ ExitCode precompleteCommand(CommandEnvironment env, ExitCode originalExit) {
+ env.getEventBus().post(new CommandPrecompleteEvent(originalExit));
// If Blaze did not suffer an infrastructure failure, check for errors in modules.
ExitCode exitCode = originalExit;
if (!originalExit.isInfrastructureFailure() && pendingException != null) {
@@ -833,7 +812,7 @@
// thread won the race (unlikely, but possible), this may be incorrectly logged as a success.
return;
}
- eventBus.post(new CommandCompleteEvent(exitCode));
+ skyframeExecutor.getEventBus().post(new CommandCompleteEvent(exitCode));
}
/**
@@ -841,9 +820,9 @@
* command.
*/
@VisibleForTesting
- public void afterCommand(int exitCode) {
+ public void afterCommand(CommandEnvironment env, int exitCode) {
// Remove any filters that the command might have added to the reporter.
- getReporter().setOutputFilter(OutputFilter.OUTPUT_EVERYTHING);
+ env.getReporter().setOutputFilter(OutputFilter.OUTPUT_EVERYTHING);
notifyCommandComplete(exitCode);
@@ -857,7 +836,7 @@
Profiler.instance().stop();
MemoryProfiler.instance().stop();
} catch (IOException e) {
- getReporter().handle(Event.error("Error while writing profile file: " + e.getMessage()));
+ env.getReporter().handle(Event.error("Error while writing profile file: " + e.getMessage()));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
index d0b70f1..337f97f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
@@ -41,9 +41,9 @@
private Reporter reporter;
@Override
- public void beforeCommand(BlazeRuntime runtime, Command command) {
- this.reporter = runtime.getReporter();
- this.eventBus = runtime.getEventBus();
+ public void beforeCommand(Command command, CommandEnvironment env) {
+ this.reporter = env.getReporter();
+ this.eventBus = env.getEventBus();
eventBus.register(this);
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
new file mode 100644
index 0000000..02f7652
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -0,0 +1,58 @@
+// Copyright 2015 Google Inc. 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;
+
+import com.google.common.eventbus.EventBus;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
+import com.google.devtools.build.lib.events.Reporter;
+
+import java.util.Map;
+
+/**
+ * Encapsulates the state needed for a single command. The environment is dropped when the current
+ * command is done and all corresponding objects are garbage collected.
+ */
+public final class CommandEnvironment {
+ private final BlazeRuntime runtime;
+ private final EventBus eventBus;
+
+ public CommandEnvironment(BlazeRuntime runtime, EventBus eventBus) {
+ this.runtime = runtime;
+ this.eventBus = eventBus;
+ }
+
+ public BlazeRuntime getRuntime() {
+ return runtime;
+ }
+
+ public BlazeDirectories getDirectories() {
+ return runtime.getDirectories();
+ }
+
+ /**
+ * Returns the reporter for events.
+ */
+ public Reporter getReporter() {
+ return runtime.getReporter();
+ }
+
+ public EventBus getEventBus() {
+ return eventBus;
+ }
+
+ public Map<String, String> getClientEnv() {
+ return runtime.getClientEnv();
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java
index 94a0ada..0082d71 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java
@@ -17,12 +17,14 @@
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.buildtool.BuildRequest.BuildRequestOptions;
+import com.google.devtools.build.lib.buildtool.BuildTool;
import com.google.devtools.build.lib.exec.ExecutionOptions;
import com.google.devtools.build.lib.pkgcache.LoadingPhaseRunner;
import com.google.devtools.build.lib.pkgcache.PackageCacheOptions;
import com.google.devtools.build.lib.runtime.BlazeCommand;
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.util.AbruptExitException;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.common.options.OptionsParser;
@@ -51,20 +53,21 @@
public final class BuildCommand implements BlazeCommand {
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser)
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser)
throws AbruptExitException {
- ProjectFileSupport.handleProjectFiles(runtime, optionsParser, "build");
+ ProjectFileSupport.handleProjectFiles(env, optionsParser, "build");
}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
+ BlazeRuntime runtime = env.getRuntime();
List<String> targets = ProjectFileSupport.getTargets(runtime, options);
BuildRequest request = BuildRequest.create(
getClass().getAnnotation(Command.class).name(), options,
runtime.getStartupOptionsProvider(),
targets,
- runtime.getReporter().getOutErr(), runtime.getCommandId(), runtime.getCommandStartTime());
- return runtime.getBuildTool().processRequest(request, null).getExitCondition();
+ env.getReporter().getOutErr(), runtime.getCommandId(), runtime.getCommandStartTime());
+ return new BuildTool(env).processRequest(request, null).getExitCondition();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
index 82d503f..1b5b1cd 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
@@ -19,6 +19,7 @@
import com.google.devtools.build.lib.runtime.BlazeCommandUtils;
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.util.ExitCode;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;
@@ -51,11 +52,12 @@
}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
+ BlazeRuntime runtime = env.getRuntime();
String commandName = options.getOptions(Options.class).forCommand;
BlazeCommand command = runtime.getCommandMap().get(commandName);
if (command == null) {
- runtime.getReporter().handle(Event.error("Not a valid command: '" + commandName
+ env.getReporter().handle(Event.error("Not a valid command: '" + commandName
+ "' (should be one of " + Joiner.on(", ").join(runtime.getCommandMap().keySet()) + ")"));
return ExitCode.COMMAND_LINE_ERROR;
}
@@ -65,15 +67,15 @@
try {
List<String> result = OptionsParser.canonicalize(optionsClasses, options.getResidue());
for (String piece : result) {
- runtime.getReporter().getOutErr().printOutLn(piece);
+ env.getReporter().getOutErr().printOutLn(piece);
}
} catch (OptionsParsingException e) {
- runtime.getReporter().handle(Event.error(e.getMessage()));
+ env.getReporter().handle(Event.error(e.getMessage()));
return ExitCode.COMMAND_LINE_ERROR;
}
return ExitCode.SUCCESS;
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) {}
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) {}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index 5be4f90..f8d236c 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -22,6 +22,7 @@
import com.google.devtools.build.lib.runtime.BlazeCommandDispatcher.ShutdownBlazeServerException;
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.shell.CommandException;
import com.google.devtools.build.lib.util.CommandBuilder;
import com.google.devtools.build.lib.util.ExitCode;
@@ -83,15 +84,16 @@
private static Logger LOG = Logger.getLogger(CleanCommand.class.getName());
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options)
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options)
throws ShutdownBlazeServerException {
+ BlazeRuntime runtime = env.getRuntime();
Options cleanOptions = options.getOptions(Options.class);
cleanOptions.expunge_async = cleanOptions.cleanStyle.equals("expunge_async");
cleanOptions.expunge = cleanOptions.cleanStyle.equals("expunge");
if (!cleanOptions.expunge && !cleanOptions.expunge_async
&& !cleanOptions.cleanStyle.isEmpty()) {
- runtime.getReporter().handle(Event.error(
+ env.getReporter().handle(Event.error(
null, "Invalid clean_style value '" + cleanOptions.cleanStyle + "'"));
return ExitCode.COMMAND_LINE_ERROR;
}
@@ -101,27 +103,28 @@
"Starting clean (this may take a while). " +
"Consider using --expunge_async if the clean takes more than several minutes.";
- runtime.getReporter().handle(Event.info(null/*location*/, cleanBanner));
+ env.getReporter().handle(Event.info(null/*location*/, cleanBanner));
try {
String symlinkPrefix =
options.getOptions(BuildRequest.BuildRequestOptions.class).symlinkPrefix;
- actuallyClean(runtime, runtime.getOutputBase(), cleanOptions, symlinkPrefix);
+ actuallyClean(env, runtime.getOutputBase(), cleanOptions, symlinkPrefix);
return ExitCode.SUCCESS;
} catch (IOException e) {
- runtime.getReporter().handle(Event.error(e.getMessage()));
+ env.getReporter().handle(Event.error(e.getMessage()));
return ExitCode.LOCAL_ENVIRONMENTAL_ERROR;
} catch (CommandException | ExecException e) {
- runtime.getReporter().handle(Event.error(e.getMessage()));
+ env.getReporter().handle(Event.error(e.getMessage()));
return ExitCode.RUN_FAILURE;
} catch (InterruptedException e) {
- runtime.getReporter().handle(Event.error("clean interrupted"));
+ env.getReporter().handle(Event.error("clean interrupted"));
return ExitCode.INTERRUPTED;
}
}
- private void actuallyClean(BlazeRuntime runtime,
+ private void actuallyClean(CommandEnvironment env,
Path outputBase, Options cleanOptions, String symlinkPrefix) throws IOException,
ShutdownBlazeServerException, CommandException, ExecException, InterruptedException {
+ BlazeRuntime runtime = env.getRuntime();
if (runtime.getOutputService() != null) {
runtime.getOutputService().clean();
}
@@ -142,7 +145,7 @@
// same file system, and therefore the mv will be atomic and fast.
Path tempOutputBase = outputBase.getParentDirectory().getChild(tempBaseName);
outputBase.renameTo(tempOutputBase);
- runtime.getReporter().handle(Event.info(
+ env.getReporter().handle(Event.info(
null, "Output base moved to " + tempOutputBase + " for deletion"));
// Daemonize the shell and use the double-fork idiom to ensure that the shell
@@ -178,5 +181,5 @@
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) {}
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) {}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
index 1a0f8de..26eafa4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
@@ -22,6 +22,7 @@
import com.google.devtools.build.lib.runtime.BlazeCommandUtils;
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.util.ExitCode;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.common.options.EnumConverter;
@@ -55,7 +56,7 @@
/**
* NB! Any changes to this class must be kept in sync with anyOutput variable
- * value in the {@link DumpCommand#exec(BlazeRuntime,OptionsProvider)} method below.
+ * value in the {@link DumpCommand#exec(CommandEnvironment,OptionsProvider)} method below.
*/
public static class DumpOptions extends OptionsBase {
@@ -116,10 +117,11 @@
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) {}
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) {}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
+ BlazeRuntime runtime = env.getRuntime();
DumpOptions dumpOptions = options.getOptions(DumpOptions.class);
boolean anyOutput = dumpOptions.dumpPackages || dumpOptions.dumpVfs
@@ -131,14 +133,14 @@
Collection<Class<? extends OptionsBase>> optionList = new ArrayList<>();
optionList.add(DumpOptions.class);
- runtime.getReporter().getOutErr().printErrLn(BlazeCommandUtils.expandHelpTopic(
+ env.getReporter().getOutErr().printErrLn(BlazeCommandUtils.expandHelpTopic(
getClass().getAnnotation(Command.class).name(),
getClass().getAnnotation(Command.class).help(),
getClass(),
optionList, categories, OptionsParser.HelpVerbosity.LONG));
return ExitCode.ANALYSIS_FAILURE;
}
- PrintStream out = new PrintStream(runtime.getReporter().getOutErr().getOutputStream());
+ PrintStream out = new PrintStream(env.getReporter().getOutErr().getOutputStream());
try {
out.println("Warning: this information is intended for consumption by developers");
out.println("only, and may change at any time. Script against it at your own risk!");
@@ -158,7 +160,7 @@
if (dumpOptions.dumpArtifacts) {
success = false;
- runtime.getReporter().handle(Event.error("Cannot dump artifacts in Skyframe full mode. "
+ env.getReporter().handle(Event.error("Cannot dump artifacts in Skyframe full mode. "
+ "Use --skyframe instead"));
}
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 4418f1e..7ee0ca6 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
@@ -27,6 +27,7 @@
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.util.ExitCode;
import com.google.devtools.build.lib.util.io.OutErr;
import com.google.devtools.common.options.Converters;
@@ -129,11 +130,12 @@
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) {}
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) {}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
- OutErr outErr = runtime.getReporter().getOutErr();
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
+ BlazeRuntime runtime = env.getRuntime();
+ OutErr outErr = env.getReporter().getOutErr();
Options helpOptions = options.getOptions(Options.class);
if (options.getResidue().isEmpty()) {
emitBlazeVersionInfo(outErr);
@@ -141,7 +143,7 @@
return ExitCode.SUCCESS;
}
if (options.getResidue().size() != 1) {
- runtime.getReporter().handle(Event.error("You must specify exactly one command"));
+ env.getReporter().handle(Event.error("You must specify exactly one command"));
return ExitCode.COMMAND_LINE_ERROR;
}
String helpSubject = options.getResidue().get(0);
@@ -170,7 +172,7 @@
outErr.printOut(BlazeRuleHelpPrinter.getRuleDoc(helpSubject, provider));
return ExitCode.SUCCESS;
} else {
- runtime.getReporter().handle(Event.error(
+ env.getReporter().handle(Event.error(
null, "'" + helpSubject + "' is neither a command nor a build rule"));
return ExitCode.COMMAND_LINE_ERROR;
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index 1a0566b..38f913e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -38,6 +38,7 @@
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.util.AbruptExitException;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.build.lib.util.OsUtils;
@@ -177,13 +178,14 @@
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) { }
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) { }
@Override
- public ExitCode exec(final BlazeRuntime runtime, final OptionsProvider optionsProvider) {
- runtime.getReporter().switchToAnsiAllowingHandler();
+ public ExitCode exec(final CommandEnvironment env, final OptionsProvider optionsProvider) {
+ final BlazeRuntime runtime = env.getRuntime();
+ env.getReporter().switchToAnsiAllowingHandler();
Options infoOptions = optionsProvider.getOptions(Options.class);
- OutErr outErr = runtime.getReporter().getOutErr();
+ OutErr outErr = env.getReporter().getOutErr();
// Creating a BuildConfiguration is expensive and often unnecessary. Delay the creation until
// it is needed.
Supplier<BuildConfiguration> configurationSupplier = new Supplier<BuildConfiguration>() {
@@ -206,13 +208,13 @@
.getTargetConfigurations().get(0);
return configuration;
} catch (InvalidConfigurationException e) {
- runtime.getReporter().handle(Event.error(e.getMessage()));
+ env.getReporter().handle(Event.error(e.getMessage()));
throw new ExitCausingRuntimeException(ExitCode.COMMAND_LINE_ERROR);
} catch (AbruptExitException e) {
throw new ExitCausingRuntimeException("unknown error: " + e.getMessage(),
e.getExitCode());
} catch (InterruptedException e) {
- runtime.getReporter().handle(Event.error("interrupted"));
+ env.getReporter().handle(Event.error("interrupted"));
throw new ExitCausingRuntimeException(ExitCode.INTERRUPTED);
}
}
@@ -231,7 +233,7 @@
List<String> residue = optionsProvider.getResidue();
if (residue.size() > 1) {
- runtime.getReporter().handle(Event.error("at most one key may be specified"));
+ env.getReporter().handle(Event.error("at most one key may be specified"));
return ExitCode.COMMAND_LINE_ERROR;
}
@@ -241,14 +243,14 @@
if (items.containsKey(key)) {
value = items.get(key).get(configurationSupplier);
} else {
- runtime.getReporter().handle(Event.error("unknown key: '" + key + "'"));
+ env.getReporter().handle(Event.error("unknown key: '" + key + "'"));
return ExitCode.COMMAND_LINE_ERROR;
}
try {
outErr.getOutputStream().write(value);
outErr.getOutputStream().flush();
} catch (IOException e) {
- runtime.getReporter().handle(Event.error("Cannot write info block: " + e.getMessage()));
+ env.getReporter().handle(Event.error("Cannot write info block: " + e.getMessage()));
return ExitCode.ANALYSIS_FAILURE;
}
} else { // print them all
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/MobileInstallCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/MobileInstallCommand.java
index 13e2837..9701289 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/MobileInstallCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/MobileInstallCommand.java
@@ -16,12 +16,14 @@
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
import com.google.devtools.build.lib.buildtool.BuildRequest;
+import com.google.devtools.build.lib.buildtool.BuildTool;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.rules.android.WriteAdbArgsAction;
import com.google.devtools.build.lib.rules.android.WriteAdbArgsAction.StartType;
import com.google.devtools.build.lib.runtime.BlazeCommand;
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.util.AbruptExitException;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.common.options.Option;
@@ -65,11 +67,12 @@
}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
+ BlazeRuntime runtime = env.getRuntime();
Options mobileInstallOptions = options.getOptions(Options.class);
WriteAdbArgsAction.Options adbOptions = options.getOptions(WriteAdbArgsAction.Options.class);
if (adbOptions.start == StartType.WARM && !mobileInstallOptions.incremental) {
- runtime.getReporter().handle(Event.warn(
+ env.getReporter().handle(Event.warn(
"Warm start is enabled, but will have no effect on a non-incremental build"));
}
@@ -77,12 +80,12 @@
BuildRequest request = BuildRequest.create(
this.getClass().getAnnotation(Command.class).name(), options,
runtime.getStartupOptionsProvider(), targets,
- runtime.getReporter().getOutErr(), runtime.getCommandId(), runtime.getCommandStartTime());
- return runtime.getBuildTool().processRequest(request, null).getExitCondition();
+ env.getReporter().getOutErr(), runtime.getCommandId(), runtime.getCommandStartTime());
+ return new BuildTool(env).processRequest(request, null).getExitCondition();
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser)
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser)
throws AbruptExitException {
try {
String outputGroup =
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
index 0992aad..89d6bbb 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
@@ -33,6 +33,7 @@
import com.google.devtools.build.lib.runtime.BlazeCommand;
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.util.ExitCode;
import com.google.devtools.build.lib.util.StringUtil;
import com.google.devtools.build.lib.util.TimeUtilities;
@@ -138,10 +139,11 @@
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) {}
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) {}
@Override
- public ExitCode exec(final BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(final CommandEnvironment env, OptionsProvider options) {
+ final BlazeRuntime runtime = env.getRuntime();
ProfileOptions opts =
options.getOptions(ProfileOptions.class);
@@ -160,9 +162,9 @@
}
};
- PrintStream out = new PrintStream(runtime.getReporter().getOutErr().getOutputStream());
+ PrintStream out = new PrintStream(env.getReporter().getOutErr().getOutputStream());
try {
- runtime.getReporter().handle(Event.warn(
+ env.getReporter().handle(Event.warn(
null, "This information is intended for consumption by Blaze developers"
+ " only, and may change at any time. Script against it at your own risk"));
@@ -177,7 +179,7 @@
Path htmlFile =
profileFile.getParentDirectory().getChild(profileFile.getBaseName() + ".html");
- runtime.getReporter().handle(Event.info("Creating HTML output in " + htmlFile));
+ env.getReporter().handle(Event.info("Creating HTML output in " + htmlFile));
HtmlCreator.createHtml(
info,
@@ -189,7 +191,7 @@
createText(runtime, info, out, opts);
}
} catch (IOException e) {
- runtime.getReporter().handle(Event.error(
+ env.getReporter().handle(Event.error(
null, "Failed to process file " + name + ": " + e.getMessage()));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
index e3beaa4..63552b4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
@@ -18,6 +18,7 @@
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.runtime.BlazeCommand;
import com.google.devtools.build.lib.runtime.BlazeRuntime;
+import com.google.devtools.build.lib.runtime.CommandEnvironment;
import com.google.devtools.build.lib.runtime.CommonCommandOptions;
import com.google.devtools.build.lib.runtime.ProjectFile;
import com.google.devtools.build.lib.util.AbruptExitException;
@@ -44,8 +45,9 @@
* accordingly. If project files cannot be read or if they contain unparsable options, or if they
* are not enabled, then it throws an exception instead.
*/
- public static void handleProjectFiles(BlazeRuntime runtime, OptionsParser optionsParser,
+ public static void handleProjectFiles(CommandEnvironment env, OptionsParser optionsParser,
String command) throws AbruptExitException {
+ BlazeRuntime runtime = env.getRuntime();
List<String> targets = optionsParser.getResidue();
ProjectFile.Provider projectFileProvider = runtime.getProjectFileProvider();
if (projectFileProvider != null && !targets.isEmpty()
@@ -65,11 +67,11 @@
List<Path> packagePath = PathPackageLocator.create(
runtime.getOutputBase(),
optionsParser.getOptions(PackageCacheOptions.class).packagePath,
- runtime.getReporter(),
+ env.getReporter(),
runtime.getWorkspace(),
runtime.getWorkingDirectory()).getPathEntries();
ProjectFile projectFile = projectFileProvider.getProjectFile(packagePath, projectFilePath);
- runtime.getReporter().handle(Event.info("Using " + projectFile.getName()));
+ env.getReporter().handle(Event.info("Using " + projectFile.getName()));
try {
optionsParser.parse(
@@ -77,7 +79,7 @@
} catch (OptionsParsingException e) {
throw new AbruptExitException(e.getMessage(), ExitCode.COMMAND_LINE_ERROR);
}
- runtime.getEventBus().post(new GotProjectFileEvent(projectFile.getName()));
+ env.getEventBus().post(new GotProjectFileEvent(projectFile.getName()));
}
}
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 04e2b04..fe30b64 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
@@ -33,6 +33,7 @@
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.util.AbruptExitException;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.common.options.OptionsParser;
@@ -59,7 +60,7 @@
public final class QueryCommand implements BlazeCommand {
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) { }
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) { }
/**
* Exit codes:
@@ -70,7 +71,8 @@
* (only when --keep_going is in effect.)
*/
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
+ BlazeRuntime runtime = env.getRuntime();
QueryOptions queryOptions = options.getOptions(QueryOptions.class);
try {
@@ -78,15 +80,15 @@
options.getOptions(PackageCacheOptions.class),
runtime.getDefaultsPackageContent());
} catch (InterruptedException e) {
- runtime.getReporter().handle(Event.error("query interrupted"));
+ env.getReporter().handle(Event.error("query interrupted"));
return ExitCode.INTERRUPTED;
} catch (AbruptExitException e) {
- runtime.getReporter().handle(Event.error(null, "Unknown error: " + e.getMessage()));
+ env.getReporter().handle(Event.error(null, "Unknown error: " + e.getMessage()));
return e.getExitCode();
}
if (options.getResidue().isEmpty()) {
- runtime.getReporter().handle(Event.error(String.format(
+ env.getReporter().handle(Event.error(String.format(
"missing query expression. Type '%s help query' for syntax and help",
Constants.PRODUCT_NAME)));
return ExitCode.COMMAND_LINE_ERROR;
@@ -96,7 +98,7 @@
OutputFormatter formatter =
OutputFormatter.getFormatter(formatters, queryOptions.outputFormat);
if (formatter == null) {
- runtime.getReporter().handle(Event.error(
+ env.getReporter().handle(Event.error(
String.format("Invalid output format '%s'. Valid values are: %s",
queryOptions.outputFormat, OutputFormatter.formatterNames(formatters))));
return ExitCode.COMMAND_LINE_ERROR;
@@ -105,7 +107,7 @@
String query = Joiner.on(' ').join(options.getResidue());
Set<Setting> settings = queryOptions.toSettings();
- AbstractBlazeQueryEnvironment<Target> env = newQueryEnvironment(
+ AbstractBlazeQueryEnvironment<Target> queryEnv = newQueryEnvironment(
runtime,
queryOptions.keepGoing,
QueryOutputUtils.orderResults(queryOptions, formatter),
@@ -115,9 +117,9 @@
// 1. Parse query:
QueryExpression expr;
try {
- expr = QueryExpression.parse(query, env);
+ expr = QueryExpression.parse(query, queryEnv);
} catch (QueryException e) {
- runtime.getReporter().handle(Event.error(
+ env.getReporter().handle(Event.error(
null, "Error while parsing '" + query + "': " + e.getMessage()));
return ExitCode.COMMAND_LINE_ERROR;
}
@@ -125,35 +127,34 @@
// 2. Evaluate expression:
QueryEvalResult<Target> result;
try {
- result = env.evaluateQuery(expr);
+ result = queryEnv.evaluateQuery(expr);
} catch (QueryException | InterruptedException e) {
// Keep consistent with reportBuildFileError()
- runtime
- .getReporter()
+ env.getReporter()
// TODO(bazel-team): this is a kludge to fix a bug observed in the wild. We should make
// sure no null error messages ever get in.
.handle(Event.error(e.getMessage() == null ? e.toString() : e.getMessage()));
return ExitCode.ANALYSIS_FAILURE;
}
- runtime.getReporter().switchToAnsiAllowingHandler();
+ env.getReporter().switchToAnsiAllowingHandler();
// 3. Output results:
- PrintStream output = new PrintStream(runtime.getReporter().getOutErr().getOutputStream());
+ PrintStream output = new PrintStream(env.getReporter().getOutErr().getOutputStream());
try {
QueryOutputUtils.output(queryOptions, result, formatter, output,
queryOptions.aspectDeps.createResolver(
- runtime.getPackageManager(), runtime.getReporter()));
+ runtime.getPackageManager(), env.getReporter()));
} catch (ClosedByInterruptException | InterruptedException e) {
- runtime.getReporter().handle(Event.error("query interrupted"));
+ env.getReporter().handle(Event.error("query interrupted"));
return ExitCode.INTERRUPTED;
} catch (IOException e) {
- runtime.getReporter().handle(Event.error("I/O error: " + e.getMessage()));
+ env.getReporter().handle(Event.error("I/O error: " + e.getMessage()));
return ExitCode.LOCAL_ENVIRONMENTAL_ERROR;
} finally {
output.flush();
}
if (result.getResultSet().isEmpty()) {
- runtime.getReporter().handle(Event.info("Empty results"));
+ env.getReporter().handle(Event.info("Empty results"));
}
return result.getSuccess() ? ExitCode.SUCCESS : ExitCode.PARTIAL_ANALYSIS_FAILURE;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
index 16ed00a..5efe25e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
@@ -27,6 +27,7 @@
import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.buildtool.BuildRequest.BuildRequestOptions;
import com.google.devtools.build.lib.buildtool.BuildResult;
+import com.google.devtools.build.lib.buildtool.BuildTool;
import com.google.devtools.build.lib.buildtool.OutputDirectoryLinksUtils;
import com.google.devtools.build.lib.buildtool.TargetValidator;
import com.google.devtools.build.lib.events.Event;
@@ -42,6 +43,7 @@
import com.google.devtools.build.lib.runtime.BlazeCommand;
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.shell.AbnormalTerminationException;
import com.google.devtools.build.lib.shell.BadExitStatusException;
import com.google.devtools.build.lib.shell.CommandException;
@@ -109,35 +111,36 @@
private static final FileType RUNFILES_MANIFEST = FileType.of(".runfiles_manifest");
@VisibleForTesting // productionVisibility = Visibility.PRIVATE
- protected BuildResult processRequest(final BlazeRuntime runtime, BuildRequest request) {
- return runtime.getBuildTool().processRequest(request, new TargetValidator() {
+ protected BuildResult processRequest(final CommandEnvironment env, BuildRequest request) {
+ return new BuildTool(env).processRequest(request, new TargetValidator() {
@Override
public void validateTargets(Collection<Target> targets, boolean keepGoing)
throws LoadingFailedException {
- RunCommand.this.validateTargets(runtime.getReporter(), targets, keepGoing);
+ RunCommand.this.validateTargets(env.getReporter(), targets, keepGoing);
}
});
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) { }
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) { }
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
+ BlazeRuntime runtime = env.getRuntime();
RunOptions runOptions = options.getOptions(RunOptions.class);
// This list should look like: ["//executable:target", "arg1", "arg2"]
List<String> targetAndArgs = options.getResidue();
// The user must at the least specify an executable target.
if (targetAndArgs.isEmpty()) {
- runtime.getReporter().handle(Event.error("Must specify a target to run"));
+ env.getReporter().handle(Event.error("Must specify a target to run"));
return ExitCode.COMMAND_LINE_ERROR;
}
String targetString = targetAndArgs.get(0);
List<String> runTargetArgs = targetAndArgs.subList(1, targetAndArgs.size());
RunUnder runUnder = options.getOptions(BuildConfiguration.Options.class).runUnder;
- OutErr outErr = runtime.getReporter().getOutErr();
+ OutErr outErr = env.getReporter().getOutErr();
List<String> targets = (runUnder != null) && (runUnder.getLabel() != null)
? ImmutableList.of(targetString, runUnder.getLabel().toString())
: ImmutableList.of(targetString);
@@ -149,13 +152,13 @@
currentRunUnder = runUnder;
BuildResult result;
try {
- result = processRequest(runtime, request);
+ result = processRequest(env, request);
} finally {
currentRunUnder = null;
}
if (!result.getSuccess()) {
- runtime.getReporter().handle(Event.error("Build failed. Not running target"));
+ env.getReporter().handle(Event.error("Build failed. Not running target"));
return result.getExitCondition();
}
@@ -170,7 +173,7 @@
if (targetsBuilt != null) {
int maxTargets = runUnder != null && runUnder.getLabel() != null ? 2 : 1;
if (targetsBuilt.size() > maxTargets) {
- runtime.getReporter().handle(Event.error(SINGLE_TARGET_MESSAGE));
+ env.getReporter().handle(Event.error(SINGLE_TARGET_MESSAGE));
return ExitCode.COMMAND_LINE_ERROR;
}
for (ConfiguredTarget target : targetsBuilt) {
@@ -180,7 +183,7 @@
}
if (runUnder != null && target.getLabel().equals(runUnder.getLabel())) {
if (runUnderTarget != null) {
- runtime.getReporter().handle(Event.error(
+ env.getReporter().handle(Event.error(
null, "Can't identify the run_under target from multiple options?"));
return ExitCode.COMMAND_LINE_ERROR;
}
@@ -188,7 +191,7 @@
} else if (targetToRun == null) {
targetToRun = target;
} else {
- runtime.getReporter().handle(Event.error(SINGLE_TARGET_MESSAGE));
+ env.getReporter().handle(Event.error(SINGLE_TARGET_MESSAGE));
return ExitCode.COMMAND_LINE_ERROR;
}
}
@@ -198,7 +201,7 @@
targetToRun = runUnderTarget;
}
if (targetToRun == null) {
- runtime.getReporter().handle(Event.error(NO_TARGET_MESSAGE));
+ env.getReporter().handle(Event.error(NO_TARGET_MESSAGE));
return ExitCode.COMMAND_LINE_ERROR;
}
@@ -208,14 +211,14 @@
if (configuration == null) {
// The target may be an input file, which doesn't have a configuration. In that case, we
// choose any target configuration.
- configuration = runtime.getBuildTool().getView().getConfigurationCollection()
+ configuration = runtime.getView().getConfigurationCollection()
.getTargetConfigurations().get(0);
}
Path workingDir;
try {
workingDir = ensureRunfilesBuilt(runtime, targetToRun);
} catch (CommandException e) {
- runtime.getReporter().handle(Event.error("Error creating runfiles: " + e.getMessage()));
+ env.getReporter().handle(Event.error("Error creating runfiles: " + e.getMessage()));
return ExitCode.LOCAL_ENVIRONMENTAL_ERROR;
}
@@ -298,7 +301,7 @@
}
}
- runtime.getReporter().handle(Event.info(
+ env.getReporter().handle(Event.info(
null, "Running command line: " + ShellEscaper.escapeJoinAll(prettyCmdLine)));
com.google.devtools.build.lib.shell.Command command = new CommandBuilder()
@@ -307,7 +310,7 @@
try {
// Restore a raw EventHandler if it is registered. This allows for blaze run to produce the
// actual output of the command being run even if --color=no is specified.
- runtime.getReporter().switchToAnsiAllowingHandler();
+ env.getReporter().switchToAnsiAllowingHandler();
// The command API is a little strange in that the following statement
// will return normally only if the program exits with exit code 0.
@@ -322,13 +325,13 @@
String message = "Non-zero return code '"
+ e.getResult().getTerminationStatus().getExitCode()
+ "' from command: " + e.getMessage();
- runtime.getReporter().handle(Event.error(message));
+ env.getReporter().handle(Event.error(message));
return ExitCode.RUN_FAILURE;
} catch (AbnormalTerminationException e) {
// The process was likely terminated by a signal in this case.
return ExitCode.INTERRUPTED;
} catch (CommandException e) {
- runtime.getReporter().handle(Event.error("Error running program: " + e.getMessage()));
+ env.getReporter().handle(Event.error("Error running program: " + e.getMessage()));
return ExitCode.RUN_FAILURE;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java
index fe606e6..4e63e7e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java
@@ -15,8 +15,8 @@
import com.google.devtools.build.lib.runtime.BlazeCommand;
import com.google.devtools.build.lib.runtime.BlazeCommandDispatcher.ShutdownBlazeServerException;
-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.util.ExitCode;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;
@@ -47,12 +47,11 @@
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) {}
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) {}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options)
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options)
throws ShutdownBlazeServerException {
-
int limit = options.getOptions(Options.class).heapSizeLimit;
// Iff limit is non-zero, shut down the server if total memory exceeds the
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
index 962e0c0..9d9ca9d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
@@ -18,6 +18,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.buildtool.BuildResult;
+import com.google.devtools.build.lib.buildtool.BuildTool;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.exec.ExecutionOptions;
import com.google.devtools.build.lib.rules.test.TestStrategy;
@@ -27,6 +28,7 @@
import com.google.devtools.build.lib.runtime.BlazeCommandEventHandler;
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.TerminalTestResultNotifier;
import com.google.devtools.build.lib.runtime.TerminalTestResultNotifier.TestSummaryOptions;
import com.google.devtools.build.lib.runtime.TestResultAnalyzer;
@@ -63,15 +65,15 @@
}
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser)
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser)
throws AbruptExitException {
- ProjectFileSupport.handleProjectFiles(runtime, optionsParser, commandName());
+ ProjectFileSupport.handleProjectFiles(env, optionsParser, commandName());
TestOutputFormat testOutput = optionsParser.getOptions(ExecutionOptions.class).testOutput;
try {
if (testOutput == TestStrategy.TestOutputFormat.STREAMED) {
- runtime.getReporter().handle(Event.warn(
+ env.getReporter().handle(Event.warn(
"Streamed test output requested so all tests will be run locally, without sharding, " +
"one at a time"));
optionsParser.parse(OptionPriority.SOFTWARE_REQUIREMENT,
@@ -84,36 +86,37 @@
}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
TestResultAnalyzer resultAnalyzer = new TestResultAnalyzer(
- runtime.getExecRoot(),
+ env.getDirectories().getExecRoot(),
options.getOptions(TestSummaryOptions.class),
options.getOptions(ExecutionOptions.class),
- runtime.getEventBus());
+ env.getEventBus());
- printer = new AnsiTerminalPrinter(runtime.getReporter().getOutErr().getOutputStream(),
+ printer = new AnsiTerminalPrinter(env.getReporter().getOutErr().getOutputStream(),
options.getOptions(BlazeCommandEventHandler.Options.class).useColor());
// Initialize test handler.
AggregatingTestListener testListener = new AggregatingTestListener(
- resultAnalyzer, runtime.getEventBus(), runtime.getReporter());
+ resultAnalyzer, env.getEventBus(), env.getReporter());
- runtime.getEventBus().register(testListener);
- return doTest(runtime, options, testListener);
+ env.getEventBus().register(testListener);
+ return doTest(env, options, testListener);
}
- private ExitCode doTest(BlazeRuntime runtime,
+ private ExitCode doTest(CommandEnvironment env,
OptionsProvider options,
AggregatingTestListener testListener) {
+ BlazeRuntime runtime = env.getRuntime();
// Run simultaneous build and test.
List<String> targets = ProjectFileSupport.getTargets(runtime, options);
BuildRequest request = BuildRequest.create(
getClass().getAnnotation(Command.class).name(), options,
runtime.getStartupOptionsProvider(), targets,
- runtime.getReporter().getOutErr(), runtime.getCommandId(), runtime.getCommandStartTime());
+ env.getReporter().getOutErr(), runtime.getCommandId(), runtime.getCommandStartTime());
request.setRunTests();
- BuildResult buildResult = runtime.getBuildTool().processRequest(request, null);
+ BuildResult buildResult = new BuildTool(env).processRequest(request, null);
Collection<ConfiguredTarget> testTargets = buildResult.getTestTargets();
// TODO(bazel-team): don't handle isEmpty here or fix up a bunch of tests
@@ -121,13 +124,13 @@
// This can happen if there were errors in the target parsing or loading phase
// (original exitcode=BUILD_FAILURE) or if there weren't but --noanalyze was given
// (original exitcode=SUCCESS).
- runtime.getReporter().handle(Event.error("Couldn't start the build. Unable to run tests"));
+ env.getReporter().handle(Event.error("Couldn't start the build. Unable to run tests"));
return buildResult.getSuccess() ? ExitCode.PARSING_FAILURE : buildResult.getExitCondition();
}
// TODO(bazel-team): the check above shadows NO_TESTS_FOUND, but switching the conditions breaks
// more tests
if (testTargets.isEmpty()) {
- runtime.getReporter().handle(Event.error(
+ env.getReporter().handle(Event.error(
null, "No test targets were found, yet testing was requested"));
return buildResult.getSuccess() ? ExitCode.NO_TESTS_FOUND : buildResult.getExitCondition();
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java
index 2d7b9ae..9ac1bb3 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java
@@ -16,8 +16,8 @@
import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.runtime.BlazeCommand;
-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.util.ExitCode;
import com.google.devtools.common.options.OptionsParser;
import com.google.devtools.common.options.OptionsProvider;
@@ -34,16 +34,16 @@
shortDescription = "Prints version information for %{product}.")
public final class VersionCommand implements BlazeCommand {
@Override
- public void editOptions(BlazeRuntime runtime, OptionsParser optionsParser) {}
+ public void editOptions(CommandEnvironment env, OptionsParser optionsParser) {}
@Override
- public ExitCode exec(BlazeRuntime runtime, OptionsProvider options) {
+ public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
BlazeVersionInfo info = BlazeVersionInfo.instance();
if (info.getSummary() == null) {
- runtime.getReporter().handle(Event.error("Version information not available"));
+ env.getReporter().handle(Event.error("Version information not available"));
return ExitCode.COMMAND_LINE_ERROR;
}
- runtime.getReporter().getOutErr().printOutLn(info.getSummary());
+ env.getReporter().getOutErr().printOutLn(info.getSummary());
return ExitCode.SUCCESS;
}
}