runCommand method

Future<void> runCommand(
  1. List<String> commands,
  2. Map<String, dynamic> scripts,
  3. Map vars
)

Implementation

Future<void> runCommand(List<String> commands, Map<String, dynamic> scripts, Map vars) async {
  for (var command in commands) {
    var regex = RegExp("[^\\s\'']+|\'[^\']*\'|'[^']*'");
    var regexVar = RegExp(r'\$([a-zA-Z0-9]+)');

    late String commandExec;
    try {
      commandExec = scripts[command] as String;
    } catch (e) {
      commandExec = '';
      output.error('command "$command" not found');
      return;
    }

    for (var match in regexVar.allMatches(commandExec)) {
      if (match.groupCount != 0) {
        var variable = match.group(0)?.replaceFirst('\$', '');
        if (variable != null && vars.containsKey(variable)) {
          commandExec = commandExec.replaceAll(match.group(0) ?? '', vars[variable] ?? '');
        }
      }
    }

    for (final item in commandExec.split('&')) {
      final matchList = regex
          .allMatches(item)
          .map((v) => v.group(0)!)
          .toList()
          .map<String>((e) => (e.startsWith('\$') ? vars[e.replaceFirst('\$', '')] ?? e : e))
          .toList();
      await callProcess(matchList);
    }
  }
}