run method

Future<int> run({
  1. bool skipIfMissing = false,
})

Implementation

Future<int> run({
  /// If true, the script will be skipped if it is not found in the config.
  bool skipIfMissing = false,
}) async {
  assert(options.script != null, 'Script name is required');

  final scriptExists =
      config.scripts?.scriptsMap.containsKey(options.script) == true;

  if (!scriptExists && skipIfMissing) {
    return 0;
  }

  final scriptName = options.script;
  if (scriptName != null &&
      _isHookScriptName(scriptName) &&
      !_canRunHook(scriptName)) {
    return 0;
  }

  final targetDirectory =
      options.globalOptions.directory ?? config.workingDirectory;

  var beforeHooks = <IntCallback>[];
  var afterHooks = <IntCallback>[];

  if (scriptExists) {
    final hooks = _getHooks(
      config: config,
      options: options,
      arguments: arguments,
      targetDirectory: targetDirectory,
    );
    beforeHooks = hooks.before;
    afterHooks = hooks.after;
  }

  for (final hook in beforeHooks) {
    final hookExitCode = await hook();
    if (hookExitCode != 0) {
      return hookExitCode;
    }
  }

  final exitCode = await _runScript(
    config: config,
    options: options,
    arguments: arguments,
    targetDirectory: targetDirectory,
    skipIfMissing: skipIfMissing,
  );
  if (exitCode != 0) {
    return exitCode;
  }

  for (final hook in afterHooks) {
    final hookExitCode = await hook();
    if (hookExitCode != 0) {
      return hookExitCode;
    }
  }

  return 0;
}