diff --git a/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart b/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart index 2d6b6b71..24b51940 100644 --- a/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart +++ b/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart @@ -204,10 +204,7 @@ NOTE: this is ${styleBold.wrap('not')} recommended. Asset changes cannot be incl ); } - codePushClientWrapper.ensureReleaseIsNotActive( - release: release, - platform: patcher.releaseType.releasePlatform, - ); + assertReleaseIsActive(release: release, patcher: patcher); try { await shorebirdFlutter.installRevision(revision: release.flutterRevision); @@ -285,6 +282,20 @@ NOTE: this is ${styleBold.wrap('not')} recommended. Asset changes cannot be incl ); } + void assertReleaseIsActive({ + required Release release, + required Patcher patcher, + }) { + final releaseStatus = + release.platformStatuses[patcher.releaseType.releasePlatform]; + if (releaseStatus != ReleaseStatus.active) { + logger.err(''' +Release ${release.version} is in an incomplete state. It's possible that the original release was terminated or failed to complete. +Please re-run the release command for this version or create a new release.'''); + exit(ExitCode.software.code); + } + } + Future assertUnpatchableDiffs({ required File releaseArtifact, required File patchArtifact, diff --git a/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart b/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart index 3129cb62..6b3e39cb 100644 --- a/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart @@ -441,10 +441,6 @@ void main() { appId: appId, releaseVersion: releaseVersion, ), - () => codePushClientWrapper.ensureReleaseIsNotActive( - release: any(named: 'release'), - platform: releasePlatform, - ), () => codePushClientWrapper.getReleaseArtifact( appId: appId, releaseId: release.id, @@ -499,10 +495,6 @@ void main() { choices: any(named: 'choices'), display: captureAny(named: 'display'), ), - () => codePushClientWrapper.ensureReleaseIsNotActive( - release: any(named: 'release'), - platform: releasePlatform, - ), () => codePushClientWrapper.getReleaseArtifact( appId: appId, releaseId: release.id, @@ -581,10 +573,6 @@ void main() { ), () => patcher.buildPatchArtifact(), () => patcher.extractReleaseVersionFromArtifact(any()), - () => codePushClientWrapper.ensureReleaseIsNotActive( - release: any(named: 'release'), - platform: releasePlatform, - ), () => shorebirdFlutter.installRevision( revision: releaseFlutterRevision, ), @@ -663,6 +651,43 @@ void main() { }); }); + group('when the target release is in a draft state', () { + setUp(() { + when( + () => codePushClientWrapper.getRelease( + appId: any(named: 'appId'), + releaseVersion: any(named: 'releaseVersion'), + ), + ).thenAnswer( + (_) async => Release( + id: 0, + appId: appId, + version: releaseVersion, + flutterRevision: flutterRevision, + displayName: '1.2.3+1', + platformStatuses: {releasePlatform: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), + ), + ); + }); + + test('logs error and exits with code 70', () async { + await expectLater( + () => runWithOverrides(command.run), + exitsWithCode(ExitCode.software), + ); + + verify( + () => logger.err( + ''' +Release ${release.version} is in an incomplete state. It's possible that the original release was terminated or failed to complete. +Please re-run the release command for this version or create a new release.''', + ), + ).called(1); + }); + }); + group('when primary release artifact fails to download', () { final error = Exception('Failed to download primary release artifact.');