run method

Future<String> run(
  1. List<String> stages
)

Runs stages in order, past any red, and returns the summary line.

Implementation

Future<String> run(List<String> stages) async {
  final watch = Stopwatch()..start();
  Directory(runDir).createSync(recursive: true);
  console.writeln('$toolName ${stages.map((s) => ':$s').join(' ')}');
  console.writeln('  logs    ${relative(runDir)}');
  console.writeln('  lock    $lockPath');
  console.writeln(
    '  flutter ${flutter ?? 'NOT FOUND (put it on PATH or set FLUTTER_ROOT)'}',
  );

  final subscriptions = <StreamSubscription<ProcessSignal>>[];
  void onSignal(ProcessSignal signal) {
    runner.interrupt();
    final line =
        'CI RED: interrupted by $signal after '
        '${formatCiDuration(watch.elapsed)} — logs so far ${relative(runDir)}';
    _appendSummary(line);
    stdout.writeln('\n$line');
    exit(130);
  }

  subscriptions.add(ProcessSignal.sigint.watch().listen(onSignal));
  if (!Platform.isWindows) {
    subscriptions.add(ProcessSignal.sigterm.watch().listen(onSignal));
  }
  try {
    for (final stage in stages) {
      console.writeln('== :$stage — ${stageDescriptions[stage] ?? ''}');
      await runStage(this, stage);
    }
  } finally {
    // A cancel takes effect when called; nothing waits on its future.
    for (final s in subscriptions) {
      unawaited(s.cancel());
    }
    runner.lock.release();
  }
  final line = ciSummaryLine(
    stages: stages,
    outcomes: outcomes,
    elapsed: watch.elapsed,
    runDir: runDir,
    relativeTo: repositoryRoot,
  );
  _appendSummary(line);
  return line;
}