run method

  1. @override
void run()
override

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));
  }
}