add flutter channel command (#5561)

* add flutter channel command
fixes https://github.com/flutter/flutter/issues/2513

* fix test

* address comments

* remove unused imports

* fix lints
This commit is contained in:
Dan Rubel 2016-08-25 15:16:21 -04:00 committed by GitHub
parent 1ea2f4030e
commit e47e937682
4 changed files with 98 additions and 0 deletions

View file

@ -14,6 +14,7 @@ import 'src/base/process.dart';
import 'src/base/utils.dart';
import 'src/commands/analyze.dart';
import 'src/commands/build.dart';
import 'src/commands/channel.dart';
import 'src/commands/config.dart';
import 'src/commands/create.dart';
import 'src/commands/daemon.dart';
@ -57,6 +58,7 @@ Future<Null> main(List<String> args) async {
FlutterCommandRunner runner = new FlutterCommandRunner(verboseHelp: verboseHelp)
..addCommand(new AnalyzeCommand())
..addCommand(new BuildCommand())
..addCommand(new ChannelCommand())
..addCommand(new ConfigCommand())
..addCommand(new CreateCommand())
..addCommand(new DaemonCommand(hidden: !verboseHelp))

View file

@ -0,0 +1,66 @@
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import '../base/process.dart';
import '../cache.dart';
import '../globals.dart';
import '../runner/flutter_command.dart';
class ChannelCommand extends FlutterCommand {
@override
final String name = 'channel';
@override
final String description = 'List or switch flutter channels.';
@override
String get invocation => '${runner.executableName} $name [<channel-name>]';
@override
bool get requiresProjectRoot => false;
@override
Future<int> runInProject() async {
switch (argResults.rest.length) {
case 0:
return await _listChannels();
case 1:
return await _switchChannel(argResults.rest[0]);
default:
printStatus('Too many arguments.');
printStatus(usage);
return 2;
}
}
Future<int> _listChannels() async {
String currentBranch = runSync(
<String>['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
workingDirectory: Cache.flutterRoot);
printStatus('Flutter channels:');
return runCommandAndStreamOutput(
<String>['git', 'branch', '-r'],
workingDirectory: Cache.flutterRoot,
mapFunction: (String line) {
List<String> split = line.split('/');
if (split.length < 2) return null;
String branchName = split[1];
if (branchName.startsWith('HEAD')) return null;
if (branchName == currentBranch) return '* $branchName';
return ' $branchName';
},
);
}
Future<int> _switchChannel(String branchName) {
printStatus('Switching to flutter channel named $branchName');
return runCommandAndStreamOutput(
<String>['git', 'checkout', branchName],
workingDirectory: Cache.flutterRoot,
);
}
}

View file

@ -17,6 +17,7 @@ import 'android_device_test.dart' as android_device_test;
import 'android_sdk_test.dart' as android_sdk_test;
import 'application_package_test.dart' as application_package_test;
import 'base_utils_test.dart' as base_utils_test;
import 'channel_test.dart' as channel_test;
import 'config_test.dart' as config_test;
import 'context_test.dart' as context_test;
import 'create_test.dart' as create_test;
@ -48,6 +49,7 @@ void main() {
android_sdk_test.main();
application_package_test.main();
base_utils_test.main();
channel_test.main();
config_test.main();
context_test.main();
create_test.main();

View file

@ -0,0 +1,28 @@
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:args/command_runner.dart';
import 'package:flutter_tools/src/base/context.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/commands/channel.dart';
import 'package:test/test.dart';
import 'src/common.dart';
import 'src/context.dart';
void main() {
group('channel', () {
testUsingContext('list', () async {
ChannelCommand command = new ChannelCommand();
CommandRunner runner = createTestCommandRunner(command);
expect(await runner.run(<String>['channel']), 0);
BufferLogger logger = context[Logger];
expect(logger.errorText, hasLength(0));
expect(logger.statusText, contains('channels'));
expect(logger.statusText, contains('master'));
// fails on bots
//expect(logger.statusText, contains('* ')); // current channel mark
});
});
}