diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java | 61 |
1 files changed, 54 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java index 971c003d4a..1427e89799 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java @@ -16,8 +16,12 @@ package com.google.devtools.build.lib.analysis; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.File; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.OutputGroup; import com.google.devtools.build.lib.buildeventstream.BuildEventWithOrderConstraint; import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent; import com.google.devtools.build.lib.buildeventstream.PathConverter; @@ -26,7 +30,9 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.rules.test.TestProvider; +import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.skyframe.SkyValue; import java.util.Collection; @@ -37,10 +43,14 @@ public final class TargetCompleteEvent implements SkyValue, BuildEventWithOrderC private final ConfiguredTarget target; private final NestedSet<Cause> rootCauses; private final Collection<BuildEventId> postedAfter; + private final Iterable<ArtifactsInOutputGroup> outputs; private final boolean isTest; private TargetCompleteEvent( - ConfiguredTarget target, NestedSet<Cause> rootCauses, boolean isTest) { + ConfiguredTarget target, + NestedSet<Cause> rootCauses, + Iterable<ArtifactsInOutputGroup> outputs, + boolean isTest) { this.target = target; this.rootCauses = (rootCauses == null) ? NestedSetBuilder.<Cause>emptySet(Order.STABLE_ORDER) : rootCauses; @@ -50,17 +60,19 @@ public final class TargetCompleteEvent implements SkyValue, BuildEventWithOrderC postedAfterBuilder.add(BuildEventId.fromCause(cause)); } this.postedAfter = postedAfterBuilder.build(); + this.outputs = outputs; this.isTest = isTest; } /** Construct a successful target completion event. */ - public static TargetCompleteEvent createSuccessfulTarget(ConfiguredTarget ct) { - return new TargetCompleteEvent(ct, null, false); + public static TargetCompleteEvent createSuccessfulTarget( + ConfiguredTarget ct, NestedSet<ArtifactsInOutputGroup> outputs) { + return new TargetCompleteEvent(ct, null, outputs, false); } /** Construct a successful target completion event for a target that will be tested. */ public static TargetCompleteEvent createSuccessfulTestTarget(ConfiguredTarget ct) { - return new TargetCompleteEvent(ct, null, true); + return new TargetCompleteEvent(ct, null, ImmutableList.<ArtifactsInOutputGroup>of(), true); } @@ -69,7 +81,8 @@ public final class TargetCompleteEvent implements SkyValue, BuildEventWithOrderC */ public static TargetCompleteEvent createFailed(ConfiguredTarget ct, NestedSet<Cause> rootCauses) { Preconditions.checkArgument(!Iterables.isEmpty(rootCauses)); - return new TargetCompleteEvent(ct, rootCauses, false); + return new TargetCompleteEvent( + ct, rootCauses, ImmutableList.<ArtifactsInOutputGroup>of(), false); } /** @@ -120,8 +133,14 @@ public final class TargetCompleteEvent implements SkyValue, BuildEventWithOrderC @Override public BuildEventStreamProtos.BuildEvent asStreamProto(PathConverter pathConverter) { - BuildEventStreamProtos.TargetComplete complete = - BuildEventStreamProtos.TargetComplete.newBuilder().setSuccess(!failed()).build(); + BuildEventStreamProtos.TargetComplete.Builder builder = + BuildEventStreamProtos.TargetComplete.newBuilder(); + + builder.setSuccess(!failed()); + builder.addAllTag(getTags()); + builder.addAllOutputGroup(getOutputFilesByGroup(pathConverter)); + + BuildEventStreamProtos.TargetComplete complete = builder.build(); return GenericBuildEvent.protoChaining(this).setCompleted(complete).build(); } @@ -129,4 +148,32 @@ public final class TargetCompleteEvent implements SkyValue, BuildEventWithOrderC public Collection<BuildEventId> postedAfter() { return postedAfter; } + + private Iterable<String> getTags() { + // We are only interested in targets that are rules. + if (!(target instanceof RuleConfiguredTarget)) { + return ImmutableList.<String>of(); + } + AttributeMap attributes = ConfiguredAttributeMapper.of((RuleConfiguredTarget) target); + // Every rule (implicitly) has a "tags" attribute. + return attributes.get("tags", Type.STRING_LIST); + } + + private Iterable<OutputGroup> getOutputFilesByGroup(PathConverter pathConverter) { + ImmutableList.Builder<OutputGroup> groups = ImmutableList.builder(); + for (ArtifactsInOutputGroup artifactsInOutputGroup : outputs) { + OutputGroup.Builder groupBuilder = OutputGroup.newBuilder(); + groupBuilder.setName(artifactsInOutputGroup.getOutputGroup()); + + File.Builder fileBuilder = File.newBuilder(); + for (Artifact artifact : artifactsInOutputGroup.getArtifacts()) { + String name = artifact.getFilename(); + String uri = pathConverter.apply(artifact.getPath()); + groupBuilder.addOutputFile(fileBuilder.setName(name).setUri(uri).build()); + } + + groups.add(groupBuilder.build()); + } + return groups.build(); + } } |