RELNOTES: Add ExecutionInfo to aquery output for ExecutionInfoSpecifier actions.

ExecutionInfo is a significant, although typically empty, part of the cache key for ExecutionInfoSpecifier actions.

This CL will support integration tests for flags which modify execution info.

PiperOrigin-RevId: 210394235
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
index 23be8bd..2f8772d 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.actions.ActionKeyContext;
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
+import com.google.devtools.build.lib.actions.ExecutionInfoSpecifier;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
@@ -32,10 +33,12 @@
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.util.CommandDescriptionForm;
 import com.google.devtools.build.lib.util.CommandFailureUtils;
+import com.google.devtools.build.lib.util.ShellEscaper;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /** Output callback for aquery, prints human readable output. */
@@ -148,6 +151,23 @@
           .append("\n");
     }
 
+    if (action instanceof ExecutionInfoSpecifier) {
+      ExecutionInfoSpecifier executionInfoSpecifier = (ExecutionInfoSpecifier) action;
+      stringBuilder
+          .append("  ExecutionInfo: {")
+          .append(
+              executionInfoSpecifier.getExecutionInfo().entrySet().stream()
+                  .sorted(Map.Entry.comparingByKey())
+                  .map(
+                      e ->
+                          String.format(
+                              "%s: %s",
+                              ShellEscaper.escapeString(e.getKey()),
+                              ShellEscaper.escapeString(e.getValue())))
+                  .collect(Collectors.joining(", ")))
+          .append("}\n");
+    }
+
     stringBuilder.append('\n');
 
     printStream.write(stringBuilder.toString().getBytes(UTF_8));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
index 5ade7a9..3c966b2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
+import com.google.devtools.build.lib.actions.ExecutionInfoSpecifier;
 import com.google.devtools.build.lib.analysis.AnalysisProtos;
 import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
@@ -125,6 +126,16 @@
       }
     }
 
+    if (action instanceof ExecutionInfoSpecifier) {
+      ExecutionInfoSpecifier executionInfoSpecifier = (ExecutionInfoSpecifier) action;
+      for (Map.Entry<String, String> info : executionInfoSpecifier.getExecutionInfo().entrySet()) {
+        actionBuilder.addExecutionInfo(
+            AnalysisProtos.KeyValuePair.newBuilder()
+                .setKey(info.getKey())
+                .setValue(info.getValue()));
+      }
+    }
+
     ActionOwner actionOwner = action.getOwner();
     if (actionOwner != null) {
       BuildEvent event = actionOwner.getConfiguration();
diff --git a/src/main/protobuf/analysis.proto b/src/main/protobuf/analysis.proto
index 017df32..4884eb5 100644
--- a/src/main/protobuf/analysis.proto
+++ b/src/main/protobuf/analysis.proto
@@ -84,6 +84,11 @@
 
   // True iff the action does input discovery during execution.
   bool discovers_inputs = 10;
+
+  // Execution info for the action.  Remote execution services may use this
+  // information to modify the execution environment, but actions will
+  // generally not be aware of it.
+  repeated KeyValuePair execution_info = 11;
 }
 
 // Represents a single target (without configuration information) that is