run method
Runs this command.
The return value is wrapped in a Future
if necessary and returned by
CommandRunner.runCommand
.
Implementation
@override
Future<ExitCode> run([List<String>? args]) async {
final argResults = argParser.parse(args ?? this.argResults?.rest ?? []);
final neverQuit = argResults['never-exit'] as bool? ?? false;
if (argResults['help'] as bool? ?? false) {
printUsage();
return ExitCode.success;
}
final keys = args ?? argResults.rest;
final concurrent = argResults['concurrent'] == true;
final disableConcurrency =
argResults.wasParsed('concurrent') && !concurrent;
if (disableConcurrency) {
logger.warn('Disabling all concurrent runs');
}
final validateResult = await validate(keys);
if (validateResult != null) {
return validateResult;
}
var (exitCode, commands, bail) = commandsToRun(keys, argResults);
if (exitCode != null) {
return exitCode;
}
assert(commands != null, 'commands should not be null');
commands!;
bail ^= argResults['bail'] as bool? ?? false;
Future<ExitCode> runCommands() => _run(
argResults: argResults,
bail: bail,
concurrent: concurrent,
disableConcurrency: disableConcurrency,
commands: commands,
);
if (neverQuit) {
logger
..write('\n')
..warn('Never exit is set, restarting after each run.')
..warn('To exit, press Ctrl+C or close the terminal.')
..write('\n');
await Future<void>.delayed(const Duration(seconds: 3));
while (true) {
await runCommands();
logger
..warn('Restarting in 1 second')
..write('\n');
await Future<void>.delayed(const Duration(seconds: 1));
}
}
return runCommands();
}