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
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 052d0a2..59adaf7 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.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 @@
 
   /**
    * Skyframe implementation of {@link PackageRootResolver}.
-   * 
+   *
    * <p> Note: you should not use this class inside of any SkyFunction.
    */
   @VisibleForTesting
@@ -741,14 +742,16 @@
     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 c3f5788..9354d43 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 @@
 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 8d6fe3d..19802e3 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 @@
         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 862e381..45b84ed 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 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 bb2656d..5c9a337 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.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 @@
   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 29b4c23..a30b5c7 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 @@
             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);
   }
 
   /**