runSdkManager function

Future<ProcessResult> runSdkManager(
  1. List<String> args
)

Implementation

Future<ProcessResult> runSdkManager(List<String> args) async {
  final environment = Map<String, String>.from(Platform.environment);
  final javaHome = Platform.environment['JAVA_HOME'];
  if (javaHome != null) {
    environment['JAVA_HOME'] = javaHome;
  }

  final process = await Process.start(
    'sdkmanager',
    ['--install', ...args],
    environment: environment,
    runInShell: false,
  );

  // Pre-answer any prompt with yes so sdkmanager can proceed.
  for (var i = 0; i < 20; i++) {
    process.stdin.writeln('y');
  }
  await process.stdin.close();

  final stdoutBuffer = StringBuffer();
  final stderrBuffer = StringBuffer();

  final stdoutDone = process.stdout.transform(utf8.decoder).forEach((chunk) {
    stdoutBuffer.write(chunk);
    stdout.write(chunk);
  });

  final stderrDone = process.stderr.transform(utf8.decoder).forEach((chunk) {
    stderrBuffer.write(chunk);
    stderr.write(chunk);
  });

  final exitCode = await process.exitCode.timeout(
    const Duration(minutes: 30),
    onTimeout: () {
      process.kill(ProcessSignal.sigkill);
      return -1;
    },
  );

  await Future.wait([stdoutDone, stderrDone]);

  return ProcessResult(
    process.pid,
    exitCode,
    stdoutBuffer.toString(),
    stderrBuffer.toString(),
  );
}