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