From fe1dd88fee41e3e4b7cb345ebbac9ee2d9bcf77c Mon Sep 17 00:00:00 2001 From: tomlu Date: Wed, 15 Aug 2018 12:17:42 -0700 Subject: Support tree artifacts in target complete. RELNOTES: None PiperOrigin-RevId: 208861642 --- .../devtools/build/lib/actions/Artifact.java | 30 ++++++++++++++++++++++ .../build/lib/skyframe/CompletionFunction.java | 5 ++-- .../build/lib/skyframe/SkyframeActionExecutor.java | 29 +-------------------- .../build/lib/skyframe/SkyframeExecutor.java | 9 +++++-- .../devtools/build/lib/vfs/OutputService.java | 5 +++- 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> expandedInputs; + private final Map> expandedFilesets; + + public ArtifactExpanderImpl( + Map> expandedInputMiddlemen, + Map> expandedFilesets) { + this.expandedInputs = expandedInputMiddlemen; + this.expandedFilesets = expandedFilesets; + } + + @Override + public void expand(Artifact artifact, Collection output) { + Preconditions.checkState( + artifact.isMiddlemanArtifact() || artifact.isTreeArtifact(), artifact); + Collection result = expandedInputs.get(artifact); + if (result != null) { + output.addAll(result); + } + } + + @Override + public ImmutableList getFileset(Artifact artifact) { + Preconditions.checkState(artifact.isFileset()); + return Preconditions.checkNotNull(expandedFilesets.get(artifact)); + } + } + public static final ImmutableList 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> expandedArtifacts); boolean shouldCreatePathResolverForArtifactValues(); } @@ -401,7 +402,7 @@ public final class CompletionFunction> expandedInputs; - private final Map> expandedFilesets; - - private ArtifactExpanderImpl(Map> expandedInputMiddlemen, - Map> expandedFilesets) { - this.expandedInputs = expandedInputMiddlemen; - this.expandedFilesets = expandedFilesets; - } - - @Override - public void expand(Artifact artifact, Collection output) { - Preconditions.checkState(artifact.isMiddlemanArtifact() || artifact.isTreeArtifact(), - artifact); - Collection result = expandedInputs.get(artifact); - if (result != null) { - output.addAll(result); - } - } - - @Override - public ImmutableList 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> 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 pathEntries, - ActionInputMap actionInputMap) { + ActionInputMap actionInputMap, + Map> expandedArtifacts) { throw new IllegalStateException("Path resolver not supported by this class"); } } -- cgit v1.2.3