blob: f0fdcdcc8b421a7b016c7c08483117fa84c8b55f [file] [log] [blame] [edit]
// Copyright 2023 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
class CliCommand {
CliCommand();
/// Method runs a single command in a shell.
Future<ProcessResult> runCliCommand({
required String executable,
required List<String> arguments,
bool throwOnError = true,
String? workingDirectory,
}) async {
final process = await Process.start(
executable,
arguments,
workingDirectory: workingDirectory,
runInShell: true,
mode: ProcessStartMode.normal,
);
final result = await Future.wait([
process.exitCode,
process.stdout.transform(const SystemEncoding().decoder).join(),
process.stderr.transform(const SystemEncoding().decoder).join(),
]);
final processResult = ProcessResult(
process.pid,
result[0] as int,
result[1] as String,
result[2] as String,
);
if (throwOnError) {
if (processResult.exitCode != 0) {
final outputs = <String, String>{
if (processResult.stdout != null)
'Standard out': processResult.stdout.toString().trim(),
if (processResult.stderr != null)
'Standard error': processResult.stderr.toString().trim(),
}..removeWhere((k, v) => v.isEmpty);
String errorMessage;
if (outputs.isEmpty) {
errorMessage = 'Unknown error.';
} else {
errorMessage = outputs.entries
.map((entry) => '${entry.key}\n${entry.value}')
.join('\n');
}
throw ProcessException(
executable,
arguments,
errorMessage,
processResult.exitCode,
);
}
}
return processResult;
}
}