From d682259eab1409036aacd71a50dfbbfdac8e72bb Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 12 Mar 2018 17:04:02 -0700 Subject: [PATCH] Use a set to remove duplicate channel names (#15392) * Use a set to remove duplicate channel names * Add test for git command --- .../lib/src/commands/channel.dart | 5 ++ packages/flutter_tools/test/channel_test.dart | 54 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/packages/flutter_tools/lib/src/commands/channel.dart b/packages/flutter_tools/lib/src/commands/channel.dart index 42b8fe4bbc5..95df08df082 100644 --- a/packages/flutter_tools/lib/src/commands/channel.dart +++ b/packages/flutter_tools/lib/src/commands/channel.dart @@ -47,6 +47,7 @@ class ChannelCommand extends FlutterCommand { // Beware: currentBranch could contain PII. See getBranchName(). final String currentChannel = FlutterVersion.instance.channel; final String currentBranch = FlutterVersion.instance.getBranchName(); + final Set seenChannels = new Set(); showAll = showAll || currentChannel != currentBranch; @@ -59,6 +60,10 @@ class ChannelCommand extends FlutterCommand { if (split.length < 2) return null; final String branchName = split[1]; + if (seenChannels.contains(branchName)) { + return null; + } + seenChannels.add(branchName); if (branchName == currentBranch) return '* $branchName'; if (!branchName.startsWith('HEAD ') && diff --git a/packages/flutter_tools/test/channel_test.dart b/packages/flutter_tools/test/channel_test.dart index 5df82f6b099..b3bc3c8d82d 100644 --- a/packages/flutter_tools/test/channel_test.dart +++ b/packages/flutter_tools/test/channel_test.dart @@ -2,16 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + import 'package:args/command_runner.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/channel.dart'; +import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; +import 'package:process/process.dart'; import 'src/common.dart'; import 'src/context.dart'; void main() { group('channel', () { + final MockProcessManager mockProcessManager = new MockProcessManager(); + setUpAll(() { Cache.disableLocking(); }); @@ -26,5 +34,51 @@ void main() { // so we check for the header text rather than any specific channel name. expect(testLogger.statusText, contains('Flutter channels:')); }); + + testUsingContext('removes duplicates', () async { + final Stream> stdout = new Stream>.fromIterable(>[ + utf8.encode( + 'origin/dev\n' + 'origin/beta\n' + 'upstream/dev\n' + 'upstream/beta\n' + ), + ]); + final Process process = new MockProcess(); + + when(process.stdout).thenReturn(stdout); + when(process.stderr).thenReturn(const Stream>.empty()); + when(process.exitCode).thenReturn(new Future.value(0)); + when(mockProcessManager.start( + ['git', 'branch', '-r'], + workingDirectory: typed(any, named: 'workingDirectory'), + environment: typed(any, named: 'environment'))) + .thenReturn(new Future.value(process)); + + final ChannelCommand command = new ChannelCommand(); + final CommandRunner runner = createTestCommandRunner(command); + await runner.run(['channel']); + + verify(mockProcessManager.start(['git', 'branch', '-r'], + workingDirectory: typed(any, named: 'workingDirectory'), + environment: typed(any, named: 'environment'))).called(1); + + expect(testLogger.errorText, hasLength(0)); + + // format the status text for a simpler assertion. + final Iterable rows = testLogger.statusText + .split('\n') + .map((String line) => line.trim()) + .where((String line) => line?.isNotEmpty == true) + .skip(1); // remove `Flutter channels:` line + + expect(rows, ['dev', 'beta']); + }, overrides: { + ProcessManager: () => mockProcessManager, + }); }); } + +class MockProcessManager extends Mock implements ProcessManager {} + +class MockProcess extends Mock implements Process {} \ No newline at end of file