+ Stop running `pub get` at gclient sync time. This was slow and unnecessary.
+ Stop symlinking non-dart_pkg packages into gen/dart-pkg/packages. This suffered from three problems:
1) These symlinks were not being specified as build output by any rule. They were a magic side effect.
2) There was a race where many symlinks to the same package could be created, the last one winning.
3) Related to 2, if two packages relied on two different versions of the same package, we could have hard to reproduce bugs that depend upon the winner of the race.
We now have a checked in copy of all third-party Dart packages needed by the Mojo Dart SDK. These live under //mojo/public/dart/third_party. There is a script 'update_packages.py' which uses `pub get` to handle all version constraints and updates the source tree after pub is run. It's now trivial to ensure we have a compatible set of packages checked into the tree and to update the package set.
Fixes #395
Fixes #401
Fixes #403
Fixes #429
R=jamesr@chromium.org, tonyg@chromium.org, zra@google.com
Review URL: https://codereview.chromium.org/1346773002 .
diff --git a/mojo/public/dart/third_party/string_scanner/README.md b/mojo/public/dart/third_party/string_scanner/README.md
new file mode 100644
index 0000000..90660fc
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/README.md
@@ -0,0 +1,37 @@
+This package exposes a `StringScanner` type that makes it easy to parse a string
+using a series of `Pattern`s. For example:
+
+```dart
+import 'dart:math';
+
+import 'package:string_scanner/string_scanner.dart';
+
+num parseNumber(String source) {
+ // Scan a number ("1", "1.5", "-3").
+ var scanner = new StringScanner(source);
+
+ // [Scanner.scan] tries to consume a [Pattern] and returns whether or not it
+ // succeeded. It will move the scan pointer past the end of the pattern.
+ var negative = scanner.scan("-");
+
+ // [Scanner.expect] consumes a [Pattern] and throws a [FormatError] if it
+ // fails. Like [Scanner.scan], it will move the scan pointer forward.
+ scanner.expect(new RegExp(r"\d+"));
+
+ // [Scanner.lastMatch] holds the [MatchData] for the most recent call to
+ // [Scanner.scan], [Scanner.expect], or [Scanner.matches].
+ var number = int.parse(scanner.lastMatch[0]);
+
+ if (scanner.scan(".")) {
+ scanner.expect(new RegExp(r"\d+"));
+ var decimal = scanner.lastMatch[0];
+ number += int.parse(decimal) / math.pow(10, decimal.length);
+ }
+
+ // [Scanner.expectDone] will throw a [FormatError] if there's any input that
+ // hasn't yet been consumed.
+ scanner.expectDone();
+
+ return (negative ? -1 : 1) * number;
+}
+```