From ab5a8c0ca83bae0a0da9ae2cdb0cc824915c00ab Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Sat, 18 Feb 2023 12:43:11 -0800 Subject: [PATCH] [tool] Allow importing packages with NEXT (#3215) Fixes an issue that showed up in the trial repo merge PR; if a pacakge is new to the repository (i.e., has no git history in the parent commit), it was being treated as a version bump, which caused failures if NEXT was present. This adds a new state so that we can allow NEXT during import. --- .../tool/lib/src/version_check_command.dart | 6 +++- .../tool/test/version_check_command_test.dart | 34 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/script/tool/lib/src/version_check_command.dart b/script/tool/lib/src/version_check_command.dart index bb53620f06d3..fa9f43519499 100644 --- a/script/tool/lib/src/version_check_command.dart +++ b/script/tool/lib/src/version_check_command.dart @@ -47,6 +47,9 @@ enum _CurrentVersionState { /// The version has changed, and the transition is invalid. invalidChange, + /// The package is new. + newPackage, + /// There was an error determining the version state. unknown, } @@ -216,6 +219,7 @@ class VersionCheckCommand extends PackageLoopingCommand { break; case _CurrentVersionState.validIncrease: case _CurrentVersionState.validRevert: + case _CurrentVersionState.newPackage: versionChanged = true; break; case _CurrentVersionState.invalidChange: @@ -318,7 +322,7 @@ ${indentation}HTTP response: ${pubVersionFinderResponse.httpResponse.body} '${getBoolArg(_againstPubFlag) ? 'on pub server' : 'at git base'}.'); logWarning( '${indentation}If this package is not new, something has gone wrong.'); - return _CurrentVersionState.validIncrease; // Assume new, thus valid. + return _CurrentVersionState.newPackage; } if (previousVersion == currentVersion) { diff --git a/script/tool/test/version_check_command_test.dart b/script/tool/test/version_check_command_test.dart index d485d81ceaf2..3346383fd3fe 100644 --- a/script/tool/test/version_check_command_test.dart +++ b/script/tool/test/version_check_command_test.dart @@ -525,6 +525,9 @@ void main() { const String version = '1.0.1'; final RepositoryPackage plugin = createFakePlugin('plugin', packagesDir, version: version); + processRunner.mockProcessesForExecutable['git-show'] = [ + MockProcess(stdout: 'version: 1.0.0'), + ]; const String changelog = ''' ## NEXT @@ -538,7 +541,7 @@ void main() { bool hasError = false; final List output = await runCapturingPrint( - runner, ['version-check', '--base-sha=main', '--against-pub'], + runner, ['version-check', '--base-sha=main'], errorHandler: (Error e) { expect(e, isA()); hasError = true; @@ -559,6 +562,9 @@ void main() { test('fails if the version increases without replacing NEXT', () async { final RepositoryPackage plugin = createFakePlugin('plugin', packagesDir, version: '1.0.1'); + processRunner.mockProcessesForExecutable['git-show'] = [ + MockProcess(stdout: 'version: 1.0.0'), + ]; const String changelog = ''' ## NEXT @@ -570,7 +576,7 @@ void main() { bool hasError = false; final List output = await runCapturingPrint( - runner, ['version-check', '--base-sha=main', '--against-pub'], + runner, ['version-check', '--base-sha=main'], errorHandler: (Error e) { expect(e, isA()); hasError = true; @@ -613,6 +619,30 @@ void main() { ); }); + // This handles imports of a package with a NEXT section. + test('allows NEXT for a new package', () async { + final RepositoryPackage plugin = + createFakePackage('a_package', packagesDir, version: '1.0.0'); + + const String changelog = ''' +## NEXT +* Some changes that should be listed in the next release. +## 1.0.0 +* Some other changes. +'''; + plugin.changelogFile.writeAsStringSync(changelog); + + final List output = await runCapturingPrint( + runner, ['version-check', '--base-sha=main']); + expect( + output, + containsAllInOrder([ + contains('Unable to find previous version at git base'), + contains('Found NEXT; validating next version in the CHANGELOG'), + ]), + ); + }); + test( 'fails gracefully if the version headers are not found due to using the wrong style', () async {