diff options
author | 2016-04-07 13:23:48 +0000 | |
---|---|---|
committer | 2016-04-07 17:02:46 +0000 | |
commit | 2c94a385bfcdec0ba0f43147b686fb04031f5051 (patch) | |
tree | 9da72d8584c4548d2a9982f939371f5654185034 /src | |
parent | 3454dd56f237b01b30c2ab7b0ab130426a0e14e7 (diff) |
experimental UI: use LoadingProgressReceiver
Subscribe to the LoadingPhaseStartedEvent to get the LoadingProgressReceiver;
use it to provide information about the loading progress. As this event will not
be raised by the LegacyLoadingPhaseRunner, do not depend on this event and still
produce a sensible status bar if it is never raised.
--
Change-Id: I1db24ceaf7de4fc42d00b02f470066cb38c877b4
Reviewed-on: https://bazel-review.googlesource.com/#/c/3270
MOS_MIGRATED_REVID=119261675
Diffstat (limited to 'src')
3 files changed, 38 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java index dc488bd6e0..cfa284f7d9 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressRecei import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventKind; import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent; +import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent; import com.google.devtools.build.lib.util.Clock; import com.google.devtools.build.lib.util.io.AnsiTerminal; import com.google.devtools.build.lib.util.io.LineCountingAnsiTerminalWriter; @@ -150,6 +151,12 @@ public class ExperimentalEventHandler extends BlazeCommandEventHandler { } @Subscribe + public void loadingStarted(LoadingPhaseStartedEvent event) { + stateTracker.loadingStarted(event); + refresh(); + } + + @Subscribe public void loadingComplete(LoadingPhaseCompleteEvent event) { stateTracker.loadingComplete(event); refresh(); diff --git a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java index 0764d53778..bddd3c086e 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java @@ -22,6 +22,8 @@ import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent; import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent; import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressReceiverAvailableEvent; import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent; +import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent; +import com.google.devtools.build.lib.skyframe.LoadingProgressReceiver; import com.google.devtools.build.lib.util.Clock; import com.google.devtools.build.lib.util.io.AnsiTerminalWriter; @@ -54,6 +56,7 @@ class ExperimentalStateTracker { private boolean ok; private ExecutionProgressReceiver executionProgressReceiver; + private LoadingProgressReceiver loadingProgressReceiver; ExperimentalStateTracker(Clock clock) { this.runningActions = new ArrayDeque<>(); @@ -68,7 +71,13 @@ class ExperimentalStateTracker { additionalMessage = ""; } + void loadingStarted(LoadingPhaseStartedEvent event) { + status = null; + loadingProgressReceiver = event.getLoadingProgressReceiver(); + } + void loadingComplete(LoadingPhaseCompleteEvent event) { + loadingProgressReceiver = null; int count = event.getTargets().size(); status = "Analysing"; additionalMessage = "" + count + " targets"; @@ -159,6 +168,12 @@ class ExperimentalStateTracker { if (runningActions.size() >= 1) { return true; } + if (loadingProgressReceiver != null) { + // This is kind-of a hack: since the event handler does not get informed about updates + // in the loading phase, indicate that the progress bar might change even though no + // explicit update event is known to the event handler. + return true; + } return false; } @@ -172,6 +187,14 @@ class ExperimentalStateTracker { terminalWriter.append(status + ":").normal().append(" " + additionalMessage); return; } + if (loadingProgressReceiver != null) { + terminalWriter + .okStatus() + .append("Loading:") + .normal() + .append(" " + loadingProgressReceiver.progressState()); + return; + } if (executionProgressReceiver != null) { terminalWriter.okStatus().append(executionProgressReceiver.getProgressString()); } else { diff --git a/src/test/shell/integration/experimental_ui_test.sh b/src/test/shell/integration/experimental_ui_test.sh index bb350bca2c..eea40c0cc8 100755 --- a/src/test/shell/integration/experimental_ui_test.sh +++ b/src/test/shell/integration/experimental_ui_test.sh @@ -140,6 +140,13 @@ function test_subcommand_notdefault { expect_not_log "dragons" } - +function test_loading_progress { + bazel clean || fail "bazel clean failed" + bazel test --experimental_ui \ + --experimental_skyframe_target_pattern_evaluator pkg:true 2>$TEST_log \ + || fail "bazel test failed" + # some progress indicator is shown during loading + expect_log 'Loading.*[0-9,]* / [0-9,]*' +} run_suite "Integration tests for bazel's experimental UI" |