From 769da590411acc64913e47760e0501ce6ee3756a Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Fri, 2 Jun 2023 15:58:17 -0700 Subject: [PATCH] fix(shorebird_cli): `shorebird release android` fails for existing release (#591) --- .../release/release_android_command.dart | 56 +++++++++++-------- .../release/release_android_command_test.dart | 36 ++++++------ 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart b/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart index a0d0c8a7..c6f1baf5 100644 --- a/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart +++ b/packages/shorebird_cli/lib/src/commands/release/release_android_command.dart @@ -176,31 +176,39 @@ ${summary.join('\n')} } var release = releases.firstWhereOrNull((r) => r.version == releaseVersion); - if (release == null) { - final flutterRevisionProgress = logger.progress( - 'Fetching Flutter revision', - ); - final String shorebirdFlutterRevision; - try { - shorebirdFlutterRevision = await getShorebirdFlutterRevision(); - flutterRevisionProgress.complete(); - } catch (error) { - flutterRevisionProgress.fail('$error'); - return ExitCode.software.code; - } - final createReleaseProgress = logger.progress('Creating release'); - try { - release = await codePushClient.createRelease( - appId: app.id, - version: releaseVersion, - flutterRevision: shorebirdFlutterRevision, - ); - createReleaseProgress.complete(); - } catch (error) { - createReleaseProgress.fail('$error'); - return ExitCode.software.code; - } + if (release != null) { + logger.err( + ''' +It looks like you have an existing release for version ${lightCyan.wrap(releaseVersion)}. +Please bump your version number and try again.''', + ); + return ExitCode.software.code; + } + + final flutterRevisionProgress = logger.progress( + 'Fetching Flutter revision', + ); + final String shorebirdFlutterRevision; + try { + shorebirdFlutterRevision = await getShorebirdFlutterRevision(); + flutterRevisionProgress.complete(); + } catch (error) { + flutterRevisionProgress.fail('$error'); + return ExitCode.software.code; + } + + final createReleaseProgress = logger.progress('Creating release'); + try { + release = await codePushClient.createRelease( + appId: app.id, + version: releaseVersion, + flutterRevision: shorebirdFlutterRevision, + ); + createReleaseProgress.complete(); + } catch (error) { + createReleaseProgress.fail('$error'); + return ExitCode.software.code; } // TODO(bryanoltman): Consolidate aab and other artifact creation. diff --git a/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart b/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart index 6926a386..b5ed4ebe 100644 --- a/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart @@ -245,7 +245,7 @@ flutter: ).thenAnswer((_) async => [appMetadata]); when( () => codePushClient.getReleases(appId: any(named: 'appId')), - ).thenAnswer((_) async => [release]); + ).thenAnswer((_) async => []); when( () => codePushClient.createRelease( appId: any(named: 'appId'), @@ -433,9 +433,6 @@ Did you forget to run "shorebird init"?''', const error = 'oops'; when(() => flutterRevisionProcessResult.exitCode).thenReturn(1); when(() => flutterRevisionProcessResult.stderr).thenReturn(error); - when( - () => codePushClient.getReleases(appId: any(named: 'appId')), - ).thenAnswer((_) async => []); final tempDir = setUpTempDir(); setUpTempArtifacts(tempDir); final exitCode = await IOOverrides.runZoned( @@ -450,11 +447,24 @@ Did you forget to run "shorebird init"?''', ).called(1); }); - test('throws error when creating release fails.', () async { - const error = 'something went wrong'; + test('throws error when existing releases exists.', () async { when( () => codePushClient.getReleases(appId: any(named: 'appId')), - ).thenAnswer((_) async => []); + ).thenAnswer((_) async => [release]); + final tempDir = setUpTempDir(); + setUpTempArtifacts(tempDir); + final exitCode = await IOOverrides.runZoned( + command.run, + getCurrentDirectory: () => tempDir, + ); + verify(() => logger.err(''' +It looks like you have an existing release for version ${lightCyan.wrap(release.version)}. +Please bump your version number and try again.''')).called(1); + expect(exitCode, ExitCode.software.code); + }); + + test('throws error when creating release fails.', () async { + const error = 'something went wrong'; when( () => codePushClient.createRelease( appId: any(named: 'appId'), @@ -476,9 +486,6 @@ Did you forget to run "shorebird init"?''', test('logs message when uploading release artifact that already exists.', () async { const error = 'something went wrong'; - when( - () => codePushClient.getReleases(appId: any(named: 'appId')), - ).thenAnswer((_) async => []); when( () => codePushClient.createReleaseArtifact( artifactPath: any(named: 'artifactPath'), @@ -506,9 +513,6 @@ Did you forget to run "shorebird init"?''', test('logs message when uploading aab that already exists.', () async { const error = 'something went wrong'; - when( - () => codePushClient.getReleases(appId: any(named: 'appId')), - ).thenAnswer((_) async => []); when( () => codePushClient.createReleaseArtifact( artifactPath: any(named: 'artifactPath', that: endsWith('.aab')), @@ -535,9 +539,6 @@ Did you forget to run "shorebird init"?''', test('throws error when uploading release artifact fails.', () async { const error = 'something went wrong'; - when( - () => codePushClient.getReleases(appId: any(named: 'appId')), - ).thenAnswer((_) async => []); when( () => codePushClient.createReleaseArtifact( artifactPath: any(named: 'artifactPath'), @@ -562,9 +563,6 @@ Did you forget to run "shorebird init"?''', test('throws error when uploading aab fails', () async { const error = 'something went wrong'; - when( - () => codePushClient.getReleases(appId: any(named: 'appId')), - ).thenAnswer((_) async => []); when( () => codePushClient.createReleaseArtifact( artifactPath: any(named: 'artifactPath', that: endsWith('.aab')),