From c42bb1a44f9be484ce2f025225e7df0fce8a0acd Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Wed, 15 Nov 2023 13:19:08 -0600 Subject: [PATCH] feat(shorebird_cli): `shorebird --version` checks for updates (#1499) --- .../shorebird_cli/lib/src/command_runner.dart | 12 ++++++ .../test/src/command_runner_test.dart | 38 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/packages/shorebird_cli/lib/src/command_runner.dart b/packages/shorebird_cli/lib/src/command_runner.dart index 619ca94f..d9419f73 100644 --- a/packages/shorebird_cli/lib/src/command_runner.dart +++ b/packages/shorebird_cli/lib/src/command_runner.dart @@ -11,6 +11,7 @@ import 'package:shorebird_cli/src/platform.dart'; import 'package:shorebird_cli/src/process.dart'; import 'package:shorebird_cli/src/shorebird_env.dart'; import 'package:shorebird_cli/src/shorebird_flutter.dart'; +import 'package:shorebird_cli/src/shorebird_version.dart'; import 'package:shorebird_cli/src/version.dart'; const executableName = 'shorebird'; @@ -156,6 +157,17 @@ ${lightCyan.wrap('shorebird release android -- --no-pub lib/main.dart')}'''; Shorebird $packageVersion • git@github.com:shorebirdtech/shorebird.git $shorebirdFlutterPrefix • revision ${shorebirdEnv.flutterRevision} Engine • revision ${shorebirdEnv.shorebirdEngineRevision}'''); + + try { + final isUpToDate = await shorebirdVersion.isLatest(); + if (!isUpToDate) { + logger.info(''' +A new version of shorebird is available! +Run ${lightCyan.wrap('shorebird upgrade')} to upgrade.'''); + } + } catch (error) { + logger.detail('Unable to check for updates.\n$error'); + } exitCode = ExitCode.success.code; } else { exitCode = await super.runCommand(topLevelResults); diff --git a/packages/shorebird_cli/test/src/command_runner_test.dart b/packages/shorebird_cli/test/src/command_runner_test.dart index aee498bf..b1852a00 100644 --- a/packages/shorebird_cli/test/src/command_runner_test.dart +++ b/packages/shorebird_cli/test/src/command_runner_test.dart @@ -9,6 +9,7 @@ import 'package:shorebird_cli/src/platform.dart'; import 'package:shorebird_cli/src/process.dart'; import 'package:shorebird_cli/src/shorebird_env.dart'; import 'package:shorebird_cli/src/shorebird_flutter.dart'; +import 'package:shorebird_cli/src/shorebird_version.dart'; import 'package:shorebird_cli/src/version.dart'; import 'package:test/test.dart'; @@ -24,6 +25,7 @@ void main() { late Platform platform; late ShorebirdEnv shorebirdEnv; late ShorebirdFlutter shorebirdFlutter; + late ShorebirdVersion shorebirdVersion; late ShorebirdProcessResult processResult; late ShorebirdCliCommandRunner commandRunner; @@ -35,6 +37,7 @@ void main() { platformRef.overrideWith(() => platform), shorebirdEnvRef.overrideWith(() => shorebirdEnv), shorebirdFlutterRef.overrideWith(() => shorebirdFlutter), + shorebirdVersionRef.overrideWith(() => shorebirdVersion), }, ); } @@ -44,6 +47,7 @@ void main() { platform = MockPlatform(); shorebirdEnv = MockShorebirdEnv(); shorebirdFlutter = MockShorebirdFlutter(); + shorebirdVersion = MockShorebirdVersion(); processResult = MockProcessResult(); when(() => processResult.exitCode).thenReturn(ExitCode.success.code); when( @@ -54,6 +58,7 @@ void main() { when( () => shorebirdFlutter.getVersion(), ).thenAnswer((_) async => flutterVersion); + when(() => shorebirdVersion.isLatest()).thenAnswer((_) async => true); commandRunner = runWithOverrides(ShorebirdCliCommandRunner.new); }); @@ -187,6 +192,39 @@ Engine • revision $shorebirdEngineRevision''', () => logger.detail('Unable to determine Flutter version.\nerror'), ).called(1); }); + + test('gracefully handles case when latest version cannot be determined', + () async { + when(() => shorebirdVersion.isLatest()).thenThrow('error'); + final result = await runWithOverrides( + () => commandRunner.run(['--version']), + ); + expect(result, equals(ExitCode.success.code)); + verify( + () => logger.info( + ''' +Shorebird $packageVersion • git@github.com:shorebirdtech/shorebird.git +Flutter $flutterVersion • revision $flutterRevision +Engine • revision $shorebirdEngineRevision''', + ), + ).called(1); + verify( + () => logger.detail('Unable to check for updates.\nerror'), + ).called(1); + }); + + test('logs update message when update is available', () async { + when(() => shorebirdVersion.isLatest()).thenAnswer((_) async => false); + final result = await runWithOverrides( + () => commandRunner.run(['--version']), + ); + expect(result, equals(ExitCode.success.code)); + verify( + () => logger.info(''' +A new version of shorebird is available! +Run ${lightCyan.wrap('shorebird upgrade')} to upgrade.'''), + ).called(1); + }); }); group('--verbose', () {