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);
}
}