[flutter_tools] handle invalid yaml in plugin dependency (#63526)
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index a83d9ca..d3701c8 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -311,7 +311,14 @@
if (!globals.fs.isFileSync(pubspecPath)) {
return null;
}
- final dynamic pubspec = loadYaml(globals.fs.file(pubspecPath).readAsStringSync());
+ dynamic pubspec;
+
+ try {
+ pubspec = loadYaml(globals.fs.file(pubspecPath).readAsStringSync());
+ } on YamlException catch (err) {
+ globals.printTrace('Failed to parse plugin manifest for $name: $err');
+ // Do nothing, potentially not a plugin.
+ }
if (pubspec == null) {
return null;
}
diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart
index d846e62..2a72fab 100644
--- a/packages/flutter_tools/test/general.shard/plugins_test.dart
+++ b/packages/flutter_tools/test/general.shard/plugins_test.dart
@@ -908,6 +908,28 @@
FeatureFlags: () => featureFlags,
});
+ testUsingContext('Invalid yaml does not crash plugin lookup.', () async {
+ when(macosProject.existsSync()).thenReturn(true);
+ when(featureFlags.isMacOSEnabled).thenReturn(true);
+ when(flutterProject.isModule).thenReturn(true);
+ // Create a plugin without a pluginClass.
+ dummyPackageDirectory.parent.childFile('pubspec.yaml')
+ ..createSync(recursive: true)
+ ..writeAsStringSync(r'''
+"aws ... \"Branch\": $BITBUCKET_BRANCH, \"Date\": $(date +"%m-%d-%y"), \"Time\": $(date +"%T")}\"
+ ''');
+
+ await injectPlugins(flutterProject, checkProjects: true);
+
+ final File registrantFile = macosProject.managedDirectory.childFile('GeneratedPluginRegistrant.swift');
+
+ expect(registrantFile, exists);
+ }, overrides: <Type, Generator>{
+ FileSystem: () => fs,
+ ProcessManager: () => FakeProcessManager.any(),
+ FeatureFlags: () => featureFlags,
+ });
+
testUsingContext('Injecting creates generated Linux registrant', () async {
when(linuxProject.existsSync()).thenReturn(true);
when(featureFlags.isLinuxEnabled).thenReturn(true);