diff options
author | tomlu <tomlu@google.com> | 2018-08-15 12:17:42 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-15 12:19:29 -0700 |
commit | fe1dd88fee41e3e4b7cb345ebbac9ee2d9bcf77c (patch) | |
tree | 1569af41ae6ed8b67485655b197e9f47cb387ea8 | |
parent | 3c82bfe03d578d521c957613239f49604d431946 (diff) |
Support tree artifacts in target complete.
RELNOTES: None
PiperOrigin-RevId: 208861642
5 files changed, 45 insertions, 33 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java index e48740b3a3..fb4f1edb37 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java @@ -55,6 +55,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Objects; import javax.annotation.Nullable; @@ -172,6 +173,35 @@ public class Artifact } } + /** Implementation of {@link ArtifactExpander} */ + public static class ArtifactExpanderImpl implements ArtifactExpander { + private final Map<Artifact, Collection<Artifact>> expandedInputs; + private final Map<Artifact, ImmutableList<FilesetOutputSymlink>> expandedFilesets; + + public ArtifactExpanderImpl( + Map<Artifact, Collection<Artifact>> expandedInputMiddlemen, + Map<Artifact, ImmutableList<FilesetOutputSymlink>> expandedFilesets) { + this.expandedInputs = expandedInputMiddlemen; + this.expandedFilesets = expandedFilesets; + } + + @Override + public void expand(Artifact artifact, Collection<? super Artifact> output) { + Preconditions.checkState( + artifact.isMiddlemanArtifact() || artifact.isTreeArtifact(), artifact); + Collection<Artifact> result = expandedInputs.get(artifact); + if (result != null) { + output.addAll(result); + } + } + + @Override + public ImmutableList<FilesetOutputSymlink> getFileset(Artifact artifact) { + Preconditions.checkState(artifact.isFileset()); + return Preconditions.checkNotNull(expandedFilesets.get(artifact)); + } + } + public static final ImmutableList<Artifact> NO_ARTIFACTS = ImmutableList.of(); /** A Predicate that evaluates to true if the Artifact is not a middleman artifact. */ diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java index 237915aeb0..cce2a9257d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java @@ -54,7 +54,8 @@ public final class CompletionFunction<TValue extends SkyValue, TResult extends S implements SkyFunction { interface PathResolverFactory { - ArtifactPathResolver createPathResolverForArtifactValues(ActionInputMap actionInputMap); + ArtifactPathResolver createPathResolverForArtifactValues( + ActionInputMap actionInputMap, Map<Artifact, Collection<Artifact>> expandedArtifacts); boolean shouldCreatePathResolverForArtifactValues(); } @@ -401,7 +402,7 @@ public final class CompletionFunction<TValue extends SkyValue, TResult extends S ArtifactPathResolver pathResolver = createPathResolver - ? pathResolverFactory.createPathResolverForArtifactValues(inputMap) + ? pathResolverFactory.createPathResolverForArtifactValues(inputMap, expandedArtifacts) : ArtifactPathResolver.IDENTITY; ExtendedEventHandler.Postable postable = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java index fa5b35a55e..56154e4738 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java @@ -48,7 +48,7 @@ import com.google.devtools.build.lib.actions.ActionStatusMessage; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.AlreadyReportedActionExecutionException; import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander; +import com.google.devtools.build.lib.actions.Artifact.ArtifactExpanderImpl; import com.google.devtools.build.lib.actions.Artifact.OwnerlessArtifactWrapper; import com.google.devtools.build.lib.actions.ArtifactPathResolver; import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; @@ -491,33 +491,6 @@ public final class SkyframeActionExecutor { } } - private static class ArtifactExpanderImpl implements ArtifactExpander { - private final Map<Artifact, Collection<Artifact>> expandedInputs; - private final Map<Artifact, ImmutableList<FilesetOutputSymlink>> expandedFilesets; - - private ArtifactExpanderImpl(Map<Artifact, Collection<Artifact>> expandedInputMiddlemen, - Map<Artifact, ImmutableList<FilesetOutputSymlink>> expandedFilesets) { - this.expandedInputs = expandedInputMiddlemen; - this.expandedFilesets = expandedFilesets; - } - - @Override - public void expand(Artifact artifact, Collection<? super Artifact> output) { - Preconditions.checkState(artifact.isMiddlemanArtifact() || artifact.isTreeArtifact(), - artifact); - Collection<Artifact> result = expandedInputs.get(artifact); - if (result != null) { - output.addAll(result); - } - } - - @Override - public ImmutableList<FilesetOutputSymlink> getFileset(Artifact artifact) { - Preconditions.checkState(artifact.isFileset()); - return Preconditions.checkNotNull(expandedFilesets.get(artifact)); - } - } - /** * Returns an ActionExecutionContext suitable for executing a particular action. The caller should * pass the returned context to {@link #executeAction}, and any other method that needs to execute diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 028d4c8ee0..892acde29c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -332,10 +332,15 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { } @Override - public ArtifactPathResolver createPathResolverForArtifactValues(ActionInputMap actionInputMap) { + public ArtifactPathResolver createPathResolverForArtifactValues( + ActionInputMap actionInputMap, Map<Artifact, Collection<Artifact>> expandedArtifacts) { Preconditions.checkState(shouldCreatePathResolverForArtifactValues()); return outputService.createPathResolverForArtifactValues( - directories.getExecRoot().asFragment(), fileSystem, getPathEntries(), actionInputMap); + directories.getExecRoot().asFragment(), + fileSystem, + getPathEntries(), + actionInputMap, + expandedArtifacts); } } diff --git a/src/main/java/com/google/devtools/build/lib/vfs/OutputService.java b/src/main/java/com/google/devtools/build/lib/vfs/OutputService.java index 40753990ef..0f87039c57 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/OutputService.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/OutputService.java @@ -30,6 +30,8 @@ import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.util.AbruptExitException; import com.google.devtools.build.skyframe.SkyFunction.Environment; import java.io.IOException; +import java.util.Collection; +import java.util.Map; import java.util.UUID; import javax.annotation.Nullable; @@ -153,7 +155,8 @@ public interface OutputService { PathFragment execRoot, FileSystem fileSystem, ImmutableList<Root> pathEntries, - ActionInputMap actionInputMap) { + ActionInputMap actionInputMap, + Map<Artifact, Collection<Artifact>> expandedArtifacts) { throw new IllegalStateException("Path resolver not supported by this class"); } } |