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 String target;
  late final bool relative;
  late final int tail;
  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
      ..ftPattern = getOpiton('pattern', config, gRes: globalResults)
      ..ftExcludes = getOpitons('excludes', config, gRes: globalResults)
      ..ftFields = getOpitons('fields', config,
          gRes: globalResults, datalist: fieldNames)
      ..ftSizes = getSizes(config, globalResults)
      ..ftTimes = getTimes(config, globalResults)
      ..ftErrExit =
          getFlag('errexit', config, defaultTo: true, gRes: globalResults)
      ..ftTimeType = getOpiton('time_type', ftRun.ftConfig,
          gRes: globalResults,
          defaultTo: timeTypeDefault,
          datalist: timeTypes);

    source = getSource(ftRun.ftConfig, globalResults,
        aRes: argResults, env: ftRun.ftEnv);
    target = getTarget('$name.target', ftRun.ftConfig,
        aRes: argResults, env: ftRun.ftEnv, source: source);
    tail =
        getInt('$name.tail', ftRun.ftConfig, aRes: argResults, defaultTo: 0);
    relative = getFlag('$name.relative', ftRun.ftConfig,
        aRes: argResults, defaultTo: true);
  } on UsageException catch (_, __) {
    rethrow;
  } catch (e) {
    throw UsageException(e.toString(), '');
  }

  if (v) traceGlobalParam(logger, ftRun, source);
  final action = BasicPathAction(
    source,
    pattern: ftRun.ftPattern,
    excludes: ftRun.ftExcludes,
    sizes: ftRun.ftSizes,
    times: ftRun.ftTimes,
    env: ftRun.ftEnv,
    verbose: ftRun.ftVerbose,
    cancelOnError: ftRun.ftErrExit,
    statTimeType: StatTimeType.values.byName(ftRun.ftTimeType),
  )
    ..logger = logger
    ..fmtFields = ftRun.ftFields;
  final err = action.validator(target: target);
  if (err.isNotEmpty) throw UsageException('err: chk, $err', '');
  action.argErr = err;

  final srcPath = action.path;
  String dstPath = target;
  if (tail > 0) dstPath = p.join(target, pathtail(srcPath, tail));
  if (v) logger.trace('i, relative:$relative, tail:$tail, target:$dstPath');

  final toDir = Directory(dstPath);
  final isWritable = isDirWritable(toDir);
  if (!isWritable) {
    throw UsageException('err: not writable. $dstPath', '');
  }

  action.unarchive(toDir, relative, isWritable);
}