Allow configuring writing of command.log

Sometimes, especially in the case of a lot of output, one may not want to write
everything twice.

--
MOS_MIGRATED_REVID=133388416
diff --git a/src/main/cpp/blaze.cc b/src/main/cpp/blaze.cc
index e57efe8..493d367 100644
--- a/src/main/cpp/blaze.cc
+++ b/src/main/cpp/blaze.cc
@@ -517,6 +517,10 @@
   result.push_back("--experimental_oom_more_eagerly_threshold=" +
                    ToString(globals->options->oom_more_eagerly_threshold));
 
+  if (!globals->options->write_command_log) {
+    result.push_back("--nowrite_command_log");
+  }
+
   if (globals->options->watchfs) {
     result.push_back("--watchfs");
   }
diff --git a/src/main/cpp/startup_options.cc b/src/main/cpp/startup_options.cc
index 5d3e9f4..09b8eab 100644
--- a/src/main/cpp/startup_options.cc
+++ b/src/main/cpp/startup_options.cc
@@ -73,6 +73,7 @@
   oom_more_eagerly_threshold = 100;
   command_port = 0;
   oom_more_eagerly = false;
+  write_command_log = true;
   watchfs = false;
   invocation_policy = NULL;
 }
@@ -215,6 +216,12 @@
       return blaze_exit_code::BAD_ARGV;
     }
     option_sources["experimental_oom_more_eagerly_threshold"] = rcfile;
+  } else if (GetNullaryOption(arg, "--write_command_log")) {
+    write_command_log = true;
+    option_sources["write_command_log"] = rcfile;
+  } else if (GetNullaryOption(arg, "--nowrite_command_log")) {
+    write_command_log = false;
+    option_sources["write_command_log"] = rcfile;
   } else if (GetNullaryOption(arg, "--watchfs")) {
     watchfs = true;
     option_sources["watchfs"] = rcfile;
diff --git a/src/main/cpp/startup_options.h b/src/main/cpp/startup_options.h
index cc77f2e..523523a 100644
--- a/src/main/cpp/startup_options.h
+++ b/src/main/cpp/startup_options.h
@@ -166,6 +166,8 @@
 
   int oom_more_eagerly_threshold;
 
+  bool write_command_log;
+
   // If true, Blaze will listen to OS-level file change notifications.
   bool watchfs;
 
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 3ab483a..2e363c3 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
@@ -368,18 +368,20 @@
       return exitCausingException.getExitCode().getNumericExitCode();
     }
 
-    try {
-      Path commandLog = getCommandLogPath(env.getOutputBase());
+    if (env.getRuntime().writeCommandLog()) {
+      try {
+        Path commandLog = getCommandLogPath(env.getOutputBase());
 
-      // Unlink old command log from previous build, if present, so scripts
-      // reading it don't conflate it with the command log we're about to write.
-      commandLog.delete();
+        // Unlink old command log from previous build, if present, so scripts
+        // reading it don't conflate it with the command log we're about to write.
+        commandLog.delete();
 
-      logOutputStream = commandLog.getOutputStream();
-      outErr = tee(outErr, OutErr.create(logOutputStream, logOutputStream));
-    } catch (IOException ioException) {
-      LoggingUtil.logToRemote(
-          Level.WARNING, "Unable to delete or open command.log", ioException);
+        logOutputStream = commandLog.getOutputStream();
+        outErr = tee(outErr, OutErr.create(logOutputStream, logOutputStream));
+      } catch (IOException ioException) {
+        LoggingUtil.logToRemote(
+            Level.WARNING, "Unable to delete or open command.log", ioException);
+      }
     }
 
     ExitCode result = checkCwdInWorkspace(env, commandAnnotation, commandName, outErr);
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 597d4d0..2b64b6e 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
@@ -290,6 +290,10 @@
     return getWorkspace().getDirectories().getOutputBase().getChild("server");
   }
 
+  public boolean writeCommandLog() {
+    return startupOptionsProvider.getOptions(BlazeServerStartupOptions.class).writeCommandLog;
+  }
+
   /**
    * Returns the {@link QueryEnvironmentFactory} that should be used to create a
    * {@link AbstractBlazeQueryEnvironment}, whenever one is needed.
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java
index ee5d58a..75c4dee 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java
@@ -269,4 +269,10 @@
       category = "server startup",
       help = "If true, Blaze runs as Exoblaze")
   public boolean exoblaze;
+
+  @Option(name = "write_command_log",
+      defaultValue = "true",
+      category = "undocumented",
+      help = "Whether or not to write the command.log file")
+  public boolean writeCommandLog;
 }