diff --git a/packages/flutter_tools/lib/src/commands/channel.dart b/packages/flutter_tools/lib/src/commands/channel.dart index 0c21979f14..7716db8432 100644 --- a/packages/flutter_tools/lib/src/commands/channel.dart +++ b/packages/flutter_tools/lib/src/commands/channel.dart @@ -35,7 +35,10 @@ class ChannelCommand extends FlutterCommand { Future runCommand() async { switch (argResults.rest.length) { case 0: - await _listChannels(showAll: argResults['all']); + await _listChannels( + showAll: argResults['all'], + verbose: globalResults['verbose'] + ); return null; case 1: await _switchChannel(argResults.rest[0]); @@ -45,11 +48,12 @@ class ChannelCommand extends FlutterCommand { } } - Future _listChannels({ bool showAll }) async { + Future _listChannels({ bool showAll, bool verbose }) async { // Beware: currentBranch could contain PII. See getBranchName(). final String currentChannel = FlutterVersion.instance.channel; final String currentBranch = FlutterVersion.instance.getBranchName(); final Set seenChannels = Set(); + final List rawOutput = []; showAll = showAll || currentChannel != currentBranch; @@ -58,6 +62,8 @@ class ChannelCommand extends FlutterCommand { ['git', 'branch', '-r'], workingDirectory: Cache.flutterRoot, mapFunction: (String line) { + if (verbose) + rawOutput.add(line); final List split = line.split('/'); if (split.length < 2) return null; @@ -74,8 +80,10 @@ class ChannelCommand extends FlutterCommand { return null; }, ); - if (result != 0) - throwToolExit('List channels failed: $result', exitCode: result); + if (result != 0) { + final String details = verbose ? '\n${rawOutput.join('\n')}' : ''; + throwToolExit('List channels failed: $result$details', exitCode: result); + } } Future _switchChannel(String branchName) { diff --git a/packages/flutter_tools/test/channel_test.dart b/packages/flutter_tools/test/channel_test.dart index 6e985c9050..45306ee65e 100644 --- a/packages/flutter_tools/test/channel_test.dart +++ b/packages/flutter_tools/test/channel_test.dart @@ -41,15 +41,23 @@ void main() { Cache.disableLocking(); }); - testUsingContext('list', () async { + Future simpleChannelTest(List args) async { final ChannelCommand command = ChannelCommand(); final CommandRunner runner = createTestCommandRunner(command); - await runner.run(['channel']); + await runner.run(args); expect(testLogger.errorText, hasLength(0)); // The bots may return an empty list of channels (network hiccup?) // and when run locally the list of branches might be different // so we check for the header text rather than any specific channel name. expect(testLogger.statusText, contains('Flutter channels:')); + } + + testUsingContext('list', () async { + await simpleChannelTest(['channel']); + }); + + testUsingContext('verbose list', () async { + await simpleChannelTest(['channel', '-v']); }); testUsingContext('removes duplicates', () async {