Version 2.15.0-250.0.dev

Merge commit 'ecc6ed1b32de257f24665bd212bbd4edf5d8019a' into 'dev'
diff --git a/DEPS b/DEPS
index 3823819..726c533 100644
--- a/DEPS
+++ b/DEPS
@@ -139,7 +139,7 @@
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
-  "pub_rev": "400f21e9883ce6555b66d3ef82f0b732ba9b9fc8",
+  "pub_rev": "489a7a0b91966c7547da4f3761a9810f09caffb6",
   "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index c0082b3..9367cf6 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -122,7 +122,14 @@
     addCommand(FormatCommand(verbose: verbose));
     addCommand(LanguageServerCommand(verbose: verbose));
     addCommand(MigrateCommand(verbose: verbose));
-    addCommand(pubCommand());
+    addCommand(
+      pubCommand(
+        analytics: PubAnalytics(
+          () => analytics,
+          dependencyKindCustomDimensionName: dependencyKindCustomDimensionName,
+        ),
+      ),
+    );
     addCommand(RunCommand(verbose: verbose));
     addCommand(TestCommand());
   }
diff --git a/pkg/dartdev/lib/src/analytics.dart b/pkg/dartdev/lib/src/analytics.dart
index e5e10de..3072c34 100644
--- a/pkg/dartdev/lib/src/analytics.dart
+++ b/pkg/dartdev/lib/src/analytics.dart
@@ -121,6 +121,7 @@
           IOPostHandler(),
           applicationName: appName,
           applicationVersion: getDartVersion(),
+          batchingDelay: Duration(),
         );
 
   @override
diff --git a/pkg/dartdev/lib/src/events.dart b/pkg/dartdev/lib/src/events.dart
index eb30e78..65469c0 100644
--- a/pkg/dartdev/lib/src/events.dart
+++ b/pkg/dartdev/lib/src/events.dart
@@ -20,10 +20,14 @@
   commandExitCode, // cd1
   enabledExperiments, // cd2
   commandFlags, // cd3
+  dependencyKind, // cd4
 }
 
 String _cdKey(_CustomDimensions cd) => 'cd${cd.index + 1}';
 
+final String dependencyKindCustomDimensionName =
+    _cdKey(_CustomDimensions.dependencyKind);
+
 Map<String, String> _useCdKeys(Map<_CustomDimensions, String> parameters) {
   return parameters.map(
     (_CustomDimensions k, String v) => MapEntry<String, String>(_cdKey(k), v),
diff --git a/pkg/dartdev/test/analytics_test.dart b/pkg/dartdev/test/analytics_test.dart
index b3e1f8b..3ae1f16 100644
--- a/pkg/dartdev/test/analytics_test.dart
+++ b/pkg/dartdev/test/analytics_test.dart
@@ -129,8 +129,12 @@
       ]);
     });
 
-    test('pub get', () {
-      final p = project(logAnalytics: true);
+    test('pub get dry run', () {
+      final p = project(logAnalytics: true, pubspec: {
+        'name': 'foo',
+        'environment': {'sdk': '>=2.10.0 <3.0.0'},
+        'dependencies': {'_dummy_pkg': '0.0.1'}
+      });
       final result = p.runSync(['pub', 'get', '--dry-run']);
       expect(extractAnalytics(result), [
         {
@@ -160,6 +164,60 @@
       ]);
     });
 
+    test('pub get', () {
+      final p = project(logAnalytics: true, pubspec: {
+        'name': 'foo',
+        'environment': {'sdk': '>=2.10.0 <3.0.0'},
+        'dependencies': {'_dummy_pkg': '0.0.1'}
+      });
+      final result = p.runSync(['pub', 'get']);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'pub/get'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'pub-get',
+            'action': '_dummy_pkg',
+            'label': '0.0.1',
+            'value': 1,
+            'ni': '1',
+            'cd4': 'direct'
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'resolution',
+            'time': isA<int>(),
+            'category': 'pub-get',
+            'label': null
+          }
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'pub/get',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'pub/get',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
     test('format', () {
       final p = project(logAnalytics: true);
       final result = p.runSync(['format', '-l80', '.']);
diff --git a/pkg/dartdev/test/utils.dart b/pkg/dartdev/test/utils.dart
index ae6be55..73f944f 100644
--- a/pkg/dartdev/test/utils.dart
+++ b/pkg/dartdev/test/utils.dart
@@ -23,12 +23,14 @@
         String analysisOptions,
         bool logAnalytics = false,
         String name = TestProject._defaultProjectName,
-        VersionConstraint sdkConstraint}) =>
+        VersionConstraint sdkConstraint,
+        Map<String, dynamic> pubspec}) =>
     TestProject(
         mainSrc: mainSrc,
         analysisOptions: analysisOptions,
         logAnalytics: logAnalytics,
-        sdkConstraint: sdkConstraint);
+        sdkConstraint: sdkConstraint,
+        pubspec: pubspec);
 
 class TestProject {
   static const String _defaultProjectName = 'dartdev_temp';
@@ -47,21 +49,28 @@
 
   final VersionConstraint sdkConstraint;
 
+  final Map<String, dynamic> pubspec;
+
   TestProject(
       {String mainSrc,
       String analysisOptions,
       this.name = _defaultProjectName,
       this.logAnalytics = false,
-      this.sdkConstraint}) {
+      this.sdkConstraint,
+      this.pubspec}) {
     dir = Directory.systemTemp.createTempSync('a');
-    file('pubspec.yaml', '''
+    file(
+        'pubspec.yaml',
+        pubspec == null
+            ? '''
 name: $name
 environment:
   sdk: '${sdkConstraint ?? '>=2.10.0 <3.0.0'}'
 
 dev_dependencies:
   test: any
-''');
+'''
+            : json.encode(pubspec));
     if (analysisOptions != null) {
       file('analysis_options.yaml', analysisOptions);
     }
diff --git a/tools/VERSION b/tools/VERSION
index 3483753..9540a64 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 249
+PRERELEASE 250
 PRERELEASE_PATCH 0
\ No newline at end of file