Replace hand-maintained list of previous benchmarks with pkg:build (#128)

MUCH easier to maintain
diff --git a/benchmark/data/index.dart b/benchmark/data/index.dart
index df0e449..80296fa 100644
--- a/benchmark/data/index.dart
+++ b/benchmark/data/index.dart
@@ -11,27 +11,3 @@
 const String pubspecLockName = "pubspec.link.lock";
 
 const String hostfileName = "hostname.txt";
-
-List<String> allReportNames = const [
-  latestVMReportName,
-  "skybrian5/0.4.2/json_chrome.pb.json",
-  "skybrian5/0.4.2/json_vm.pb.json",
-  "skybrian5/0.4.2/props_chrome.pb.json",
-  "skybrian5/0.4.2/props_vm.pb.json",
-  "skybrian5/head/json_chrome.pb.json",
-  "skybrian5/head/json_vm.pb.json",
-  "skybrian5/head/props_chrome.pb.json",
-  "skybrian5/head/props_vm.pb.json",
-  "skybrian-macbookpro/0.4.2/json_chrome.pb.json",
-  "skybrian-macbookpro/0.4.2/json_vm.pb.json",
-  "skybrian-macbookpro/0.4.2/props_chrome.pb.json",
-  "skybrian-macbookpro/0.4.2/props_vm.pb.json",
-  "skybrian-macbookpro/0.5.0/json_chrome.pb.json",
-  "skybrian-macbookpro/0.5.0/json_vm.pb.json",
-  "skybrian-macbookpro/0.5.0/props_chrome.pb.json",
-  "skybrian-macbookpro/0.5.0/props_vm.pb.json",
-  "skybrian-macbookpro/head/json_chrome.pb.json",
-  "skybrian-macbookpro/head/json_vm.pb.json",
-  "skybrian-macbookpro/head/props_chrome.pb.json",
-  "skybrian-macbookpro/head/props_vm.pb.json",
-];
diff --git a/benchmark/lib/dashboard.dart b/benchmark/lib/dashboard.dart
index 1a42667..08d2fa7 100644
--- a/benchmark/lib/dashboard.dart
+++ b/benchmark/lib/dashboard.dart
@@ -5,6 +5,7 @@
 library protoc.benchmark.html_runner;
 
 import 'dart:async' show Future;
+import 'dart:convert';
 import 'dart:html';
 import 'dart:js' show context, JsObject;
 
@@ -127,15 +128,14 @@
 /// Loads all the reports saved to benchmark/data.
 Future<Map<String, pb.Report>> loadReports(pb.Suite suite) async {
   var out = <String, pb.Report>{};
-  // TODO: maybe parallelize?
-  for (var name in data.allReportNames) {
-    String json =
-        await _loadDataFile(name, optional: (name == data.latestVMReportName));
-    if (json != null) {
-      var report = new pb.Report.fromJson(json);
-      if (isCompatibleBaseline(suite, report)) {
-        out[name] = report;
-      }
+
+  var dataJsonContent = await _loadDataFile('data.json');
+  var dataJson = jsonDecode(dataJsonContent) as Map<String, dynamic>;
+
+  for (var entry in dataJson.entries) {
+    var report = new pb.Report.fromJson(entry.value);
+    if (isCompatibleBaseline(suite, report)) {
+      out[entry.key] = report;
     }
   }
   print("loaded ${out.length} reports");
diff --git a/build.yaml b/build.yaml
index 5f82db1..0221297 100644
--- a/build.yaml
+++ b/build.yaml
@@ -1,4 +1,4 @@
-# Configuration for Dart build system - https://github.com/dart-lang/build
+# Read about `build.yaml` at https://pub.dartlang.org/packages/build_config
 # Enables running benchmarks via browser: `pub run build_runner serve`
 targets:
   $default:
@@ -11,3 +11,10 @@
           - --minify
           #- --trust-primitives
           #- --omit-implicit-checks
+
+builders:
+  benchmarkBuilder:
+    import: "tool/builder.dart"
+    builder_factories: ["benchmarkBuilder"]
+    build_extensions: {"lib/$lib$": ["benchmark/data/data.json"]}
+    auto_apply: root_package
diff --git a/tool/builder.dart b/tool/builder.dart
new file mode 100644
index 0000000..acf8865
--- /dev/null
+++ b/tool/builder.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2018, 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:async';
+import 'dart:convert';
+
+import 'package:build/build.dart';
+import 'package:glob/glob.dart';
+
+Builder benchmarkBuilder(BuilderOptions options) => _BenchmarkBuilder();
+
+class _BenchmarkBuilder implements Builder {
+  @override
+  Future build(BuildStep buildStep) async {
+    var data = <String, String>{};
+
+    await for (var item in buildStep
+        .findAssets(Glob('benchmark/**/*.pb.json'))
+        .where((id) =>
+            id.pathSegments.length > 2 &&
+            id.pathSegments[0] == 'benchmark' &&
+            id.pathSegments[1] == 'data')) {
+      data[item.pathSegments.skip(2).join('/')] =
+          await buildStep.readAsString(item);
+    }
+
+    await buildStep.writeAsString(
+        AssetId(buildStep.inputId.package, 'benchmark/data/data.json'),
+        JsonEncoder.withIndent(' ').convert(data));
+  }
+
+  @override
+  final buildExtensions = const {
+    r'lib/$lib$': ['benchmark/data/data.json']
+  };
+}