diff options
author | 2015-02-11 00:18:07 +0000 | |
---|---|---|
committer | 2015-02-11 00:18:07 +0000 | |
commit | cdc90e9279fdd127720cb0bf8548ce3e1b4f6042 (patch) | |
tree | a6796726dbe7c59a36ed38f548c2824adeed03ef /src/main/java/com | |
parent | a242f210e6584a4fbe2b29e2ca42e94dbb843552 (diff) |
As a follow up to []. This changelist creates an intermediary FileWriteAction to store the list of lcov files in a file before calling the code coverage report binary.
Cleanup on the COVERAGE_REPORT to support multiple actions.
RELNOTES: HTML code coverage report fix for large targets.
--
MOS_MIGRATED_REVID=86033675
Diffstat (limited to 'src/main/java/com')
6 files changed, 67 insertions, 20 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java index 052d0a2a9a..59adaf7892 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java @@ -64,6 +64,7 @@ import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.pkgcache.LoadingPhaseRunner.LoadingResult; import com.google.devtools.build.lib.pkgcache.PackageManager; import com.google.devtools.build.lib.rules.test.CoverageReportActionFactory; +import com.google.devtools.build.lib.rules.test.CoverageReportActionFactory.CoverageReportActionsWrapper; import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey; import com.google.devtools.build.lib.skyframe.CoverageReportValue; import com.google.devtools.build.lib.skyframe.SkyframeBuildView; @@ -700,7 +701,7 @@ public class BuildView { /** * Skyframe implementation of {@link PackageRootResolver}. - * + * * <p> Note: you should not use this class inside of any SkyFunction. */ @VisibleForTesting @@ -741,14 +742,16 @@ public class BuildView { artifactsToBuild.addAll(buildInfoArtifacts); addExtraActionsIfRequested(viewOptions, artifactsToBuild, configuredTargets); if (coverageReportActionFactory != null) { - Action action = coverageReportActionFactory.createCoverageReportAction( + CoverageReportActionsWrapper actionsWrapper; + actionsWrapper = coverageReportActionFactory.createCoverageReportActionsWrapper( allTargetsToTest, getBaselineCoverageArtifacts(configuredTargets), artifactFactory, CoverageReportValue.ARTIFACT_OWNER); - if (action != null) { - skyframeExecutor.injectCoverageReportData(action); - artifactsToBuild.addAll(action.getOutputs()); + if (actionsWrapper != null) { + ImmutableList <Action> actions = actionsWrapper.getActions(); + skyframeExecutor.injectCoverageReportData(actions); + artifactsToBuild.addAll(actionsWrapper.getCoverageOutputs()); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java index c3f5788a64..9354d4340b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.rules.test; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactFactory; @@ -31,12 +33,43 @@ import javax.annotation.Nullable; public interface CoverageReportActionFactory { /** - * Returns a coverage report Action. May return null if it's not necessary to create - * such an Action based on the input parameters and some other data available to - * the factory implementation, such as command line arguments. + * Wraps the necessary actions to get a coverage report as well as the final + * output artifacts. + * The lcovWriteAction creates a file containing a set of lcov files. + * This file is used as an input artifact for coverageReportAction. + * We are only interested about the output artifacts from + * coverageReportAction. */ + + public static final class CoverageReportActionsWrapper { + private final Action lcovWriteAction; + private final Action coverageReportAction; + + public CoverageReportActionsWrapper ( + Action lcovWriteAction, Action coverageReportAction) { + this.lcovWriteAction = lcovWriteAction; + this.coverageReportAction = coverageReportAction; + } + + public ImmutableList<Action> getActions() { + return ImmutableList.of(lcovWriteAction, coverageReportAction); + } + + public ImmutableSet<Artifact> getCoverageOutputs() { + return coverageReportAction.getOutputs(); + } + } + + /** + * Returns a CoverageReportActionsWrapper. May return null if + * it's not necessary to create such Actions based on the input parameters + * and some other data available to the factory implementation, such as + * command line arguments. + */ + @Nullable - public Action createCoverageReportAction(Collection<ConfiguredTarget> targetsToTest, + public CoverageReportActionsWrapper createCoverageReportActionsWrapper( + Collection<ConfiguredTarget> targetsToTest, Set<Artifact> baselineCoverageArtifacts, ArtifactFactory artifactFactory, ArtifactOwner artifactOwner); -}
\ No newline at end of file +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java index 8d6fe3d684..19802e3a01 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java @@ -15,7 +15,10 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -32,14 +35,20 @@ public class CoverageReportFunction implements SkyFunction { CoverageReportValue.SKY_KEY.equals(skyKey), String.format( "Expected %s for SkyKey but got %s instead", CoverageReportValue.SKY_KEY, skyKey)); - Action action = PrecomputedValue.COVERAGE_REPORT_KEY.get(env); - if (action == null) { + ImmutableList <Action> actions = PrecomputedValue.COVERAGE_REPORT_KEY.get(env); + if (actions == null) { return null; } + ImmutableSet.Builder<Artifact> outputs = new ImmutableSet.Builder<>(); + + for (Action action : actions) { + outputs.addAll(action.getOutputs()); + } + return new CoverageReportValue( - action.getOutputs(), - action); + outputs.build(), + actions); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java index 862e381d15..45b84ed952 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; @@ -32,8 +33,8 @@ public class CoverageReportValue extends ActionLookupValue { public static final ArtifactOwner ARTIFACT_OWNER = new CoverageReportKey(); public CoverageReportValue(ImmutableSet<Artifact> coverageReportArtifacts, - Action coverageReportAction) { - super(coverageReportAction); + ImmutableList <Action> coverageReportActions) { + super(coverageReportActions); this.coverageReportArtifacts = coverageReportArtifacts; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java index bb2656d2c4..5c9a337694 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java @@ -17,6 +17,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.analysis.BlazeDirectories; @@ -83,8 +84,8 @@ public class PrecomputedValue implements SkyValue { static final Precomputed<WorkspaceStatusAction> WORKSPACE_STATUS_KEY = new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "workspace_status_action")); - static final Precomputed<Action> COVERAGE_REPORT_KEY = - new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "coverage_report_action")); + static final Precomputed<ImmutableList <Action>> COVERAGE_REPORT_KEY = + new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "coverage_report_actions")); static final Precomputed<TopLevelArtifactContext> TOP_LEVEL_CONTEXT = new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "top_level_context")); 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 29b4c236b2..a30b5c7343 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 @@ -511,8 +511,8 @@ public abstract class SkyframeExecutor { artifactFactory.get(), WorkspaceStatusValue.ARTIFACT_OWNER, buildId)); } - public void injectCoverageReportData(Action action) { - PrecomputedValue.COVERAGE_REPORT_KEY.set(injectable(), action); + public void injectCoverageReportData(ImmutableList<Action> actions) { + PrecomputedValue.COVERAGE_REPORT_KEY.set(injectable(), actions); } /** |