diff --git a/packages/flutter_tools/lib/src/flutter_plugins.dart b/packages/flutter_tools/lib/src/flutter_plugins.dart index 883cf48cc96..94d469dcc1b 100644 --- a/packages/flutter_tools/lib/src/flutter_plugins.dart +++ b/packages/flutter_tools/lib/src/flutter_plugins.dart @@ -15,6 +15,7 @@ import 'base/file_system.dart'; import 'base/os.dart'; import 'base/platform.dart'; import 'base/template.dart'; +import 'base/utils.dart'; import 'base/version.dart'; import 'cache.dart'; import 'compute_dev_dependencies.dart'; @@ -30,6 +31,14 @@ import 'platform_plugins.dart'; import 'plugins.dart'; import 'project.dart'; +Future _fileContentsUnchanged(File file, String renderedTemplate) async { + if (!await file.exists()) { + return false; + } + final List fileBytes = await file.readAsBytes(); + return listEquals(fileBytes, renderedTemplate.codeUnits); +} + Future _renderTemplateToFile( String template, Object? context, @@ -37,6 +46,10 @@ Future _renderTemplateToFile( TemplateRenderer templateRenderer, ) async { final String renderedTemplate = templateRenderer.renderString(template, context); + if (await _fileContentsUnchanged(file, renderedTemplate)) { + globals.printTrace('Skipping generating ${file.basename} because it is up-to-date.'); + return; + } await file.create(recursive: true); await file.writeAsString(renderedTemplate); } diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart index 005a79c0a3a..6aecaad791c 100644 --- a/packages/flutter_tools/test/general.shard/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/plugins_test.dart @@ -1455,6 +1455,31 @@ flutter: }, ); + testUsingContext( + 'Injecting does not overwrite unchanged registrant files', + () async { + createFakePlugin(fs); + + await injectPlugins(flutterProject, releaseMode: false, linuxPlatform: true); + + final File registrantHeader = linuxProject.managedDirectory.childFile( + 'generated_plugin_registrant.h', + ); + final DateTime headerLastModified = registrantHeader.lastModifiedSync(); + + await injectPlugins(flutterProject, releaseMode: false, linuxPlatform: true); + + // Check that the last modified date is the same. + expect(registrantHeader.lastModifiedSync(), headerLastModified); + }, + overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager.any(), + FeatureFlags: enableExplicitPackageDependencies, + Pub: FakePubWithPrimedDeps.new, + }, + ); + testUsingContext( 'Injecting creates generated macos registrant, but does not include Dart-only plugins', () async {