From 41211ba0e62f72660f2553886b586efdf25a218e Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Tue, 3 Feb 2026 10:43:09 -0800 Subject: [PATCH 1/9] [ci] updates release info command to support batch release --- .../lib/src/update_release_info_command.dart | 119 +++++++--- .../update_release_info_command_test.dart | 220 ++++++++++++++++++ 2 files changed, 313 insertions(+), 26 deletions(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index 0224596f875f..87807d0393a1 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -108,12 +108,20 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { default: throw UnimplementedError('Unimplemented version change type'); } + + await for (final entry in getPackagesToProcess()) { + if ((entry.package.parseCIConfig()?.isBatchRelease ?? false) && + (entry.package.parsePubspec().version?.isPreRelease ?? false)) { + throw UsageException( + 'Batch release does not support pre-release versions.', + usage, + ); + } + } } @override Future runForPackage(RepositoryPackage package) async { - String nextVersionString; - _VersionIncrementType? versionChange = _versionChange; // If the change type is `minimal` determine what changes, if any, are @@ -144,36 +152,20 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { } } - if (versionChange != null) { - final Version? updatedVersion = _updatePubspecVersion( + // For batch release, create a pending changelog entry instead of updating + // the files directly. + final CIConfig? ciConfig = package.parseCIConfig(); + if (ciConfig?.isBatchRelease ?? false) { + return _createPendingChangelog( package, - versionChange, + versionChange: versionChange, ); - if (updatedVersion == null) { - return PackageResult.fail([ - 'Could not determine current version.', - ]); - } - nextVersionString = updatedVersion.toString(); - print('${indentation}Incremented version to $nextVersionString.'); - } else { - nextVersionString = 'NEXT'; } - final _ChangelogUpdateOutcome updateOutcome = _updateChangelog( + return _updateReleaseDirectly( package, - nextVersionString, + versionChange: versionChange, ); - switch (updateOutcome) { - case _ChangelogUpdateOutcome.addedSection: - print('${indentation}Added a $nextVersionString section.'); - case _ChangelogUpdateOutcome.updatedSection: - print('${indentation}Updated NEXT section.'); - case _ChangelogUpdateOutcome.failed: - return PackageResult.fail(['Could not update CHANGELOG.md.']); - } - - return PackageResult.success(); } _ChangelogUpdateOutcome _updateChangelog( @@ -314,4 +306,79 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { ); } } + + Future _updateReleaseDirectly( + RepositoryPackage package, { + _VersionIncrementType? versionChange, + }) async { + String nextVersionString; + if (versionChange != null) { + final Version? updatedVersion = _updatePubspecVersion( + package, + versionChange, + ); + if (updatedVersion == null) { + return PackageResult.fail([ + 'Could not determine current version.', + ]); + } + nextVersionString = updatedVersion.toString(); + print('${indentation}Incremented version to $nextVersionString.'); + } else { + nextVersionString = 'NEXT'; + } + + final _ChangelogUpdateOutcome updateOutcome = _updateChangelog( + package, + nextVersionString, + ); + switch (updateOutcome) { + case _ChangelogUpdateOutcome.addedSection: + print('${indentation}Added a $nextVersionString section.'); + case _ChangelogUpdateOutcome.updatedSection: + print('${indentation}Updated NEXT section.'); + case _ChangelogUpdateOutcome.failed: + return PackageResult.fail(['Could not update CHANGELOG.md.']); + } + + return PackageResult.success(); + } + + Future _createPendingChangelog( + RepositoryPackage package, { + _VersionIncrementType? versionChange, + }) async { + final VersionChange type; + switch (versionChange) { + case _VersionIncrementType.minor: + type = VersionChange.minor; + case _VersionIncrementType.bugfix: + type = VersionChange.patch; + case _VersionIncrementType.build: + throw UnimplementedError( + 'Build version changes should not happen in batch mode. Please file an issue if you see this.', + ); + case null: + type = VersionChange.skip; + } + + final String changelogEntry = getStringArg(_changelogFlag); + final content = + ''' +changelog: | +${changelogEntry.split('\n').map((line) => ' - $line').join('\n')} +version: ${type.name} +'''; + + final Directory pendingDirectory = package.pendingChangelogsDirectory; + if (!pendingDirectory.existsSync()) { + pendingDirectory.createSync(); + } + + final filename = 'change_${DateTime.now().millisecondsSinceEpoch}.yaml'; + final File file = pendingDirectory.childFile(filename); + file.writeAsStringSync(content); + print('${indentation}Created pending changelog entry: $filename'); + return PackageResult.success(); + } } diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index 0ad6888008f7..4927d43471c3 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -779,4 +779,224 @@ packages/a_package/test/plugin_test.dart ); }); }); + + group('batch release', () { + test('creates pending changelog for bugfix', () async { + final RepositoryPackage package = createFakePackage( + 'a_package', + packagesDir, + version: '1.0.0', + ); + package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + const originalChangelog = ''' +## 1.0.0 + +* Previous changes. +'''; + package.changelogFile.writeAsStringSync(originalChangelog); + + final List output = await runCapturingPrint(runner, [ + 'update-release-info', + '--version=bugfix', + '--changelog', + 'A change.', + ]); + + final String version = package.parsePubspec().version?.toString() ?? ''; + expect(version, '1.0.0'); + expect(package.changelogFile.readAsStringSync(), originalChangelog); + expect( + output, + containsAllInOrder([ + contains(' Created pending changelog entry: change_'), + ]), + ); + + final List pendingFiles = package.pendingChangelogsDirectory + .listSync() + .whereType() + .toList(); + expect(pendingFiles, hasLength(1)); + final String content = pendingFiles.first.readAsStringSync(); + expect(content, contains('changelog: |\n - A change.')); + expect(content, contains('version: patch')); + }); + + test('creates pending changelog for minor', () async { + final RepositoryPackage package = createFakePackage( + 'a_package', + packagesDir, + version: '1.0.0', + ); + package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + + final List output = await runCapturingPrint(runner, [ + 'update-release-info', + '--version=minor', + '--changelog', + 'A change.', + ]); + + expect( + output, + containsAllInOrder([ + contains(' Created pending changelog entry: change_'), + ]), + ); + + final List pendingFiles = package.pendingChangelogsDirectory + .listSync() + .whereType() + .toList(); + expect(pendingFiles, hasLength(1)); + final String content = pendingFiles.first.readAsStringSync(); + expect(content, contains('version: minor')); + }); + + test('creates pending changelog for next (skip)', () async { + final RepositoryPackage package = createFakePackage( + 'a_package', + packagesDir, + version: '1.0.0', + ); + package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + + final List output = await runCapturingPrint(runner, [ + 'update-release-info', + '--version=next', + '--changelog', + 'A change.', + ]); + + expect( + output, + containsAllInOrder([ + contains(' Created pending changelog entry: change_'), + ]), + ); + + final List pendingFiles = package.pendingChangelogsDirectory + .listSync() + .whereType() + .toList(); + expect(pendingFiles, hasLength(1)); + final String content = pendingFiles.first.readAsStringSync(); + expect(content, contains('version: skip')); + }); + + test( + 'creates pending changelog for minimal with publish-worthy changes', + () async { + final RepositoryPackage package = createFakePackage( + 'a_package', + packagesDir, + version: '1.0.0', + ); + package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + gitProcessRunner.mockProcessesForExecutable['git-diff'] = + [ + FakeProcessInfo( + MockProcess( + stdout: ''' +packages/a_package/lib/plugin.dart +''', + ), + ), + ]; + + final List output = await runCapturingPrint(runner, [ + 'update-release-info', + '--version=minimal', + '--changelog', + 'A change.', + ]); + + expect( + output, + containsAllInOrder([ + contains(' Created pending changelog entry: change_'), + ]), + ); + + final List pendingFiles = package.pendingChangelogsDirectory + .listSync() + .whereType() + .toList(); + expect(pendingFiles, hasLength(1)); + final String content = pendingFiles.first.readAsStringSync(); + expect(content, contains('version: patch')); + }, + ); + + test('skips for minimal with no changes (batch mode)', () async { + final RepositoryPackage package = createFakePackage( + 'a_package', + packagesDir, + version: '1.0.0', + ); + package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + gitProcessRunner.mockProcessesForExecutable['git-diff'] = + [ + FakeProcessInfo( + MockProcess( + stdout: ''' +packages/different_package/lib/foo.dart +''', + ), + ), + ]; + + final List output = await runCapturingPrint(runner, [ + 'update-release-info', + '--version=minimal', + '--changelog', + 'A change.', + ]); + + expect( + output, + containsAllInOrder([ + contains('No changes to package'), + contains('Skipped 1 package'), + ]), + ); + // No pending changelog should be created. + expect(package.pendingChangelogsDirectory.existsSync(), isFalse); + }); + + test('fails for pre-release version', () async { + final RepositoryPackage package = createFakePackage( + 'a_package', + packagesDir, + version: '1.0.0-dev.1', + ); + package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + const originalChangelog = ''' +## 1.0.0-dev.1 + +* Previous changes. +'''; + package.changelogFile.writeAsStringSync(originalChangelog); + + Exception? commandError; + await runCapturingPrint( + runner, + [ + 'update-release-info', + '--version=bugfix', + '--changelog', + 'A change.', + ], + exceptionHandler: (Exception e) { + commandError = e; + }, + ); + + expect(commandError, isA()); + expect( + commandError.toString(), + contains('Batch release does not support pre-release versions.'), + ); + }); + }); } From caa018fb45f85d06ff9e3419b44edb42b69aa53a Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Tue, 3 Feb 2026 10:52:51 -0800 Subject: [PATCH 2/9] update --- .../tool/lib/src/update_release_info_command.dart | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index 87807d0393a1..e921f1b43cbe 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -8,6 +8,7 @@ import 'package:pub_semver/pub_semver.dart'; import 'package:yaml_edit/yaml_edit.dart'; import 'common/output_utils.dart'; +import 'common/package_command.dart'; import 'common/package_looping_command.dart'; import 'common/package_state_utils.dart'; import 'common/repository_package.dart'; @@ -109,7 +110,7 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { throw UnimplementedError('Unimplemented version change type'); } - await for (final entry in getPackagesToProcess()) { + await for (final PackageEnumerationEntry entry in getPackagesToProcess()) { if ((entry.package.parseCIConfig()?.isBatchRelease ?? false) && (entry.package.parsePubspec().version?.isPreRelease ?? false)) { throw UsageException( @@ -152,20 +153,12 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { } } - // For batch release, create a pending changelog entry instead of updating - // the files directly. final CIConfig? ciConfig = package.parseCIConfig(); if (ciConfig?.isBatchRelease ?? false) { - return _createPendingChangelog( - package, - versionChange: versionChange, - ); + return _createPendingChangelog(package, versionChange: versionChange); } - return _updateReleaseDirectly( - package, - versionChange: versionChange, - ); + return _updateReleaseDirectly(package, versionChange: versionChange); } _ChangelogUpdateOutcome _updateChangelog( From 5b193543dc23b87e6946b9c0946fd0703145fec9 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Wed, 4 Feb 2026 09:56:33 -0800 Subject: [PATCH 3/9] update --- script/tool/lib/src/update_release_info_command.dart | 4 +++- script/tool/test/update_release_info_command_test.dart | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index e921f1b43cbe..ceb8f5befaa4 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -114,7 +114,9 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { if ((entry.package.parseCIConfig()?.isBatchRelease ?? false) && (entry.package.parsePubspec().version?.isPreRelease ?? false)) { throw UsageException( - 'Batch release does not support pre-release versions.', + 'This command does not support batch releases packages with pre-release versions.\n' + 'Offending package: ${entry.package.displayName}\n' + 'Pre-release version: ${entry.package.parsePubspec().version}\n', usage, ); } diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index 4927d43471c3..4dd27011293f 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -995,7 +995,11 @@ packages/different_package/lib/foo.dart expect(commandError, isA()); expect( commandError.toString(), - contains('Batch release does not support pre-release versions.'), + contains( + 'This command does not support batch releases packages with pre-release versions.\n' + 'Offending package: a_package\n' + 'Pre-release version: 1.0.0-dev.1', + ), ); }); }); From d041d09caf9260fedb32801eafedcf50ce50ae07 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Wed, 4 Feb 2026 10:19:41 -0800 Subject: [PATCH 4/9] update --- script/tool/lib/src/update_release_info_command.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index ceb8f5befaa4..93120987e00e 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -111,12 +111,13 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { } await for (final PackageEnumerationEntry entry in getPackagesToProcess()) { + final Version? version = entry.package.parsePubspec().version; if ((entry.package.parseCIConfig()?.isBatchRelease ?? false) && - (entry.package.parsePubspec().version?.isPreRelease ?? false)) { + (version?.isPreRelease ?? false)) { throw UsageException( 'This command does not support batch releases packages with pre-release versions.\n' 'Offending package: ${entry.package.displayName}\n' - 'Pre-release version: ${entry.package.parsePubspec().version}\n', + 'Pre-release version: $version\n', usage, ); } From c63c6d37a374ae90fa8d4e5e12ffdb52a3286a60 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 5 Feb 2026 13:28:28 -0800 Subject: [PATCH 5/9] addressing comments --- .../lib/src/update_release_info_command.dart | 58 +++++++++++-------- .../update_release_info_command_test.dart | 17 +++--- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index 93120987e00e..09bb36536e7d 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -8,7 +8,7 @@ import 'package:pub_semver/pub_semver.dart'; import 'package:yaml_edit/yaml_edit.dart'; import 'common/output_utils.dart'; -import 'common/package_command.dart'; + import 'common/package_looping_command.dart'; import 'common/package_state_utils.dart'; import 'common/repository_package.dart'; @@ -109,23 +109,19 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { default: throw UnimplementedError('Unimplemented version change type'); } - - await for (final PackageEnumerationEntry entry in getPackagesToProcess()) { - final Version? version = entry.package.parsePubspec().version; - if ((entry.package.parseCIConfig()?.isBatchRelease ?? false) && - (version?.isPreRelease ?? false)) { - throw UsageException( - 'This command does not support batch releases packages with pre-release versions.\n' - 'Offending package: ${entry.package.displayName}\n' - 'Pre-release version: $version\n', - usage, - ); - } - } } @override Future runForPackage(RepositoryPackage package) async { + final Version? version = package.parsePubspec().version; + if ((package.parseCIConfig()?.isBatchRelease ?? false) && + (version?.isPreRelease ?? false)) { + return PackageResult.fail([ + 'This command does not support batch releases packages with pre-release versions.', + 'Pre-release version: $version', + ]); + } + _VersionIncrementType? versionChange = _versionChange; // If the change type is `minimal` determine what changes, if any, are @@ -158,10 +154,13 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { final CIConfig? ciConfig = package.parseCIConfig(); if (ciConfig?.isBatchRelease ?? false) { - return _createPendingChangelog(package, versionChange: versionChange); + return _createPendingBatchChangelog( + package, + versionChange: versionChange, + ); } - return _updateReleaseDirectly(package, versionChange: versionChange); + return _updatePubspecAndChangelog(package, versionChange: versionChange); } _ChangelogUpdateOutcome _updateChangelog( @@ -303,7 +302,11 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { } } - Future _updateReleaseDirectly( + /// Updates the `pubspec.yaml` and `CHANGELOG.md` files directly. + /// + /// This is used for standard releases, where changes will be released + /// immediately. + Future _updatePubspecAndChangelog( RepositoryPackage package, { _VersionIncrementType? versionChange, }) async { @@ -340,10 +343,23 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { return PackageResult.success(); } - Future _createPendingChangelog( + /// Creates a pending changelog entry in the package's `pending_changelogs` + /// directory. + /// + /// This is used for batch releases, where changes are accumulated in + /// individual files before being merged into the main CHANGELOG.md and + /// pubspec.yaml during the release process. + Future _createPendingBatchChangelog( RepositoryPackage package, { _VersionIncrementType? versionChange, }) async { + final Directory pendingDirectory = package.pendingChangelogsDirectory; + if (!pendingDirectory.existsSync()) { + return PackageResult.fail([ + 'Could not create pending changelog entry. Pending changelog directory does not exist.', + ]); + } + final VersionChange type; switch (versionChange) { case _VersionIncrementType.minor: @@ -365,12 +381,6 @@ changelog: | ${changelogEntry.split('\n').map((line) => ' - $line').join('\n')} version: ${type.name} '''; - - final Directory pendingDirectory = package.pendingChangelogsDirectory; - if (!pendingDirectory.existsSync()) { - pendingDirectory.createSync(); - } - final filename = 'change_${DateTime.now().millisecondsSinceEpoch}.yaml'; final File file = pendingDirectory.childFile(filename); file.writeAsStringSync(content); diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index 4dd27011293f..f5a59b13b762 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -788,6 +788,7 @@ packages/a_package/test/plugin_test.dart version: '1.0.0', ); package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + package.pendingChangelogsDirectory.createSync(); const originalChangelog = ''' ## 1.0.0 @@ -829,6 +830,7 @@ packages/a_package/test/plugin_test.dart version: '1.0.0', ); package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + package.pendingChangelogsDirectory.createSync(); final List output = await runCapturingPrint(runner, [ 'update-release-info', @@ -860,6 +862,7 @@ packages/a_package/test/plugin_test.dart version: '1.0.0', ); package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + package.pendingChangelogsDirectory.createSync(); final List output = await runCapturingPrint(runner, [ 'update-release-info', @@ -893,6 +896,7 @@ packages/a_package/test/plugin_test.dart version: '1.0.0', ); package.ciConfigFile.writeAsStringSync('release:\n batch: true'); + package.pendingChangelogsDirectory.createSync(); gitProcessRunner.mockProcessesForExecutable['git-diff'] = [ FakeProcessInfo( @@ -978,8 +982,8 @@ packages/different_package/lib/foo.dart '''; package.changelogFile.writeAsStringSync(originalChangelog); - Exception? commandError; - await runCapturingPrint( + Error? commandError; + final List output = await runCapturingPrint( runner, [ 'update-release-info', @@ -987,18 +991,17 @@ packages/different_package/lib/foo.dart '--changelog', 'A change.', ], - exceptionHandler: (Exception e) { + errorHandler: (Error e) { commandError = e; }, ); - expect(commandError, isA()); + expect(commandError, isA()); expect( - commandError.toString(), + output.join('\n'), contains( 'This command does not support batch releases packages with pre-release versions.\n' - 'Offending package: a_package\n' - 'Pre-release version: 1.0.0-dev.1', + ' Pre-release version: 1.0.0-dev.1', ), ); }); From df9f990d9fc75273429f1f1bb38dd3b7a702fa36 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 5 Feb 2026 13:52:09 -0800 Subject: [PATCH 6/9] update --- script/tool/lib/src/update_release_info_command.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index 09bb36536e7d..e14181df12e4 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -114,8 +114,9 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { @override Future runForPackage(RepositoryPackage package) async { final Version? version = package.parsePubspec().version; - if ((package.parseCIConfig()?.isBatchRelease ?? false) && - (version?.isPreRelease ?? false)) { + final bool isBatchRelease = + package.parseCIConfig()?.isBatchRelease ?? false; + if (isBatchRelease && (version?.isPreRelease ?? false)) { return PackageResult.fail([ 'This command does not support batch releases packages with pre-release versions.', 'Pre-release version: $version', @@ -152,8 +153,7 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { } } - final CIConfig? ciConfig = package.parseCIConfig(); - if (ciConfig?.isBatchRelease ?? false) { + if (isBatchRelease) { return _createPendingBatchChangelog( package, versionChange: versionChange, From 3b3941a961b2da42e7ef4ef2a2e9356812f278ea Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 5 Feb 2026 14:31:40 -0800 Subject: [PATCH 7/9] format --- script/tool/lib/src/update_release_info_command.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index e14181df12e4..29d18bd90b74 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -8,7 +8,6 @@ import 'package:pub_semver/pub_semver.dart'; import 'package:yaml_edit/yaml_edit.dart'; import 'common/output_utils.dart'; - import 'common/package_looping_command.dart'; import 'common/package_state_utils.dart'; import 'common/repository_package.dart'; From e3d2c702ba10b216997f8f0c1704af6c8e08822c Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Tue, 10 Feb 2026 12:29:36 -0800 Subject: [PATCH 8/9] update --- script/tool/lib/src/update_release_info_command.dart | 7 +++++-- script/tool/test/update_release_info_command_test.dart | 7 ++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index 29d18bd90b74..1c7071b0b753 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -303,7 +303,7 @@ class UpdateReleaseInfoCommand extends PackageLoopingCommand { /// Updates the `pubspec.yaml` and `CHANGELOG.md` files directly. /// - /// This is used for standard releases, where changes will be released + /// This is used for continuous releases, where changes will be released /// immediately. Future _updatePubspecAndChangelog( RepositoryPackage package, { @@ -380,7 +380,10 @@ changelog: | ${changelogEntry.split('\n').map((line) => ' - $line').join('\n')} version: ${type.name} '''; - final filename = 'change_${DateTime.now().millisecondsSinceEpoch}.yaml'; + final now = DateTime.now(); + final date = + '${now.year}_${now.month.toString().padLeft(2, '0')}_${now.day.toString().padLeft(2, '0')}'; + final filename = 'change_${date}_${now.millisecondsSinceEpoch}.yaml'; final File file = pendingDirectory.childFile(filename); file.writeAsStringSync(content); print('${indentation}Created pending changelog entry: $filename'); diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index f5a59b13b762..e2d109885f2b 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -30,6 +30,7 @@ void main() { runner.addCommand(command); }); + group('flags', () { test('fails if --changelog is missing', () async { Error? commandError; @@ -918,7 +919,11 @@ packages/a_package/lib/plugin.dart expect( output, containsAllInOrder([ - contains(' Created pending changelog entry: change_'), + contains( + RegExp( + r' Created pending changelog entry: change_\d{4}_\d{2}_\d{2}_\d+\.yaml', + ), + ), ]), ); From f4925f54d9b2608bf6685b8dfa333c87876511b1 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Tue, 10 Feb 2026 13:09:53 -0800 Subject: [PATCH 9/9] update --- script/tool/test/update_release_info_command_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index e2d109885f2b..58d30362dfdf 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -30,7 +30,6 @@ void main() { runner.addCommand(command); }); - group('flags', () { test('fails if --changelog is missing', () async { Error? commandError;