aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2018-08-15 12:17:42 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-08-15 12:19:29 -0700
commitfe1dd88fee41e3e4b7cb345ebbac9ee2d9bcf77c (patch)
tree1569af41ae6ed8b67485655b197e9f47cb387ea8
parent3c82bfe03d578d521c957613239f49604d431946 (diff)
Support tree artifacts in target complete.
RELNOTES: None PiperOrigin-RevId: 208861642
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/Artifact.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/OutputService.java5
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");
}
}