Apply the event-based result collecting approach to regular blaze.

This change is guarded behind
--experimental_use_event_based_build_completion_status. At the moment, we unconditionally carry out both modes of collection and only choose the result of the event-based method if the flag is flipped to "true".

PiperOrigin-RevId: 444269565
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java
index 31335df..1f71794 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java
@@ -537,6 +537,17 @@
   @Nullable
   public PathFragment aqueryDumpAfterBuildOutputFile;
 
+  @Option(
+      name = "experimental_use_event_based_build_completion_status",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+      metadataTags = OptionMetadataTag.EXPERIMENTAL,
+      effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS, OptionEffectTag.EXECUTION},
+      help =
+          "If this flag is set, use the event bus to keep track of whether a top-level target or"
+              + " its aspect is analyzed/built.")
+  public boolean useEventBasedBuildCompletionStatus;
+
   /**
    * Converter for jobs: Takes keyword ({@value #FLAG_SYNTAX}). Values must be between 1 and
    * MAX_JOBS.
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
index 7eabbb2..fa54fb7 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
@@ -292,7 +292,8 @@
               analysisResult,
               result,
               analysisResult.getPackageRoots(),
-              request.getTopLevelArtifactContext());
+              request.getTopLevelArtifactContext(),
+              request.getBuildOptions().useEventBasedBuildCompletionStatus);
         } else {
           env.getReporter().post(new NoExecutionEvent());
         }
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
index 9f66c0c..2c4ecd8 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
@@ -71,6 +71,7 @@
    */
   ExecutionProgressReceiver(
       Set<ConfiguredTargetKey> builtTargets, Set<AspectKey> builtAspects, int exclusiveTestsCount) {
+    // TODO(b/227138583) Remove these.
     this.builtTargets = Collections.synchronizedSet(builtTargets);
     this.builtAspects = Collections.synchronizedSet(builtAspects);
     this.exclusiveTestsCount = exclusiveTestsCount;
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 1283001..ec026c6 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -378,7 +378,8 @@
       AnalysisResult analysisResult,
       BuildResult buildResult,
       PackageRoots packageRoots,
-      TopLevelArtifactContext topLevelArtifactContext)
+      TopLevelArtifactContext topLevelArtifactContext,
+      boolean useEventBasedBuildCompletionStatus)
       throws BuildFailedException, InterruptedException, TestExecException, AbruptExitException {
     Stopwatch timer = Stopwatch.createStarted();
     prepare(packageRoots, analysisResult.getNonSymlinkedDirectoriesUnderExecRoot());
@@ -436,6 +437,7 @@
         installExplanationHandler(
             request.getBuildOptions().explanationPath, request.getOptionsDescription());
 
+    // TODO(b/227138583): Remove these.
     Set<ConfiguredTargetKey> builtTargets = new HashSet<>();
     Set<AspectKey> builtAspects = new HashSet<>();
 
@@ -532,6 +534,11 @@
         saveActionCache(actionCache);
       }
 
+      if (useEventBasedBuildCompletionStatus) {
+        builtTargets = env.getBuildResultListener().getBuiltTargets();
+        builtAspects = env.getBuildResultListener().getBuiltAspects();
+      }
+
       try (SilentCloseable c = Profiler.instance().profile("Show results")) {
         buildResult.setSuccessfulTargets(
             determineSuccessfulTargets(configuredTargets, builtTargets));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index edb9cae..e6d400b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -836,7 +836,6 @@
     responseExtensions.addAll(extensions);
   }
 
-  @Nullable
   public BuildResultListener getBuildResultListener() {
     return buildResultListener;
   }