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