diff --git a/packages/flutter_tools/lib/src/commands/channel.dart b/packages/flutter_tools/lib/src/commands/channel.dart index a91fa9dc78..b7f91db366 100644 --- a/packages/flutter_tools/lib/src/commands/channel.dart +++ b/packages/flutter_tools/lib/src/commands/channel.dart @@ -116,7 +116,7 @@ class ChannelCommand extends FlutterCommand { } } - Future _switchChannel(String branchName) { + Future _switchChannel(String branchName) async { globals.printStatus("Switching to flutter channel '$branchName'..."); if (FlutterVersion.obsoleteBranches.containsKey(branchName)) { final String alternative = FlutterVersion.obsoleteBranches[branchName]; @@ -124,7 +124,9 @@ class ChannelCommand extends FlutterCommand { } else if (!FlutterVersion.officialChannels.contains(branchName)) { globals.printStatus('This is not an official channel. For a list of available channels, try "flutter channel".'); } - return _checkout(branchName); + await _checkout(branchName); + globals.printStatus("Successfully switched to flutter channel '$branchName'."); + globals.printStatus("To ensure that you're on the latest build from this channel, run 'flutter upgrade'"); } static Future upgradeChannel() async { diff --git a/packages/flutter_tools/test/general.shard/channel_test.dart b/packages/flutter_tools/test/general.shard/channel_test.dart index 75fee2b2bc..850ddbf321 100644 --- a/packages/flutter_tools/test/general.shard/channel_test.dart +++ b/packages/flutter_tools/test/general.shard/channel_test.dart @@ -253,6 +253,51 @@ void main() { ProcessManager: () => mockProcessManager, }); + testUsingContext('switching channels prompts to run flutter upgrade', () async { + when(mockProcessManager.start( + ['git', 'fetch'], + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment'), + )).thenAnswer((_) => Future.value(createMockProcess())); + when(mockProcessManager.start( + ['git', 'show-ref', '--verify', '--quiet', 'refs/heads/beta'], + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment'), + )).thenAnswer((_) => Future.value(createMockProcess())); + when(mockProcessManager.start( + ['git', 'checkout', 'beta', '--'], + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment'), + )).thenAnswer((_) => Future.value(createMockProcess())); + + final ChannelCommand command = ChannelCommand(); + final CommandRunner runner = createTestCommandRunner(command); + await runner.run(['channel', 'beta']); + + verify(mockProcessManager.start( + ['git', 'fetch'], + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment'), + )).called(1); + verify(mockProcessManager.start( + ['git', 'show-ref', '--verify', '--quiet', 'refs/heads/beta'], + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment'), + )).called(1); + verify(mockProcessManager.start( + ['git', 'checkout', 'beta', '--'], + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment'), + )).called(1); + + expect(testLogger.statusText, contains("Successfully switched to flutter channel 'beta'.")); + expect(testLogger.statusText, contains("To ensure that you're on the latest build from this channel, run 'flutter upgrade'")); + expect(testLogger.errorText, hasLength(0)); + }, overrides: { + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => mockProcessManager, + }); + // This verifies that bug https://github.com/flutter/flutter/issues/21134 // doesn't return. testUsingContext('removes version stamp file when switching channels', () async {