run method
Runs this command.
The return value is wrapped in a Future if necessary and returned by
CommandRunner.runCommand.
Implementation
@override
void run() {
final ftRun = runner as FtRunner;
final v = ftRun.ftVerbose;
final logger = ftRun.ftLogger;
late final String source;
late final List<String> blocks;
late final Map<String, List<String>> blockMap;
late final String delay;
try {
final args = globalResults?.arguments ?? [];
final config = configFromArgParse(ftRun.argParser, args);
final define = getDefine(config, globalResults);
final env = {...Platform.environment, ...define};
ftRun
..ftConfig = config
..ftDefine = define
..ftEnv = env
..ftErrExit =
getFlag('errexit', config, defaultTo: true, gRes: globalResults);
source = getSource(ftRun.ftConfig, globalResults,
aRes: argResults, env: ftRun.ftEnv);
blocks = getOpitons('blocks', config, aRes: argResults);
blockMap = getExecBlock(ftRun.ftConfig, ftRun.ftEnv, blocks);
delay =
getOpiton('delay', ftRun.ftConfig, aRes: argResults, defaultTo: '1');
} on UsageException catch (_, __) {
rethrow;
} catch (e) {
throw UsageException(e.toString(), '');
}
if (v) logger.trace('i, source:$source');
bool errexit = false;
for (var block in blocks) {
var commands = blockMap[block] ?? [];
if (commands.isEmpty) break;
for (var cmd in commands) {
if (errexit) break;
logger.trace('i, block:$block, cmd:$cmd');
cmd = expandVar(cmd, map: ftRun.ftEnv);
final progress = logger.progress('i, block:$block, run:$cmd');
final parts = parseCliArgs(cmd);
final args = parts
.getRange(1, parts.length)
.map((e) => e.trim())
.toList()
..removeWhere((e) => e.isEmpty);
final runner = cmdRunner(args);
runner.run(args).catchError(
(e, s) {
if (ftRun.ftErrExit) errexit = true;
if (exitCode == 0) exitCode = ExitCodeExt.error.code;
logger.stderr(e.toString().split('\n\n').first);
},
).whenComplete(
() => progress.finish(message: 'i, block:$block, completed.'),
);
}
if (block.length > 1) sleep(Duration(seconds: int.tryParse(delay) ?? 1));
}
}