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/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 9c18133..47f0558 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -24,7 +24,6 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Ordering;
 import com.google.common.collect.Table;
-import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionCacheChecker;
@@ -85,6 +84,7 @@
 import com.google.devtools.build.lib.rules.test.TestActionContext;
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.BlazeRuntime;
+import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.skyframe.AspectValue;
 import com.google.devtools.build.lib.skyframe.Builder;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
@@ -115,8 +115,6 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.annotation.Nullable;
-
 /**
  * This class manages the execution phase. The entry point is {@link #executeBuild}.
  *
@@ -174,6 +172,7 @@
 
   static final Logger LOG = Logger.getLogger(ExecutionTool.class.getName());
 
+  private final CommandEnvironment env;
   private final BlazeRuntime runtime;
   private final BuildRequest request;
   private BlazeExecutor executor;
@@ -184,28 +183,9 @@
       new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
   private List<ActionContext> strategies = new ArrayList<>();
 
-  private ImmutableList<ActionContextConsumer> getActionContextConsumersFromModules(
-      ActionContextConsumer... extraConsumers) {
-    ImmutableList.Builder<ActionContextConsumer> builder = ImmutableList.builder();
-    for (BlazeModule module : runtime.getBlazeModules()) {
-      builder.addAll(module.getActionContextConsumers());
-    }
-    builder.add(extraConsumers);
-    return builder.build();
-  }
-
-  private ImmutableList<ActionContextProvider> getActionContextProvidersFromModules(
-      ActionContextProvider... extraProviders) {
-    ImmutableList.Builder<ActionContextProvider> builder = ImmutableList.builder();
-    for (BlazeModule module : runtime.getBlazeModules()) {
-      builder.addAll(module.getActionContextProviders());
-    }
-    builder.add(extraProviders);
-    return builder.build();
-  }
-
-  ExecutionTool(final BlazeRuntime runtime, BuildRequest request) throws ExecutorInitException {
-    this.runtime = runtime;
+  ExecutionTool(CommandEnvironment env, BuildRequest request) throws ExecutorInitException {
+    this.env = env;
+    this.runtime = env.getRuntime();
     this.request = request;
 
     // Create tools before getting the strategies from the modules as some of them need tools to
@@ -214,14 +194,16 @@
 
     this.actionContextProviders =
         getActionContextProvidersFromModules(
+            runtime,
             new FilesetActionContextImpl.Provider(
-                runtime.getReporter(), runtime.getWorkspaceName()),
+                env.getReporter(), runtime.getWorkspaceName()),
             new SimpleActionContextProvider(
                 new SymlinkTreeStrategy(runtime.getOutputService(), runtime.getBinTools())));
     StrategyConverter strategyConverter = new StrategyConverter(actionContextProviders);
 
     ImmutableList<ActionContextConsumer> actionContextConsumers =
         getActionContextConsumersFromModules(
+            runtime,
             // TODO(philwo) - the ExecutionTool should not add arbitrary dependencies on its own,
             // instead these dependencies should be added to the ActionContextConsumer of the module
             // that actually depends on them.
@@ -284,6 +266,26 @@
     }
   }
 
+  private static ImmutableList<ActionContextConsumer> getActionContextConsumersFromModules(
+      BlazeRuntime runtime, ActionContextConsumer... extraConsumers) {
+    ImmutableList.Builder<ActionContextConsumer> builder = ImmutableList.builder();
+    for (BlazeModule module : runtime.getBlazeModules()) {
+      builder.addAll(module.getActionContextConsumers());
+    }
+    builder.add(extraConsumers);
+    return builder.build();
+  }
+
+  private static ImmutableList<ActionContextProvider> getActionContextProvidersFromModules(
+      BlazeRuntime runtime, ActionContextProvider... extraProviders) {
+    ImmutableList.Builder<ActionContextProvider> builder = ImmutableList.builder();
+    for (BlazeModule module : runtime.getBlazeModules()) {
+      builder.addAll(module.getActionContextProviders());
+    }
+    builder.add(extraProviders);
+    return builder.build();
+  }
+
   private static ExecutorInitException makeExceptionForInvalidStrategyValue(String value,
       String strategy, String validValues) {
     return new ExecutorInitException(String.format(
@@ -307,7 +309,7 @@
         runtime.getDirectories().getExecRoot(),
         runtime.getDirectories().getOutputPath(),
         getReporter(),
-        getEventBus(),
+        env.getEventBus(),
         runtime.getClock(),
         request,
         request.getOptions(ExecutionOptions.class).verboseFailures,
@@ -339,7 +341,7 @@
    * creation
    */
   void executeBuild(UUID buildId, AnalysisResult analysisResult,
-      BuildResult buildResult, @Nullable SkyframeExecutor skyframeExecutor,
+      BuildResult buildResult,
       BuildConfigurationCollection configurations,
       ImmutableMap<PathFragment, Path> packageRoots)
       throws BuildFailedException, InterruptedException, TestExecException, AbruptExitException {
@@ -375,6 +377,7 @@
     }
 
     ActionCache actionCache = getActionCache();
+    SkyframeExecutor skyframeExecutor = runtime.getSkyframeExecutor();
     Builder builder = createBuilder(request, executor, actionCache, skyframeExecutor);
 
     //
@@ -383,7 +386,7 @@
     //
 
     Collection<ConfiguredTarget> configuredTargets = buildResult.getActualTargets();
-    getEventBus().post(new ExecutionStartingEvent(configuredTargets));
+    env.getEventBus().post(new ExecutionStartingEvent(configuredTargets));
 
     getReporter().handle(Event.progress("Building..."));
 
@@ -457,7 +460,7 @@
         getReporter().handle(Event.progress("Building complete."));
       }
 
-      runtime.getEventBus().post(new ExecutionFinishedEvent(ImmutableMap.<String, Long> of(), 0L,
+      env.getEventBus().post(new ExecutionFinishedEvent(ImmutableMap.<String, Long> of(), 0L,
           skyframeExecutor.getOutputDirtyFilesAndClear(),
           skyframeExecutor.getModifiedFilesDuringPreviousBuildAndClear()));
 
@@ -638,7 +641,7 @@
         successfulTargets.add(target);
       }
     }
-    getEventBus().post(
+    env.getEventBus().post(
         new ExecutionPhaseCompleteEvent(timer.stop().elapsed(TimeUnit.MILLISECONDS)));
     result.setSuccessfulTargets(successfulTargets);
   }
@@ -882,7 +885,7 @@
     } finally {
       actionCacheSaveTime = p.completeAndGetElapsedTimeNanos();
     }
-    runtime.getEventBus().post(new CachesSavedEvent(
+    env.getEventBus().post(new CachesSavedEvent(
         actionCacheSaveTime, actionCacheSizeInBytes));
   }
 
@@ -906,11 +909,7 @@
   }
 
   private Reporter getReporter() {
-    return runtime.getReporter();
-  }
-
-  private EventBus getEventBus() {
-    return runtime.getEventBus();
+    return env.getReporter();
   }
 
   private BuildView getView() {