Don't crash on invalid .packages file in initial run(#34527)
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index cf275b2..f08fef7 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -545,7 +545,16 @@
// Check that the flutter running is that same as the one referenced in the pubspec.
if (fs.isFileSync(kPackagesFileName)) {
final PackageMap packageMap = PackageMap(kPackagesFileName);
- final Uri flutterUri = packageMap.map['flutter'];
+ Uri flutterUri;
+ try {
+ flutterUri = packageMap.map['flutter'];
+ } on FormatException {
+ // We're not quite sure why this can happen, perhaps the user
+ // accidentally edited the .packages file. Re-running pub should
+ // fix the issue, and we definitely shouldn't crash here.
+ printTrace('Failed to parse .packages file to check flutter dependency.');
+ return;
+ }
if (flutterUri != null && (flutterUri.scheme == 'file' || flutterUri.scheme == '')) {
// .../flutter/packages/flutter/lib
diff --git a/packages/flutter_tools/test/runner/flutter_command_runner_test.dart b/packages/flutter_tools/test/runner/flutter_command_runner_test.dart
index de00509..f00c866 100644
--- a/packages/flutter_tools/test/runner/flutter_command_runner_test.dart
+++ b/packages/flutter_tools/test/runner/flutter_command_runner_test.dart
@@ -103,6 +103,19 @@
}, initializeFlutterRoot: false);
});
+ testUsingContext('Doesnt crash on invalid .packages file', () async {
+ fs.file('pubspec.yaml').createSync();
+ fs.file('.packages')
+ ..createSync()
+ ..writeAsStringSync('Not a valid package');
+
+ await runner.run(<String>['dummy']);
+
+ }, overrides: <Type, Generator>{
+ FileSystem: () => fs,
+ Platform: () => platform,
+ }, initializeFlutterRoot: false);
+
group('version', () {
testUsingContext('checks that Flutter toJson output reports the flutter framework version', () async {
final ProcessResult result = ProcessResult(0, 0, 'random', '0');