| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:convert' show jsonEncode; |
| |
| import 'package:yaml/yaml.dart'; |
| |
| import 'generated/benchmark.pb.dart' as pb; |
| |
| pb.Response? findUpdatedResponse(pb.Report? beforeRep, pb.Report afterRep) { |
| if (beforeRep == null) return afterRep.responses[0]; |
| assert(beforeRep.responses.length == afterRep.responses.length); |
| for (var i = 0; i < afterRep.responses.length; i++) { |
| final before = beforeRep.responses[i]; |
| final after = afterRep.responses[i]; |
| assert(before.request.id == after.request.id); |
| assert(before.request.params == after.request.params); |
| if (before.samples.length != after.samples.length) { |
| return after; |
| } |
| } |
| return null; // not found |
| } |
| |
| /// Returns a partially filled in pb.Platform. |
| /// |
| /// It only includes the values we can determine without dart:html or dart:io. |
| pb.Platform createPlatform() { |
| return pb.Platform() |
| ..dartVM = _isDartVM |
| ..checkedMode = _implicitChecksEnabled; |
| } |
| |
| bool get _isDartVM => !identical(1, 1.0); |
| |
| /// Returns `false` if running via dart2js and `--omit-implicit-checks` is set |
| final bool _implicitChecksEnabled = () { |
| // ignore: unused_local_variable |
| var x = true; |
| try { |
| // Trigger an exception if we're in checked mode. |
| x = '' as dynamic; |
| return false; |
| } catch (e) { |
| return true; |
| } |
| }(); |
| |
| /// Given the contents of the pubspec.yaml and pubspec.lock files, |
| /// create a pb.Packages object. |
| pb.Packages createPackages(String pubspecYaml, String pubspecLock) { |
| final out = pb.Packages(); |
| |
| for (var line in pubspecYaml.split('\n')) { |
| line = line.trim(); |
| if (line.startsWith('version:')) { |
| out.version = line.substring('version:'.length).trim(); |
| } |
| } |
| |
| out.packages.addAll(_parseLockFile(pubspecLock)); |
| |
| return out; |
| } |
| |
| /// Quick and dirty lock file parser. |
| /// - ignores indentation |
| /// - assumes one top-level key "packages:" |
| /// - assumes all other lines without a value except 'description' |
| /// start a new package |
| /// - only allows known keys within a package |
| Iterable<pb.PackageVersion> _parseLockFile(String contents) sync* { |
| final yaml = loadYaml(contents) as YamlMap; |
| final packages = yaml['packages'] as YamlMap; |
| |
| for (final entry in packages.entries) { |
| final map = entry.value as YamlMap; |
| final pkgVersion = pb.PackageVersion() |
| ..name = entry.key as String |
| ..source = map['source'] |
| ..version = map['version']; |
| |
| final path = (map['description'] as YamlMap)['path']; |
| if (path != null) { |
| pkgVersion.path = path; |
| } |
| yield pkgVersion; |
| } |
| } |
| |
| /// Encodes a report as nicely-formatted JSON. |
| String encodeReport(pb.Report report) { |
| final json = report.writeToJsonMap(); |
| final out = StringBuffer(); |
| _stringifyMap(out, json, ''); |
| out.writeln(); |
| return out.toString(); |
| } |
| |
| String _stringifyMap(StringBuffer out, Map json, String indent) { |
| final childIndent = '$indent '; |
| out.writeln('{'); |
| var first = true; |
| for (final key in json.keys) { |
| if (!first) out.writeln(','); |
| first = false; |
| |
| final value = json[key]; |
| out.write(childIndent); |
| out.write(jsonEncode(key)); |
| out.write(': '); |
| |
| if (value is List) { |
| _stringifyList(out, value, childIndent); |
| } else if (value is Map && indent.length < 4) { |
| _stringifyMap(out, value, childIndent); |
| } else { |
| out.write(jsonEncode(value)); |
| } |
| } |
| out.write('\n$indent}'); |
| return out.toString(); |
| } |
| |
| void _stringifyList(StringBuffer out, List json, String indent) { |
| final childIndent = '$indent '; |
| out.write('[\n'); |
| var first = true; |
| for (final item in json) { |
| if (!first) out.write(',\n'); |
| first = false; |
| out.write(childIndent); |
| out.write(jsonEncode(item)); |
| } |
| out.write('\n$indent]'); |
| } |