Implement --remote_force_print_messages

Adds a flag for always printing messages returned by remotely executed
actions.

Closes #15557.

PiperOrigin-RevId: 455079196
Change-Id: Iae8f150c7b28b881861ae99191dedbce50540153
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java
index 01c01ae..684b419 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java
@@ -61,6 +61,7 @@
 import com.google.devtools.build.lib.remote.common.BulkTransferException;
 import com.google.devtools.build.lib.remote.common.OperationObserver;
 import com.google.devtools.build.lib.remote.options.RemoteOptions;
+import com.google.devtools.build.lib.remote.options.RemoteOptions.ExecutionMessagePrintMode;
 import com.google.devtools.build.lib.remote.util.Utils;
 import com.google.devtools.build.lib.remote.util.Utils.InMemoryOutput;
 import com.google.devtools.build.lib.sandbox.SandboxHelpers;
@@ -274,7 +275,17 @@
 
             FileOutErr outErr = context.getFileOutErr();
             String message = result.getMessage();
-            if (!result.success() && !message.isEmpty()) {
+            boolean printMessage =
+                ((!result.success()
+                            && remoteOptions.remotePrintExecutionMessages
+                                == ExecutionMessagePrintMode.FAILURE)
+                        || (result.success()
+                            && remoteOptions.remotePrintExecutionMessages
+                                == ExecutionMessagePrintMode.SUCCESS)
+                        || remoteOptions.remotePrintExecutionMessages
+                            == ExecutionMessagePrintMode.ALL)
+                    && !message.isEmpty();
+            if (printMessage) {
               outErr.printErr(message + "\n");
             }
 
diff --git a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
index cf5621b..507a221 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
@@ -574,6 +574,19 @@
       help = "Maximum number of open files allowed during BEP artifact upload.")
   public int maximumOpenFiles;
 
+  @Option(
+      name = "remote_print_execution_messages",
+      defaultValue = "failure",
+      converter = ExecutionMessagePrintMode.Converter.class,
+      category = "remote",
+      documentationCategory = OptionDocumentationCategory.LOGGING,
+      effectTags = {OptionEffectTag.TERMINAL_OUTPUT},
+      help =
+          "Choose when to print remote execution messages. Valid values are `failure`, "
+              + "to print only on failures, `success` to print only on successes and "
+              + "`all` to print always.")
+  public ExecutionMessagePrintMode remotePrintExecutionMessages;
+
   // The below options are not configurable by users, only tests.
   // This is part of the effort to reduce the overall number of flags.
 
@@ -643,4 +656,18 @@
         .setRemoteExecution(RemoteExecution.newBuilder().setCode(detailedCode))
         .build();
   }
+
+  /** An enum for specifying different modes for printing remote execution messages. */
+  public enum ExecutionMessagePrintMode {
+    FAILURE, // Print execution messages only on failure
+    SUCCESS, // Print execution messages only on success
+    ALL; // Print execution messages always
+
+    /** Converts to {@link ExecutionMessagePrintMode}. */
+    public static class Converter extends EnumConverter<ExecutionMessagePrintMode> {
+      public Converter() {
+        super(ExecutionMessagePrintMode.class, "execution message print mode");
+      }
+    }
+  }
 }