Implement SourceManifestAction.describeKey to show better action information.

This makes it easier to debug action conflicts because the error message
shows what inputs went into computing the key for the conflicting actions.

PiperOrigin-RevId: 448005997
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index d27d12a..e0e5ac3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -1144,4 +1144,37 @@
       fp.addString(name);
     }
   }
+  /** Describes the inputs {@link fingerprint} uses to aid describeKey() descriptions. */
+  public String describeFingerprint() {
+    StringBuilder sb = new StringBuilder();
+    sb.append(String.format("legacyExternalRunfiles: %s\n", legacyExternalRunfiles));
+    sb.append(String.format("suffix: %s\n", suffix));
+
+    var symlinks = getSymlinksAsMap(null);
+    sb.append(String.format("symlinksSize: %s\n", symlinks.size()));
+    for (var symlink : symlinks.entrySet()) {
+      sb.append(
+          String.format(
+              "symlink: '%s' to '%s'\n", symlink.getKey(), symlink.getValue().getExecPath()));
+    }
+
+    var rootSymlinks = getRootSymlinksAsMap(null);
+    sb.append(String.format("rootSymlinksSize: %s\n", rootSymlinks.size()));
+    for (var symlink : rootSymlinks.entrySet()) {
+      sb.append(
+          String.format(
+              "rootSymlink: '%s' to '%s'\n", symlink.getKey(), symlink.getValue().getExecPath()));
+    }
+
+    for (Artifact artifact : artifacts.toList()) {
+      sb.append(
+          String.format(
+              "artifact: '%s' '%s'\n", artifact.getRunfilesPath(), artifact.getExecPath()));
+    }
+
+    for (String name : getEmptyFilenames().toList()) {
+      sb.append(String.format("emptyFilename: '%s'\n", name));
+    }
+    return sb.toString();
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/SourceManifestAction.java b/src/main/java/com/google/devtools/build/lib/analysis/SourceManifestAction.java
index f5c0984..f1ac7e2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/SourceManifestAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/SourceManifestAction.java
@@ -188,6 +188,13 @@
     runfiles.fingerprint(fp);
   }
 
+  @Override
+  public String describeKey() {
+    return String.format(
+        "GUID: %s\nremotableSourceManifestActions: %s\nrunfiles: %s\n",
+        GUID, remotableSourceManifestActions, runfiles.describeFingerprint());
+  }
+
   /** Supported manifest writing strategies. */
   public enum ManifestType implements ManifestWriter {