From b29a5a87617f5cdc2cdd4c9da58f45781f8e6694 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Mon, 10 Nov 2025 10:59:03 -0800 Subject: [PATCH 01/14] first two tests good state --- .../test/update_dependency_command_test.dart | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index 6488c673fe4..6ac4a76eb38 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -907,6 +907,63 @@ distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip 'gradle-$newGradleVersion-all.zip')); }); }); + group('agp', () { + final List invalidAGPVersionsFormat = [ + '81', + '811.1', + '8.123', + '8.12.12' + ]; + + for (final String AGPVersion in invalidAGPVersionsFormat) { + test('throws because AGPVersion: $AGPVersion is invalid', () async { + Error? commandError; + final List output = await runCapturingPrint(runner, [ + 'update-dependency', + '--android-dependency', + 'androidGradlePlugin', + '--version', + AGPVersion, + ], errorHandler: (Error e) { + commandError = e; + }); + + expect(commandError, isA()); + expect( + output, + containsAllInOrder([ + contains(''' +A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) must be provided. + 1. The first number must have one or two digits + 2. The second number must have one or two digits + 3. If present, the third number must have a single digit'''), + ]), + ); + }); + } + + test('skips if example app does not run on Android', () async { + final RepositoryPackage package = + createFakePlugin('fake_plugin', packagesDir); + + final List output = await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'androidGradlePlugin', + '--version', + '8.11.1', + ]); + + expect( + output, + containsAllInOrder([ + contains('SKIPPING: No example apps run on Android.'), + ]), + ); + }); + }); group('compileSdk/compileSdkForExamples', () { // Tests if the compileSdk version is updated for the provided From b3fae2e3590a50cf49991ba1aa109b2ca8c33249 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Mon, 10 Nov 2025 11:58:42 -0800 Subject: [PATCH 02/14] everything in good state --- .../lib/src/update_dependency_command.dart | 32 ++++++- .../test/update_dependency_command_test.dart | 93 +++++++++++++++++++ 2 files changed, 123 insertions(+), 2 deletions(-) diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index 02c118e0d20..bd880cecd1e 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -44,12 +44,15 @@ class UpdateDependencyCommand extends PackageLoopingCommand { help: 'An Android dependency to update.', allowed: [ _AndroidDepdencyType.gradle, + _AndroidDepdencyType.androidGradlePlugin, _AndroidDepdencyType.compileSdk, _AndroidDepdencyType.compileSdkForExamples, ], allowedHelp: { _AndroidDepdencyType.gradle: 'Updates Gradle version used in plugin example apps.', + _AndroidDepdencyType.androidGradlePlugin: + 'Updates AGP version used in plugin example apps.', _AndroidDepdencyType.compileSdk: 'Updates compileSdk version used to compile plugins.', _AndroidDepdencyType.compileSdkForExamples: @@ -150,7 +153,22 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus 3. If present, the third number must have a single digit'''); throw ToolExit(_exitInvalidTargetVersion); } - } else if (_targetAndroidDependency == _AndroidDepdencyType.compileSdk || + } else if (_targetAndroidDependency == + _AndroidDepdencyType.androidGradlePlugin) { + final RegExp validAGPVersionPattern = + RegExp(r'^\d{1,2}\.\d{1,2}(?:\.\d)?$'); + final bool isValidAGPVersion = + validAGPVersionPattern.stringMatch(version) == version; + if (!isValidAGPVersion) { + printError(''' +A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) must be provided. + 1. The first number must have one or two digits + 2. The second number must have one or two digits + 3. If present, the third number must have a single digit'''); + throw ToolExit(_exitInvalidTargetVersion); + } + } else if (_targetAndroidDependency == + _AndroidDepdencyType.compileSdk || _targetAndroidDependency == _AndroidDepdencyType.compileSdkForExamples) { final RegExp validSdkVersion = RegExp(r'^\d{1,2}$'); @@ -258,7 +276,9 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus return _runForCompileSdkVersion(package); } else if (_targetAndroidDependency == _AndroidDepdencyType.gradle || _targetAndroidDependency == - _AndroidDepdencyType.compileSdkForExamples) { + _AndroidDepdencyType.compileSdkForExamples || + _targetAndroidDependency == + _AndroidDepdencyType.androidGradlePlugin) { return _runForAndroidDependencyOnExamples(package); } @@ -317,6 +337,13 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus dependencyVersionPattern = RegExp( r'(compileSdk|compileSdkVersion) (\d{1,2}|flutter.compileSdkVersion)'); newDependencyVersionEntry = 'compileSdk $_targetVersion'; + } else if (_targetAndroidDependency == + _AndroidDepdencyType.androidGradlePlugin) { + filesToUpdate.add(androidDirectory.childFile('settings.gradle')); + dependencyVersionPattern = RegExp( + r'^\s*id\s+"com\.android\.application"\s+version\s+"(\d{1,2}\.\d{1,2}(?:\.\d)?)"\s+apply\s+false\s*$', multiLine: true); + newDependencyVersionEntry = + 'id "com.android.application" version "$_targetVersion" apply false'; } else { printError( 'Target Android dependency $_targetAndroidDependency is unrecognized.'); @@ -506,6 +533,7 @@ enum _PubDependencyType { normal, dev } class _AndroidDepdencyType { static const String gradle = 'gradle'; + static const String androidGradlePlugin = 'androidGradlePlugin'; static const String compileSdk = 'compileSdk'; static const String compileSdkForExamples = 'compileSdkForExamples'; } diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index 6ac4a76eb38..8a3850d3d8c 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -963,6 +963,99 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus ]), ); }); + + test( + 'succeeds if example app has android/settings.gradle structure', + () async { + final RepositoryPackage package = + createFakePlugin('fake_plugin', packagesDir, extraFiles: [ + 'example/android/settings.gradle' + ]); + const String newAGPVersion = '9.9'; + + final File gradleSettingsFile = package.directory + .childDirectory('example') + .childDirectory('android') + .childFile('settings.gradle'); + + gradleSettingsFile.writeAsStringSync(r''' +... +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.11.1" apply false +... +} +... +'''); + + await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'androidGradlePlugin', + '--version', + newAGPVersion, + ]); + + final String updatedGradleSettingsContents = + gradleSettingsFile.readAsStringSync(); + + expect( + updatedGradleSettingsContents, + contains( + r'id "com.android.application" version ' + '"$newAGPVersion" apply false')); + }); + + test( + 'succeeds if one example app runs on Android and another does not', + () async { + final RepositoryPackage package = createFakePlugin( + 'fake_plugin', packagesDir, examples: [ + 'example_1', + 'example_2' + ], extraFiles: [ + 'example/example_2/android/settings.gradle' + ]); + const String newAGPVersion = '9.9'; + + final File gradleSettingsFile = package.directory + .childDirectory('example') + .childDirectory('example_2') + .childDirectory('android') + .childFile('settings.gradle'); + + gradleSettingsFile.writeAsStringSync(r''' +... +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.11.1" apply false +... +} +... +'''); + + await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'androidGradlePlugin', + '--version', + newAGPVersion, + ]); + + final String updatedGradleSettingsContents = + gradleSettingsFile.readAsStringSync(); + + expect( + updatedGradleSettingsContents, + contains( + r'id "com.android.application" version ' + '"$newAGPVersion" apply false')); + }); + }); group('compileSdk/compileSdkForExamples', () { From 40a46a8d994a90aac10c20ca7f32966f772cdb52 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Mon, 10 Nov 2025 12:03:51 -0800 Subject: [PATCH 03/14] agp to camel case --- .../test/update_dependency_command_test.dart | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index 8a3850d3d8c..3cd702371df 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -908,22 +908,22 @@ distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip }); }); group('agp', () { - final List invalidAGPVersionsFormat = [ + final List invalidAgpVersionsFormat = [ '81', '811.1', '8.123', '8.12.12' ]; - for (final String AGPVersion in invalidAGPVersionsFormat) { - test('throws because AGPVersion: $AGPVersion is invalid', () async { + for (final String agpVersion in invalidAgpVersionsFormat) { + test('throws because agpVersion: $agpVersion is invalid', () async { Error? commandError; final List output = await runCapturingPrint(runner, [ 'update-dependency', '--android-dependency', 'androidGradlePlugin', '--version', - AGPVersion, + agpVersion, ], errorHandler: (Error e) { commandError = e; }); @@ -971,7 +971,7 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus createFakePlugin('fake_plugin', packagesDir, extraFiles: [ 'example/android/settings.gradle' ]); - const String newAGPVersion = '9.9'; + const String newAgpVersion = '9.9'; final File gradleSettingsFile = package.directory .childDirectory('example') @@ -995,7 +995,7 @@ plugins { '--android-dependency', 'androidGradlePlugin', '--version', - newAGPVersion, + newAgpVersion, ]); final String updatedGradleSettingsContents = @@ -1005,7 +1005,7 @@ plugins { updatedGradleSettingsContents, contains( r'id "com.android.application" version ' - '"$newAGPVersion" apply false')); + '"$newAgpVersion" apply false')); }); test( @@ -1018,7 +1018,7 @@ plugins { ], extraFiles: [ 'example/example_2/android/settings.gradle' ]); - const String newAGPVersion = '9.9'; + const String newAgpVersion = '9.9'; final File gradleSettingsFile = package.directory .childDirectory('example') @@ -1043,7 +1043,7 @@ plugins { '--android-dependency', 'androidGradlePlugin', '--version', - newAGPVersion, + newAgpVersion, ]); final String updatedGradleSettingsContents = @@ -1053,7 +1053,7 @@ plugins { updatedGradleSettingsContents, contains( r'id "com.android.application" version ' - '"$newAGPVersion" apply false')); + '"$newAgpVersion" apply false')); }); }); From 716904bac732adbb33e847bfa84a62c53041079b Mon Sep 17 00:00:00 2001 From: jesswrd Date: Mon, 10 Nov 2025 12:04:31 -0800 Subject: [PATCH 04/14] dart format --- .../lib/src/update_dependency_command.dart | 9 +- .../test/update_dependency_command_test.dart | 125 ++++++++---------- 2 files changed, 62 insertions(+), 72 deletions(-) diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index bd880cecd1e..370527872b7 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -167,8 +167,7 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus 3. If present, the third number must have a single digit'''); throw ToolExit(_exitInvalidTargetVersion); } - } else if (_targetAndroidDependency == - _AndroidDepdencyType.compileSdk || + } else if (_targetAndroidDependency == _AndroidDepdencyType.compileSdk || _targetAndroidDependency == _AndroidDepdencyType.compileSdkForExamples) { final RegExp validSdkVersion = RegExp(r'^\d{1,2}$'); @@ -277,8 +276,7 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus } else if (_targetAndroidDependency == _AndroidDepdencyType.gradle || _targetAndroidDependency == _AndroidDepdencyType.compileSdkForExamples || - _targetAndroidDependency == - _AndroidDepdencyType.androidGradlePlugin) { + _targetAndroidDependency == _AndroidDepdencyType.androidGradlePlugin) { return _runForAndroidDependencyOnExamples(package); } @@ -341,7 +339,8 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus _AndroidDepdencyType.androidGradlePlugin) { filesToUpdate.add(androidDirectory.childFile('settings.gradle')); dependencyVersionPattern = RegExp( - r'^\s*id\s+"com\.android\.application"\s+version\s+"(\d{1,2}\.\d{1,2}(?:\.\d)?)"\s+apply\s+false\s*$', multiLine: true); + r'^\s*id\s+"com\.android\.application"\s+version\s+"(\d{1,2}\.\d{1,2}(?:\.\d)?)"\s+apply\s+false\s*$', + multiLine: true); newDependencyVersionEntry = 'id "com.android.application" version "$_targetVersion" apply false'; } else { diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index 3cd702371df..e7982b298c4 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -964,21 +964,19 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus ); }); - test( - 'succeeds if example app has android/settings.gradle structure', - () async { - final RepositoryPackage package = - createFakePlugin('fake_plugin', packagesDir, extraFiles: [ - 'example/android/settings.gradle' - ]); - const String newAgpVersion = '9.9'; + test('succeeds if example app has android/settings.gradle structure', + () async { + final RepositoryPackage package = createFakePlugin( + 'fake_plugin', packagesDir, + extraFiles: ['example/android/settings.gradle']); + const String newAgpVersion = '9.9'; - final File gradleSettingsFile = package.directory - .childDirectory('example') - .childDirectory('android') - .childFile('settings.gradle'); + final File gradleSettingsFile = package.directory + .childDirectory('example') + .childDirectory('android') + .childFile('settings.gradle'); - gradleSettingsFile.writeAsStringSync(r''' + gradleSettingsFile.writeAsStringSync(r''' ... plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" @@ -988,45 +986,40 @@ plugins { ... '''); - await runCapturingPrint(runner, [ - 'update-dependency', - '--packages', - package.displayName, - '--android-dependency', - 'androidGradlePlugin', - '--version', - newAgpVersion, - ]); - - final String updatedGradleSettingsContents = + await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'androidGradlePlugin', + '--version', + newAgpVersion, + ]); + + final String updatedGradleSettingsContents = gradleSettingsFile.readAsStringSync(); - expect( - updatedGradleSettingsContents, - contains( - r'id "com.android.application" version ' - '"$newAgpVersion" apply false')); - }); + expect( + updatedGradleSettingsContents, + contains(r'id "com.android.application" version ' + '"$newAgpVersion" apply false')); + }); - test( - 'succeeds if one example app runs on Android and another does not', - () async { - final RepositoryPackage package = createFakePlugin( - 'fake_plugin', packagesDir, examples: [ - 'example_1', - 'example_2' - ], extraFiles: [ - 'example/example_2/android/settings.gradle' - ]); - const String newAgpVersion = '9.9'; - - final File gradleSettingsFile = package.directory - .childDirectory('example') - .childDirectory('example_2') - .childDirectory('android') - .childFile('settings.gradle'); - - gradleSettingsFile.writeAsStringSync(r''' + test('succeeds if one example app runs on Android and another does not', + () async { + final RepositoryPackage package = createFakePlugin( + 'fake_plugin', packagesDir, + examples: ['example_1', 'example_2'], + extraFiles: ['example/example_2/android/settings.gradle']); + const String newAgpVersion = '9.9'; + + final File gradleSettingsFile = package.directory + .childDirectory('example') + .childDirectory('example_2') + .childDirectory('android') + .childFile('settings.gradle'); + + gradleSettingsFile.writeAsStringSync(r''' ... plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" @@ -1036,26 +1029,24 @@ plugins { ... '''); - await runCapturingPrint(runner, [ - 'update-dependency', - '--packages', - package.displayName, - '--android-dependency', - 'androidGradlePlugin', - '--version', - newAgpVersion, - ]); - - final String updatedGradleSettingsContents = - gradleSettingsFile.readAsStringSync(); + await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'androidGradlePlugin', + '--version', + newAgpVersion, + ]); - expect( - updatedGradleSettingsContents, - contains( - r'id "com.android.application" version ' - '"$newAgpVersion" apply false')); - }); + final String updatedGradleSettingsContents = + gradleSettingsFile.readAsStringSync(); + expect( + updatedGradleSettingsContents, + contains(r'id "com.android.application" version ' + '"$newAgpVersion" apply false')); + }); }); group('compileSdk/compileSdkForExamples', () { From 9492113581bff49f801bf4b2182042ba2671bf48 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Mon, 10 Nov 2025 12:12:07 -0800 Subject: [PATCH 05/14] agp and gradle have same vers req for now --- .../lib/src/update_dependency_command.dart | 26 +++++-------------- .../test/update_dependency_command_test.dart | 25 +++++++----------- 2 files changed, 16 insertions(+), 35 deletions(-) diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index 370527872b7..c115c293dea 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -140,26 +140,14 @@ ${response.httpResponse.body} if (version == null) { printError('A version must be provided to update this dependency.'); throw ToolExit(_exitNoTargetVersion); - } else if (_targetAndroidDependency == _AndroidDepdencyType.gradle) { - final RegExp validGradleVersionPattern = - RegExp(r'^\d{1,2}\.\d{1,2}(?:\.\d)?$'); - final bool isValidGradleVersion = - validGradleVersionPattern.stringMatch(version) == version; - if (!isValidGradleVersion) { - printError(''' -A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) must be provided. - 1. The first number must have one or two digits - 2. The second number must have one or two digits - 3. If present, the third number must have a single digit'''); - throw ToolExit(_exitInvalidTargetVersion); - } - } else if (_targetAndroidDependency == - _AndroidDepdencyType.androidGradlePlugin) { - final RegExp validAGPVersionPattern = + } else if (_targetAndroidDependency == _AndroidDepdencyType.gradle || + _targetAndroidDependency == + _AndroidDepdencyType.androidGradlePlugin) { + final RegExp validGradleAGPVersionPattern = RegExp(r'^\d{1,2}\.\d{1,2}(?:\.\d)?$'); - final bool isValidAGPVersion = - validAGPVersionPattern.stringMatch(version) == version; - if (!isValidAGPVersion) { + final bool isValidGradleAGPVersion = + validGradleAGPVersionPattern.stringMatch(version) == version; + if (!isValidGradleAGPVersion) { printError(''' A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) must be provided. 1. The first number must have one or two digits diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index e7982b298c4..77ce5a35630 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -607,15 +607,15 @@ dev_dependencies: }); group('Android dependencies', () { - group('gradle', () { - final List invalidGradleVersionsFormat = [ - '81', - '811.1', - '8.123', - '8.12.12' - ]; + final List invalidGradleAgpVersionsFormat = [ + '81', + '811.1', + '8.123', + '8.12.12' + ]; - for (final String gradleVersion in invalidGradleVersionsFormat) { + group('gradle', () { + for (final String gradleVersion in invalidGradleAgpVersionsFormat) { test('throws because gradleVersion: $gradleVersion is invalid', () async { Error? commandError; @@ -908,14 +908,7 @@ distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip }); }); group('agp', () { - final List invalidAgpVersionsFormat = [ - '81', - '811.1', - '8.123', - '8.12.12' - ]; - - for (final String agpVersion in invalidAgpVersionsFormat) { + for (final String agpVersion in invalidGradleAgpVersionsFormat) { test('throws because agpVersion: $agpVersion is invalid', () async { Error? commandError; final List output = await runCapturingPrint(runner, [ From 049e1df59aa12a1d900067885f8a21baf0c6c562 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Mon, 10 Nov 2025 12:15:35 -0800 Subject: [PATCH 06/14] fix spelling --- .../lib/src/update_dependency_command.dart | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index c115c293dea..8ada86623d1 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -43,19 +43,19 @@ class UpdateDependencyCommand extends PackageLoopingCommand { argParser.addOption(_androidDependency, help: 'An Android dependency to update.', allowed: [ - _AndroidDepdencyType.gradle, - _AndroidDepdencyType.androidGradlePlugin, - _AndroidDepdencyType.compileSdk, - _AndroidDepdencyType.compileSdkForExamples, + _AndroidDependencyType.gradle, + _AndroidDependencyType.androidGradlePlugin, + _AndroidDependencyType.compileSdk, + _AndroidDependencyType.compileSdkForExamples, ], allowedHelp: { - _AndroidDepdencyType.gradle: + _AndroidDependencyType.gradle: 'Updates Gradle version used in plugin example apps.', - _AndroidDepdencyType.androidGradlePlugin: + _AndroidDependencyType.androidGradlePlugin: 'Updates AGP version used in plugin example apps.', - _AndroidDepdencyType.compileSdk: + _AndroidDependencyType.compileSdk: 'Updates compileSdk version used to compile plugins.', - _AndroidDepdencyType.compileSdkForExamples: + _AndroidDependencyType.compileSdkForExamples: 'Updates compileSdk version used to compile plugin examples.', }); argParser.addOption( @@ -140,9 +140,9 @@ ${response.httpResponse.body} if (version == null) { printError('A version must be provided to update this dependency.'); throw ToolExit(_exitNoTargetVersion); - } else if (_targetAndroidDependency == _AndroidDepdencyType.gradle || + } else if (_targetAndroidDependency == _AndroidDependencyType.gradle || _targetAndroidDependency == - _AndroidDepdencyType.androidGradlePlugin) { + _AndroidDependencyType.androidGradlePlugin) { final RegExp validGradleAGPVersionPattern = RegExp(r'^\d{1,2}\.\d{1,2}(?:\.\d)?$'); final bool isValidGradleAGPVersion = @@ -155,9 +155,9 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus 3. If present, the third number must have a single digit'''); throw ToolExit(_exitInvalidTargetVersion); } - } else if (_targetAndroidDependency == _AndroidDepdencyType.compileSdk || + } else if (_targetAndroidDependency == _AndroidDependencyType.compileSdk || _targetAndroidDependency == - _AndroidDepdencyType.compileSdkForExamples) { + _AndroidDependencyType.compileSdkForExamples) { final RegExp validSdkVersion = RegExp(r'^\d{1,2}$'); final bool isValidSdkVersion = validSdkVersion.stringMatch(version) == version; @@ -259,12 +259,12 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus /// an Android dependency. Future _runForAndroidDependency( RepositoryPackage package) async { - if (_targetAndroidDependency == _AndroidDepdencyType.compileSdk) { + if (_targetAndroidDependency == _AndroidDependencyType.compileSdk) { return _runForCompileSdkVersion(package); - } else if (_targetAndroidDependency == _AndroidDepdencyType.gradle || + } else if (_targetAndroidDependency == _AndroidDependencyType.gradle || _targetAndroidDependency == - _AndroidDepdencyType.compileSdkForExamples || - _targetAndroidDependency == _AndroidDepdencyType.androidGradlePlugin) { + _AndroidDependencyType.compileSdkForExamples || + _targetAndroidDependency == _AndroidDependencyType.androidGradlePlugin) { return _runForAndroidDependencyOnExamples(package); } @@ -289,7 +289,7 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus final RegExp dependencyVersionPattern; final String newDependencyVersionEntry; - if (_targetAndroidDependency == _AndroidDepdencyType.gradle) { + if (_targetAndroidDependency == _AndroidDependencyType.gradle) { if (androidDirectory .childDirectory('gradle') .childDirectory('wrapper') @@ -317,14 +317,14 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus newDependencyVersionEntry = 'distributionUrl=https\\://services.gradle.org/distributions/gradle-$_targetVersion-all.zip'; } else if (_targetAndroidDependency == - _AndroidDepdencyType.compileSdkForExamples) { + _AndroidDependencyType.compileSdkForExamples) { filesToUpdate.add( androidDirectory.childDirectory('app').childFile('build.gradle')); dependencyVersionPattern = RegExp( r'(compileSdk|compileSdkVersion) (\d{1,2}|flutter.compileSdkVersion)'); newDependencyVersionEntry = 'compileSdk $_targetVersion'; } else if (_targetAndroidDependency == - _AndroidDepdencyType.androidGradlePlugin) { + _AndroidDependencyType.androidGradlePlugin) { filesToUpdate.add(androidDirectory.childFile('settings.gradle')); dependencyVersionPattern = RegExp( r'^\s*id\s+"com\.android\.application"\s+version\s+"(\d{1,2}\.\d{1,2}(?:\.\d)?)"\s+apply\s+false\s*$', @@ -518,7 +518,7 @@ class _PubDependencyInfo { enum _PubDependencyType { normal, dev } -class _AndroidDepdencyType { +class _AndroidDependencyType { static const String gradle = 'gradle'; static const String androidGradlePlugin = 'androidGradlePlugin'; static const String compileSdk = 'compileSdk'; From 46e610adf0c01a200f566860732ea51feccc03ca Mon Sep 17 00:00:00 2001 From: jesswrd Date: Mon, 10 Nov 2025 13:51:07 -0800 Subject: [PATCH 07/14] ensure file exists and format --- script/tool/lib/src/update_dependency_command.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index 8ada86623d1..cf2ee4b7664 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -155,7 +155,8 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus 3. If present, the third number must have a single digit'''); throw ToolExit(_exitInvalidTargetVersion); } - } else if (_targetAndroidDependency == _AndroidDependencyType.compileSdk || + } else if (_targetAndroidDependency == + _AndroidDependencyType.compileSdk || _targetAndroidDependency == _AndroidDependencyType.compileSdkForExamples) { final RegExp validSdkVersion = RegExp(r'^\d{1,2}$'); @@ -264,7 +265,8 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus } else if (_targetAndroidDependency == _AndroidDependencyType.gradle || _targetAndroidDependency == _AndroidDependencyType.compileSdkForExamples || - _targetAndroidDependency == _AndroidDependencyType.androidGradlePlugin) { + _targetAndroidDependency == + _AndroidDependencyType.androidGradlePlugin) { return _runForAndroidDependencyOnExamples(package); } @@ -325,7 +327,9 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus newDependencyVersionEntry = 'compileSdk $_targetVersion'; } else if (_targetAndroidDependency == _AndroidDependencyType.androidGradlePlugin) { - filesToUpdate.add(androidDirectory.childFile('settings.gradle')); + if (androidDirectory.childFile('settings.gradle').existsSync()) { + filesToUpdate.add(androidDirectory.childFile('settings.gradle')); + } dependencyVersionPattern = RegExp( r'^\s*id\s+"com\.android\.application"\s+version\s+"(\d{1,2}\.\d{1,2}(?:\.\d)?)"\s+apply\s+false\s*$', multiLine: true); From 32577a8dbf023f8f44bb4f4ee2e22f397f7d6b3c Mon Sep 17 00:00:00 2001 From: Jessie Wong Date: Wed, 12 Nov 2025 13:05:56 -0800 Subject: [PATCH 08/14] added kgp to bulk update tool --- customer_testing.bat | 32 ++-- .../lib/src/update_dependency_command.dart | 30 +++- .../test/update_dependency_command_test.dart | 146 ++++++++++++++++++ 3 files changed, 191 insertions(+), 17 deletions(-) diff --git a/customer_testing.bat b/customer_testing.bat index 375f20d0138..ada0a9e6115 100644 --- a/customer_testing.bat +++ b/customer_testing.bat @@ -1,16 +1,16 @@ -REM This file is used by -REM https://github.com/flutter/tests/tree/master/registry/flutter_packages.test -REM to run the tests of certain packages in this repository as a presubmit -REM for the flutter/flutter repository. -REM Changes to this file (and any tests in this repository) are only honored -REM after the commit hash in the "flutter_packages.test" mentioned above has -REM been updated. -REM Remember to also update the Posix version (customer_testing.sh) when -REM changing this file. - -CD packages/animations -CALL flutter analyze --no-fatal-infos -CALL flutter test - -REM We don't run the tests in packages/rfw because those tests are -REM platform-sensitive and only work reliably on Linux. +REM This file is used by +REM https://github.com/flutter/tests/tree/master/registry/flutter_packages.test +REM to run the tests of certain packages in this repository as a presubmit +REM for the flutter/flutter repository. +REM Changes to this file (and any tests in this repository) are only honored +REM after the commit hash in the "flutter_packages.test" mentioned above has +REM been updated. +REM Remember to also update the Posix version (customer_testing.sh) when +REM changing this file. + +CD packages/animations +CALL flutter analyze --no-fatal-infos +CALL flutter test + +REM We don't run the tests in packages/rfw because those tests are +REM platform-sensitive and only work reliably on Linux. diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index cf2ee4b7664..75edbd26731 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -45,6 +45,7 @@ class UpdateDependencyCommand extends PackageLoopingCommand { allowed: [ _AndroidDependencyType.gradle, _AndroidDependencyType.androidGradlePlugin, + _AndroidDependencyType.kotlinGradlePlugin, _AndroidDependencyType.compileSdk, _AndroidDependencyType.compileSdkForExamples, ], @@ -53,6 +54,8 @@ class UpdateDependencyCommand extends PackageLoopingCommand { 'Updates Gradle version used in plugin example apps.', _AndroidDependencyType.androidGradlePlugin: 'Updates AGP version used in plugin example apps.', + _AndroidDependencyType.kotlinGradlePlugin: + 'Updates KGP version used in plugin example apps.', _AndroidDependencyType.compileSdk: 'Updates compileSdk version used to compile plugins.', _AndroidDependencyType.compileSdkForExamples: @@ -155,6 +158,19 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus 3. If present, the third number must have a single digit'''); throw ToolExit(_exitInvalidTargetVersion); } + } else if (_targetAndroidDependency == + _AndroidDependencyType.kotlinGradlePlugin) { + final RegExp validKgpVersionPattern = RegExp(r'^\d\.\d\.\d{1,2}$'); + final bool isValidKgpVersion = + validKgpVersionPattern.stringMatch(version) == version; + if (!isValidKgpVersion) { + printError(''' +A version with a valid format (3 numbers separated by 2 periods) must be provided. + 1. The first number must have one digit + 2. The second number must have one digit + 3. The third number must have one or two digits'''); + throw ToolExit(_exitInvalidTargetVersion); + } } else if (_targetAndroidDependency == _AndroidDependencyType.compileSdk || _targetAndroidDependency == @@ -266,7 +282,8 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus _targetAndroidDependency == _AndroidDependencyType.compileSdkForExamples || _targetAndroidDependency == - _AndroidDependencyType.androidGradlePlugin) { + _AndroidDependencyType.androidGradlePlugin || + _targetAndroidDependency == _AndroidDependencyType.kotlinGradlePlugin) { return _runForAndroidDependencyOnExamples(package); } @@ -335,6 +352,16 @@ A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) mus multiLine: true); newDependencyVersionEntry = 'id "com.android.application" version "$_targetVersion" apply false'; + } else if (_targetAndroidDependency == + _AndroidDependencyType.kotlinGradlePlugin) { + if (androidDirectory.childFile('settings.gradle').existsSync()) { + filesToUpdate.add(androidDirectory.childFile('settings.gradle')); + } + dependencyVersionPattern = RegExp( + r'^\s*id\s+"org\.jetbrains\.kotlin\.android"\s+version\s+"(\d\.\d\.\d{1,2})"\s+apply\s+false\s*$', + multiLine: true); + newDependencyVersionEntry = + 'id "org.jetbrains.kotlin.android" version "$_targetVersion" apply false'; } else { printError( 'Target Android dependency $_targetAndroidDependency is unrecognized.'); @@ -525,6 +552,7 @@ enum _PubDependencyType { normal, dev } class _AndroidDependencyType { static const String gradle = 'gradle'; static const String androidGradlePlugin = 'androidGradlePlugin'; + static const String kotlinGradlePlugin = 'kotlinGradlePlugin'; static const String compileSdk = 'compileSdk'; static const String compileSdkForExamples = 'compileSdkForExamples'; } diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index 77ce5a35630..e03a3c9d47d 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -1041,6 +1041,152 @@ plugins { '"$newAgpVersion" apply false')); }); }); + group('kgp', () { + final List invalidKgpVersionsFormat = [ + '81', + '81.1', + '8.123', + '8.12.12', + '8.12.1', + ]; + + for (final String kgpVersion in invalidKgpVersionsFormat) { + test('throws because kgpVersion: $kgpVersion is invalid', () async { + Error? commandError; + final List output = await runCapturingPrint(runner, [ + 'update-dependency', + '--android-dependency', + 'kotlinGradlePlugin', + '--version', + kgpVersion, + ], errorHandler: (Error e) { + commandError = e; + }); + + expect(commandError, isA()); + expect( + output, + containsAllInOrder([ + contains(''' +A version with a valid format (3 numbers separated by 2 periods) must be provided. + 1. The first number must have one digit + 2. The second number must have one digit + 3. The third number must have one or two digits'''), + ]), + ); + }); + } + + test('skips if example app does not run on Android', () async { + final RepositoryPackage package = + createFakePlugin('fake_plugin', packagesDir); + + final List output = await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'kotlinGradlePlugin', + '--version', + '2.2.20', + ], errorHandler: (Error e) { + print((e as ToolExit).stackTrace); + }); + + expect( + output, + containsAllInOrder([ + contains('SKIPPING: No example apps run on Android.'), + ]), + ); + }); + + test('succeeds if example app has android/settings.gradle structure', + () async { + final RepositoryPackage package = createFakePlugin( + 'fake_plugin', packagesDir, + extraFiles: ['example/android/settings.gradle']); + const String newKgpVersion = '2.2.20'; + + final File gradleSettingsFile = package.directory + .childDirectory('example') + .childDirectory('android') + .childFile('settings.gradle'); + + gradleSettingsFile.writeAsStringSync(r''' +... +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + ... + id "org.jetbrains.kotlin.android" version "2.2.20" apply false +... +} +... +'''); + + await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'kotlinGradlePlugin', + '--version', + newKgpVersion, + ]); + + final String updatedGradleSettingsContents = + gradleSettingsFile.readAsStringSync(); + + expect( + updatedGradleSettingsContents, + contains(r'id "org.jetbrains.kotlin.android" version ' + '"$newKgpVersion" apply false')); + }); + + test('succeeds if one example app runs on Android and another does not', + () async { + final RepositoryPackage package = createFakePlugin( + 'fake_plugin', packagesDir, + examples: ['example_1', 'example_2'], + extraFiles: ['example/example_2/android/settings.gradle']); + const String newKgpVersion = '2.2.20'; + + final File gradleSettingsFile = package.directory + .childDirectory('example') + .childDirectory('example_2') + .childDirectory('android') + .childFile('settings.gradle'); + + gradleSettingsFile.writeAsStringSync(r''' +... +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + ... + id "org.jetbrains.kotlin.android" version "2.2.20" apply false +... +} +... +'''); + + await runCapturingPrint(runner, [ + 'update-dependency', + '--packages', + package.displayName, + '--android-dependency', + 'kotlinGradlePlugin', + '--version', + newKgpVersion, + ]); + + final String updatedGradleSettingsContents = + gradleSettingsFile.readAsStringSync(); + + expect( + updatedGradleSettingsContents, + contains(r'id "org.jetbrains.kotlin.android" version ' + '"$newKgpVersion" apply false')); + }); + }); group('compileSdk/compileSdkForExamples', () { // Tests if the compileSdk version is updated for the provided From 0788d8137559ec16110c21373ade4cd1527ca998 Mon Sep 17 00:00:00 2001 From: Jessie Wong Date: Wed, 12 Nov 2025 14:01:48 -0800 Subject: [PATCH 09/14] removed extra .bat file --- customer_testing.bat | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 customer_testing.bat diff --git a/customer_testing.bat b/customer_testing.bat deleted file mode 100644 index ada0a9e6115..00000000000 --- a/customer_testing.bat +++ /dev/null @@ -1,16 +0,0 @@ -REM This file is used by -REM https://github.com/flutter/tests/tree/master/registry/flutter_packages.test -REM to run the tests of certain packages in this repository as a presubmit -REM for the flutter/flutter repository. -REM Changes to this file (and any tests in this repository) are only honored -REM after the commit hash in the "flutter_packages.test" mentioned above has -REM been updated. -REM Remember to also update the Posix version (customer_testing.sh) when -REM changing this file. - -CD packages/animations -CALL flutter analyze --no-fatal-infos -CALL flutter test - -REM We don't run the tests in packages/rfw because those tests are -REM platform-sensitive and only work reliably on Linux. From 6b088696088c2ecd3aba46cafc749787e2a7d4f5 Mon Sep 17 00:00:00 2001 From: Jessie Wong Date: Wed, 12 Nov 2025 14:21:08 -0800 Subject: [PATCH 10/14] revive customer_testing.bat file --- customer_testing.bat | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 customer_testing.bat diff --git a/customer_testing.bat b/customer_testing.bat new file mode 100644 index 00000000000..0ce0ff5dc9f --- /dev/null +++ b/customer_testing.bat @@ -0,0 +1,16 @@ +REM This file is used by +REM https://github.com/flutter/tests/tree/master/registry/flutter_packages.test +REM to run the tests of certain packages in this repository as a presubmit +REM for the flutter/flutter repository. +REM Changes to this file (and any tests in this repository) are only honored +REM after the commit hash in the "flutter_packages.test" mentioned above has +REM been updated. +REM Remember to also update the Posix version (customer_testing.sh) when +REM changing this file. + +CD packages/animations +CALL flutter analyze --no-fatal-infos +CALL flutter test + +REM We don't run the tests in packages/rfw because those tests are +REM platform-sensitive and only work reliably on Linux. \ No newline at end of file From f4282b283d7b30c3b32366930386125deeb5a22d Mon Sep 17 00:00:00 2001 From: Jessie Wong Date: Wed, 12 Nov 2025 14:47:01 -0800 Subject: [PATCH 11/14] added missing new line --- customer_testing.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/customer_testing.bat b/customer_testing.bat index 0ce0ff5dc9f..375f20d0138 100644 --- a/customer_testing.bat +++ b/customer_testing.bat @@ -13,4 +13,4 @@ CALL flutter analyze --no-fatal-infos CALL flutter test REM We don't run the tests in packages/rfw because those tests are -REM platform-sensitive and only work reliably on Linux. \ No newline at end of file +REM platform-sensitive and only work reliably on Linux. From 681c7e72725ae7ef0bc473a502ad52b4c168d418 Mon Sep 17 00:00:00 2001 From: Jessie Wong Date: Wed, 12 Nov 2025 16:30:48 -0800 Subject: [PATCH 12/14] added spaces kotlin --- script/tool/lib/src/update_dependency_command.dart | 2 +- script/tool/test/update_dependency_command_test.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index 75edbd26731..33adb389fcf 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -361,7 +361,7 @@ A version with a valid format (3 numbers separated by 2 periods) must be provide r'^\s*id\s+"org\.jetbrains\.kotlin\.android"\s+version\s+"(\d\.\d\.\d{1,2})"\s+apply\s+false\s*$', multiLine: true); newDependencyVersionEntry = - 'id "org.jetbrains.kotlin.android" version "$_targetVersion" apply false'; + ' id "org.jetbrains.kotlin.android" version "$_targetVersion" apply false'; } else { printError( 'Target Android dependency $_targetAndroidDependency is unrecognized.'); diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index e03a3c9d47d..8ece77c5d43 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -1139,7 +1139,7 @@ plugins { expect( updatedGradleSettingsContents, - contains(r'id "org.jetbrains.kotlin.android" version ' + contains(r' id "org.jetbrains.kotlin.android" version ' '"$newKgpVersion" apply false')); }); @@ -1183,7 +1183,7 @@ plugins { expect( updatedGradleSettingsContents, - contains(r'id "org.jetbrains.kotlin.android" version ' + contains(r' id "org.jetbrains.kotlin.android" version ' '"$newKgpVersion" apply false')); }); }); From 46b9b9e5071c8ad24c2286781f8150b2caf4b88c Mon Sep 17 00:00:00 2001 From: jesswrd Date: Thu, 13 Nov 2025 16:20:38 -0800 Subject: [PATCH 13/14] merge conflict too fast --- script/tool/lib/src/update_dependency_command.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/tool/lib/src/update_dependency_command.dart b/script/tool/lib/src/update_dependency_command.dart index 0dbf80f2f22..33adb389fcf 100644 --- a/script/tool/lib/src/update_dependency_command.dart +++ b/script/tool/lib/src/update_dependency_command.dart @@ -58,7 +58,7 @@ class UpdateDependencyCommand extends PackageLoopingCommand { 'Updates KGP version used in plugin example apps.', _AndroidDependencyType.compileSdk: 'Updates compileSdk version used to compile plugins.', - _AndroidDepdencyType.compileSdkForExamples: + _AndroidDependencyType.compileSdkForExamples: 'Updates compileSdk version used to compile plugin examples.', }); argParser.addOption( @@ -174,7 +174,7 @@ A version with a valid format (3 numbers separated by 2 periods) must be provide } else if (_targetAndroidDependency == _AndroidDependencyType.compileSdk || _targetAndroidDependency == - _AndroidDepdencyType.compileSdkForExamples) { + _AndroidDependencyType.compileSdkForExamples) { final RegExp validSdkVersion = RegExp(r'^\d{1,2}$'); final bool isValidSdkVersion = validSdkVersion.stringMatch(version) == version; From 6614ee72db80b668be80226a2afa96efc2b5f994 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Fri, 14 Nov 2025 10:37:09 -0800 Subject: [PATCH 14/14] added invalid error message constants to test --- .../test/update_dependency_command_test.dart | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/script/tool/test/update_dependency_command_test.dart b/script/tool/test/update_dependency_command_test.dart index 8ece77c5d43..738e57d0c57 100644 --- a/script/tool/test/update_dependency_command_test.dart +++ b/script/tool/test/update_dependency_command_test.dart @@ -614,6 +614,18 @@ dev_dependencies: '8.12.12' ]; + const String invalidGradleAgpVersionError = ''' +A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) must be provided. + 1. The first number must have one or two digits + 2. The second number must have one or two digits + 3. If present, the third number must have a single digit'''; + + const String invalidKgpVersionError = ''' +A version with a valid format (3 numbers separated by 2 periods) must be provided. + 1. The first number must have one digit + 2. The second number must have one digit + 3. The third number must have one or two digits'''; + group('gradle', () { for (final String gradleVersion in invalidGradleAgpVersionsFormat) { test('throws because gradleVersion: $gradleVersion is invalid', @@ -633,11 +645,7 @@ dev_dependencies: expect( output, containsAllInOrder([ - contains(''' -A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) must be provided. - 1. The first number must have one or two digits - 2. The second number must have one or two digits - 3. If present, the third number must have a single digit'''), + contains(invalidGradleAgpVersionError), ]), ); }); @@ -925,11 +933,7 @@ distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip expect( output, containsAllInOrder([ - contains(''' -A version with a valid format (maximum 2-3 numbers separated by 1-2 periods) must be provided. - 1. The first number must have one or two digits - 2. The second number must have one or two digits - 3. If present, the third number must have a single digit'''), + contains(invalidGradleAgpVersionError), ]), ); }); @@ -1067,11 +1071,7 @@ plugins { expect( output, containsAllInOrder([ - contains(''' -A version with a valid format (3 numbers separated by 2 periods) must be provided. - 1. The first number must have one digit - 2. The second number must have one digit - 3. The third number must have one or two digits'''), + contains(invalidKgpVersionError), ]), ); });