tailDeploymentStatus static method

Future<void> tailDeploymentStatus(
  1. Client cloudApiClient, {
  2. required CommandLogger logger,
  3. required String cloudCapsuleId,
  4. required UuidValue attemptId,
  5. bool inUtc = false,
  6. bool skipUploadStage = false,
  7. Stream<void>? processSignalStreamOverride,
})

Implementation

static Future<void> tailDeploymentStatus(
  final Client cloudApiClient, {
  required final CommandLogger logger,
  required final String cloudCapsuleId,
  required final UuidValue attemptId,
  final bool inUtc = false,
  final bool skipUploadStage = false,
  final Stream<void>? processSignalStreamOverride,
}) async {
  final stageStream = cloudApiClient.status.tailDeployAttemptStatus(
    cloudCapsuleId: cloudCapsuleId,
    attemptId: attemptId,
  );

  final stageStreams = SplitStreams<DeployStageType, DeployAttemptStage>(
    stageStream,
    DeployStageType.values,
    (final stage) => stage.stageType,
    (final stage) => stage.stageStatus.isFinal,
  );

  if (!skipUploadStage) {
    logger.line('Tracking $cloudCapsuleId deployment $attemptId');
    logger.line('(Press Ctrl+C to exit)');
    logger.line('');
  }

  final processSignalStream =
      processSignalStreamOverride ??
      ProcessSignal.sigint.watch().map((final _) {});

  final stageStatusTailer = _StageStatusTailer(
    logger: logger,
    cloudCapsuleId: cloudCapsuleId,
    attemptId: attemptId,
    stageStreams: stageStreams,
    processSignalStream: processSignalStream,
  );
  try {
    for (final stageType in [DeployStageType.upload, DeployStageType.build]) {
      if (skipUploadStage && stageType == DeployStageType.upload) {
        continue;
      }

      final stage = await stageStatusTailer.showStageProgress(stageType);
      if (stage.stageStatus == DeployProgressStatus.cancelled ||
          stage.stageStatus == DeployProgressStatus.failure) {
        return;
      }
    }

    await stageStatusTailer._showRolloutProgress();
  } on StreamInterruptedException {
    _logDeployTailInterruptGuidance(logger);
    throw UserAbortException();
  } finally {
    await stageStreams.cancel();
  }
}