Commit e47e9376 authored by Dan Rubel's avatar Dan Rubel Committed by GitHub

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
parent 1ea2f403
...@@ -14,6 +14,7 @@ import 'src/base/process.dart'; ...@@ -14,6 +14,7 @@ import 'src/base/process.dart';
import 'src/base/utils.dart'; import 'src/base/utils.dart';
import 'src/commands/analyze.dart'; import 'src/commands/analyze.dart';
import 'src/commands/build.dart'; import 'src/commands/build.dart';
import 'src/commands/channel.dart';
import 'src/commands/config.dart'; import 'src/commands/config.dart';
import 'src/commands/create.dart'; import 'src/commands/create.dart';
import 'src/commands/daemon.dart'; import 'src/commands/daemon.dart';
...@@ -57,6 +58,7 @@ Future<Null> main(List<String> args) async { ...@@ -57,6 +58,7 @@ Future<Null> main(List<String> args) async {
FlutterCommandRunner runner = new FlutterCommandRunner(verboseHelp: verboseHelp) FlutterCommandRunner runner = new FlutterCommandRunner(verboseHelp: verboseHelp)
..addCommand(new AnalyzeCommand()) ..addCommand(new AnalyzeCommand())
..addCommand(new BuildCommand()) ..addCommand(new BuildCommand())
..addCommand(new ChannelCommand())
..addCommand(new ConfigCommand()) ..addCommand(new ConfigCommand())
..addCommand(new CreateCommand()) ..addCommand(new CreateCommand())
..addCommand(new DaemonCommand(hidden: !verboseHelp)) ..addCommand(new DaemonCommand(hidden: !verboseHelp))
......
// 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,
);
}
}
...@@ -17,6 +17,7 @@ import 'android_device_test.dart' as android_device_test; ...@@ -17,6 +17,7 @@ import 'android_device_test.dart' as android_device_test;
import 'android_sdk_test.dart' as android_sdk_test; import 'android_sdk_test.dart' as android_sdk_test;
import 'application_package_test.dart' as application_package_test; import 'application_package_test.dart' as application_package_test;
import 'base_utils_test.dart' as base_utils_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 'config_test.dart' as config_test;
import 'context_test.dart' as context_test; import 'context_test.dart' as context_test;
import 'create_test.dart' as create_test; import 'create_test.dart' as create_test;
...@@ -48,6 +49,7 @@ void main() { ...@@ -48,6 +49,7 @@ void main() {
android_sdk_test.main(); android_sdk_test.main();
application_package_test.main(); application_package_test.main();
base_utils_test.main(); base_utils_test.main();
channel_test.main();
config_test.main(); config_test.main();
context_test.main(); context_test.main();
create_test.main(); create_test.main();
......
// 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
});
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment