run method

  1. @override
Future<int> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<int> run() async {
  final outputFormat = argResults?['output'] as String? ?? 'text';
  final tempDir = Directory.systemTemp.createTempSync(
    'flutterstart_doctor_staging',
  );
  final stagingRoot = tempDir.path;

  try {
    RecipeLock? recipeLock;
    try {
      recipeLock = await loadRecipeLock();
    } catch (_) {
      // Best effort: compiled executables may not expose package: resources.
    }
    final probe = DoctorProbe(
      processRunner: const ProcessRunner(),
      stagingRoot: stagingRoot,
    );
    final report = await probe.probe(
      pinnedDependencies: recipeLock?.directDependencies,
      recipeLock: recipeLock,
    );
    CompatibilityResult? compatibility;
    if (recipeLock != null) {
      try {
        compatibility = _observedCompatibility(report, recipeLock);
      } catch (_) {
        // An unreadable compatibility input is unobserved, never fabricated.
      }
    }
    final blocking = doctorBlockingConditions(
      report,
      compatibility: compatibility,
    );

    if (outputFormat == 'json') {
      final jsonStr = renderDoctorJson(
        report,
        blocking,
        compatibility: compatibility,
      );
      stdout.writeln(jsonStr);
    } else {
      final color = stdoutSupportsColor();
      stdout.writeln(doctorBrandHeader(color: color));
      final textStr = renderDoctorText(
        report,
        blocking,
        compatibility: compatibility,
        useColor: color,
      );
      stdout.writeln(textStr);
    }

    if (blocking.isNotEmpty) {
      return ExitReporter.environmentPreflightFailure;
    }
    return ExitReporter.success;
  } finally {
    try {
      if (tempDir.existsSync()) {
        tempDir.deleteSync(recursive: true);
      }
    } catch (_) {}
  }
}