diff --git a/packages/flutter_tools/lib/src/reporting/github_template.dart b/packages/flutter_tools/lib/src/reporting/github_template.dart index b7ca3ed67e..d0d7f2f265 100644 --- a/packages/flutter_tools/lib/src/reporting/github_template.dart +++ b/packages/flutter_tools/lib/src/reporting/github_template.dart @@ -143,26 +143,62 @@ ${_projectMetadataInformation()} ..writeln('**Creation channel**: ${metadata.versionChannel}') ..writeln('**Creation framework version**: ${metadata.versionRevision}'); - final File file = project.flutterPluginsFile; + final File file = project.flutterPluginsDependenciesFile; if (file.existsSync()) { - description.writeln('### Plugins'); - // Format is: - // camera=/path/to/.pub-cache/hosted/pub.dartlang.org/camera-0.5.7+2/ - for (final String plugin in project.flutterPluginsFile.readAsLinesSync()) { - final List pluginParts = plugin.split('='); - if (pluginParts.length != 2) { - continue; - } - // Write the last part of the path, which includes the plugin name and version. - // Example: camera-0.5.7+2 - final List pathParts = _fileSystem.path.split(pluginParts[1]); - description.writeln(pathParts.isEmpty ? pluginParts.first : pathParts.last); - } + _writePlugins(description, file); } - return description.toString(); } on Exception catch (exception) { return exception.toString(); } } + + void _writePlugins(StringBuffer description, File file) { + description.writeln('### Plugins'); + // Format is: + // { + // "plugins": { + // "ios": [ + // { + // "path": "/path/to/.pub-cache/hosted/pub.dartlang.org/camera-0.5.7+2/", + // } + // ] + // } + // } + final Object? json = jsonDecode(file.readAsStringSync()); + if (json is! Map) { + return; + } + final Object? plugins = json['plugins']; + if (plugins is! Map) { + return; + } + final Set pluginPaths = {}; + for (final Object? pluginList in plugins.values) { + if (pluginList is! List) { + continue; + } + for (final Object? plugin in pluginList) { + if (plugin is! Map) { + continue; + } + final String? path = plugin['path'] as String?; + if (path != null) { + pluginPaths.add(path); + } + } + } + if (pluginPaths.isEmpty) { + return; + } + for (final String path in pluginPaths) { + // Write the last part of the path, which includes the plugin name and version. + // Example: camera-0.5.7+2 + final List pathParts = _fileSystem.path.split(path); + if (pathParts.isEmpty) { + continue; + } + description.writeln(pathParts.last); + } + } } diff --git a/packages/flutter_tools/test/general.shard/github_template_test.dart b/packages/flutter_tools/test/general.shard/github_template_test.dart index 6821f2eed9..6afabec180 100644 --- a/packages/flutter_tools/test/general.shard/github_template_test.dart +++ b/packages/flutter_tools/test/general.shard/github_template_test.dart @@ -13,6 +13,33 @@ import 'package:flutter_tools/src/reporting/github_template.dart'; import '../src/common.dart'; import '../src/context.dart'; +const String _kPluginsFile = ''' +{ + "plugins": { + "ios": [ + { + "name": "camera", + "path": "/fake/pub.dartlang.org/camera-0.5.7+2/" + }, + { + "name": "device_info", + "path": "/fake/pub.dartlang.org/device_info-0.4.1+4/" + } + ], + "android": [ + { + "name": "camera", + "path": "/fake/pub.dartlang.org/camera-0.5.7+2/" + }, + { + "name": "device_info", + "path": "/fake/pub.dartlang.org/device_info-0.4.1+4/" + } + ] + } +} +'''; + void main() { late BufferLogger logger; late FileSystem fs; @@ -199,11 +226,8 @@ flutter: iosBundleIdentifier: com.example.failing.ios '''); - final File pluginsFile = projectDirectory.childFile('.flutter-plugins'); - pluginsFile.writeAsStringSync(''' -camera=/fake/pub.dartlang.org/camera-0.5.7+2/ -device_info=/fake/pub.dartlang.org/pub.dartlang.org/device_info-0.4.1+4/ - '''); + final File pluginsFile = projectDirectory.childFile('.flutter-plugins-dependencies'); + pluginsFile.writeAsStringSync(_kPluginsFile); final File metadataFile = projectDirectory.childFile('.metadata'); metadataFile.writeAsStringSync('''