In `SymlinkAction`, use `SymlinkToSourceFileArtifactValue` for the metadata of the symlink when it points to a source artifact.

Preserves the target `SourceArtifact` in the metadata.

PiperOrigin-RevId: 691259060
Change-Id: I8cdb419f9ef68ffcc11a00a195bbbd244677f3d5
diff --git a/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java b/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java
index 24a6c84..482f8eb 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java
@@ -514,6 +514,9 @@
 
     @Override
     protected boolean couldBeModifiedByMetadata(FileArtifactValue o) {
+      if (o instanceof SymlinkToSourceFileArtifactValue symlinkToSource) {
+        o = symlinkToSource.sourceFileMetadata; // "Dereference" the symlink.
+      }
       if (!(o instanceof RegularFileArtifactValue lastKnown)) {
         return true;
       }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
index 389f60b..4b88125 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
@@ -26,8 +26,10 @@
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.ActionResult;
 import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.Artifact.SourceArtifact;
 import com.google.devtools.build.lib.actions.ArtifactExpander;
 import com.google.devtools.build.lib.actions.FileArtifactValue;
+import com.google.devtools.build.lib.actions.FileArtifactValue.SymlinkToSourceFileArtifactValue;
 import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -201,11 +203,11 @@
       throws ActionExecutionException, InterruptedException {
     maybeVerifyTargetIsExecutable(actionExecutionContext);
 
-    Path srcPath;
+    Path targetPath;
     if (inputPath == null) {
-      srcPath = actionExecutionContext.getInputPath(getPrimaryInput());
+      targetPath = actionExecutionContext.getInputPath(getPrimaryInput());
     } else {
-      srcPath = actionExecutionContext.getExecRoot().getRelative(inputPath);
+      targetPath = actionExecutionContext.getExecRoot().getRelative(inputPath);
     }
 
     Path outputPath = getOutputPath(actionExecutionContext);
@@ -217,7 +219,7 @@
       // small amount of overhead.
       outputPath.delete();
 
-      outputPath.createSymbolicLink(srcPath);
+      outputPath.createSymbolicLink(targetPath);
     } catch (IOException e) {
       String message =
           String.format(
@@ -362,7 +364,12 @@
       return;
     }
     if (metadata != null) {
-      ctx.getOutputMetadataStore().injectFile(getPrimaryOutput(), metadata);
+      ctx.getOutputMetadataStore()
+          .injectFile(
+              getPrimaryOutput(),
+              primaryInput instanceof SourceArtifact sourceArtifact
+                  ? SymlinkToSourceFileArtifactValue.toSourceArtifact(sourceArtifact, metadata)
+                  : metadata);
     }
   }