Future getLog()

in appengine/lib/src/get_log.dart [46:94]


Future<String> getLog(
    String builder, String build, String configuration, String test) async {
  final safeRegExp = RegExp('^[-\\w]*\$');
  final digitsRegExp = RegExp('^\\d*\$');
  if (!safeRegExp.hasMatch(builder)) {
    throw UserVisibleFailure(
        "Builder name $builder contains illegal characters");
  }
  if (builder == 'any') {
    if (configuration.endsWith('*')) {
      throw UserVisibleFailure(
          'Wildcard not allowed in configuration with builder "any"');
    }
    if (!safeRegExp.hasMatch(configuration)) {
      throw UserVisibleFailure(
          'Configuration name $configuration contains illegal characters');
    }
  }
  if (!digitsRegExp.hasMatch(build)) {
    throw UserVisibleFailure('Build number $build is not a number');
  }

  final cloudFile = builder == 'any'
      ? 'configuration/main/$configuration/$build/logs.json'
      : 'builders/$builder/$build/logs.json';
  final jsonLogs = await getCloudFile(resultsBucket, cloudFile);

  final logs = LineSplitter.split(jsonLogs)
      .where((line) => line.isNotEmpty)
      .map(jsonDecode);
  var testFilter = (Map<String, dynamic> log) => log['name'] == test;
  if (test.endsWith('*')) {
    final prefix = test.substring(0, test.length - 1);
    testFilter = (Map<String, dynamic> log) => log['name'].startsWith(prefix);
  }
  var configurationFilter =
      (Map<String, dynamic> log) => log['configuration'] == configuration;
  if (configuration.endsWith('*')) {
    final prefix = configuration.substring(0, configuration.length - 1);
    configurationFilter =
        (Map<String, dynamic> log) => log['configuration'].startsWith(prefix);
  }
  var result = logs
      .where((log) => testFilter(log) && configurationFilter(log))
      .map((log) => log['log'])
      .join('\n\n======================================================\n\n');
  if (result.isEmpty) return null;
  return result;
}