introduce globals scoped to the app's context
diff --git a/packages/flutter_tools/lib/src/android/adb.dart b/packages/flutter_tools/lib/src/android/adb.dart index aad03e3..e8b0f94 100644 --- a/packages/flutter_tools/lib/src/android/adb.dart +++ b/packages/flutter_tools/lib/src/android/adb.dart
@@ -5,7 +5,7 @@ import 'dart:async'; import 'dart:io'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; // https://android.googlesource.com/platform/system/core/+/android-4.4_r1/adb/OVERVIEW.TXT
diff --git a/packages/flutter_tools/lib/src/android/device_android.dart b/packages/flutter_tools/lib/src/android/device_android.dart index e0eadf9..c55e0d4 100644 --- a/packages/flutter_tools/lib/src/android/device_android.dart +++ b/packages/flutter_tools/lib/src/android/device_android.dart
@@ -10,7 +10,7 @@ import '../application_package.dart'; import '../base/common.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/os.dart'; import '../base/process.dart'; import '../build_configuration.dart';
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index 123b752..4d304ed 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -8,7 +8,7 @@ import 'package:archive/archive.dart'; import 'package:path/path.dart' as path; -import 'base/context.dart'; +import 'base/globals.dart'; import 'base/os.dart'; import 'base/process.dart'; import 'build_configuration.dart';
diff --git a/packages/flutter_tools/lib/src/base/context.dart b/packages/flutter_tools/lib/src/base/context.dart index 21054a4..8c1f54d 100644 --- a/packages/flutter_tools/lib/src/base/context.dart +++ b/packages/flutter_tools/lib/src/base/context.dart
@@ -3,9 +3,8 @@ // found in the LICENSE file. import 'dart:async'; -import 'dart:io'; -final AppContext _defaultContext = new _DefaultAppContext(); +final AppContext _defaultContext = new AppContext(); /// A singleton for application functionality. This singleton can be different /// on a per-Zone basis. @@ -14,57 +13,42 @@ return currentContext == null ? _defaultContext : currentContext; } -/// Display an error level message to the user. Commands should use this if they -/// fail in some way. -void printError(String message, [StackTrace stackTrace]) => context.printError(message, stackTrace); +class AppContext { + Map<Type, dynamic> _instances = <Type, dynamic>{}; -/// Display normal output of the command. This should be used for things like -/// progress messages, success messages, or just normal command output. -void printStatus(String message) => context.printStatus(message); + dynamic getVariable(Type type) { + if (_instances.containsKey(type)) + return _instances[type]; -/// Use this for verbose tracing output. Users can turn this output on in order -/// to help diagnose issues with the toolchain or with their setup. -void printTrace(String message) => context.printTrace(message); - -abstract class AppContext { - bool get verbose; - set verbose(bool value); - - void printError(String message, [StackTrace stackTrace]); - void printStatus(String message); - void printTrace(String message); -} - -class _DefaultAppContext implements AppContext { - DateTime _startTime = new DateTime.now(); - - bool _verbose = false; - - bool get verbose => _verbose; - - set verbose(bool value) { - _verbose = value; + AppContext parent = _calcParent(Zone.current); + return parent?.getVariable(type); } - void printError(String message, [StackTrace stackTrace]) { - stderr.writeln(_prefix + message); - if (stackTrace != null) - stderr.writeln(stackTrace); + void setVariable(Type type, dynamic instance) { + _instances[type] = instance; } - void printStatus(String message) { - print(_prefix + message); + dynamic operator[](Type type) => getVariable(type); + + void operator[]=(Type type, dynamic instance) => setVariable(type, instance); + + AppContext _calcParent(Zone zone) { + if (this == _defaultContext) + return null; + + Zone parentZone = zone.parent; + if (parentZone == null) + return _defaultContext; + + AppContext deps = parentZone['context']; + if (deps == this) { + return _calcParent(parentZone); + } else { + return deps != null ? deps : _defaultContext; + } } - void printTrace(String message) { - if (_verbose) - print('$_prefix- $message'); - } - - String get _prefix { - if (!_verbose) - return ''; - Duration elapsed = new DateTime.now().difference(_startTime); - return '[${elapsed.inMilliseconds.toString().padLeft(4)} ms] '; + dynamic runInZone(dynamic method()) { + return runZoned(method, zoneValues: {'context': this}); } }
diff --git a/packages/flutter_tools/lib/src/base/globals.dart b/packages/flutter_tools/lib/src/base/globals.dart new file mode 100644 index 0000000..5c86fb2 --- /dev/null +++ b/packages/flutter_tools/lib/src/base/globals.dart
@@ -0,0 +1,22 @@ +// Copyright 2016 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 '../device.dart'; +import 'context.dart'; +import 'logger.dart'; + +DeviceManager get deviceManager => context[DeviceManager]; +Logger get logger => context[Logger]; + +/// Display an error level message to the user. Commands should use this if they +/// fail in some way. +void printError(String message, [StackTrace stackTrace]) => logger.printError(message, stackTrace); + +/// Display normal output of the command. This should be used for things like +/// progress messages, success messages, or just normal command output. +void printStatus(String message) => logger.printStatus(message); + +/// Use this for verbose tracing output. Users can turn this output on in order +/// to help diagnose issues with the toolchain or with their setup. +void printTrace(String message) => logger.printTrace(message);
diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart new file mode 100644 index 0000000..0489279 --- /dev/null +++ b/packages/flutter_tools/lib/src/base/logger.dart
@@ -0,0 +1,65 @@ +// Copyright 2016 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:io'; + +abstract class Logger { + bool verbose = false; + + /// Display an error level message to the user. Commands should use this if they + /// fail in some way. + void printError(String message, [StackTrace stackTrace]); + + /// Display normal output of the command. This should be used for things like + /// progress messages, success messages, or just normal command output. + void printStatus(String message); + + /// Use this for verbose tracing output. Users can turn this output on in order + /// to help diagnose issues with the toolchain or with their setup. + void printTrace(String message); +} + +class StdoutLogger implements Logger { + DateTime _startTime = new DateTime.now(); + + bool verbose = false; + + void printError(String message, [StackTrace stackTrace]) { + stderr.writeln(_prefix + message); + if (stackTrace != null) + stderr.writeln(stackTrace); + } + + void printStatus(String message) { + print(_prefix + message); + } + + void printTrace(String message) { + if (verbose) + print('$_prefix- $message'); + } + + String get _prefix { + if (!verbose) + return ''; + Duration elapsed = new DateTime.now().difference(_startTime); + return '[${elapsed.inMilliseconds.toString().padLeft(4)} ms] '; + } +} + +class BufferLogger implements Logger { + StringBuffer _error = new StringBuffer(); + StringBuffer _status = new StringBuffer(); + StringBuffer _trace = new StringBuffer(); + + bool verbose = false; + + String get errorText => _error.toString(); + String get statusText => _status.toString(); + String get traceText => _trace.toString(); + + void printError(String message, [StackTrace stackTrace]) => _error.writeln(message); + void printStatus(String message) => _status.writeln(message); + void printTrace(String message) => _trace.writeln(message); +}
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart index 7da7699..cac6702 100644 --- a/packages/flutter_tools/lib/src/base/process.dart +++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -6,7 +6,7 @@ import 'dart:convert'; import 'dart:io'; -import 'context.dart'; +import 'globals.dart'; typedef String StringConverter(String string);
diff --git a/packages/flutter_tools/lib/src/build_configuration.dart b/packages/flutter_tools/lib/src/build_configuration.dart index 82a5bbb..160334b 100644 --- a/packages/flutter_tools/lib/src/build_configuration.dart +++ b/packages/flutter_tools/lib/src/build_configuration.dart
@@ -6,7 +6,7 @@ import 'package:path/path.dart' as path; -import 'base/context.dart'; +import 'base/globals.dart'; enum BuildType { prebuilt,
diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart index 7d6742f..b50b90e 100644 --- a/packages/flutter_tools/lib/src/commands/analyze.dart +++ b/packages/flutter_tools/lib/src/commands/analyze.dart
@@ -11,7 +11,7 @@ import 'package:path/path.dart' as path; import '../artifacts.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../runner/flutter_command.dart';
diff --git a/packages/flutter_tools/lib/src/commands/apk.dart b/packages/flutter_tools/lib/src/commands/apk.dart index 14070c9..f0f728f 100644 --- a/packages/flutter_tools/lib/src/commands/apk.dart +++ b/packages/flutter_tools/lib/src/commands/apk.dart
@@ -12,8 +12,8 @@ import '../android/device_android.dart'; import '../application_package.dart'; import '../artifacts.dart'; -import '../base/context.dart'; import '../base/file_system.dart'; +import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../device.dart';
diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index 1cfa1b0..5e1f763 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart
@@ -4,7 +4,7 @@ import 'dart:async'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../flx.dart'; import '../runner/flutter_command.dart'; import '../toolchain.dart';
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index 60da5e5..f58bc77 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -11,7 +11,7 @@ import '../android/android.dart' as android; import '../artifacts.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; class CreateCommand extends Command {
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index 1656d8e..0dee7cc 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -9,6 +9,8 @@ import '../android/adb.dart'; import '../android/device_android.dart'; import '../base/context.dart'; +import '../base/globals.dart'; +import '../base/logger.dart'; import '../device.dart'; import '../ios/device_ios.dart'; import '../ios/simulator.dart'; @@ -33,9 +35,11 @@ Future<int> runInProject() { printStatus('Starting device daemon...'); - NotifyingAppContext appContext = new NotifyingAppContext(); + AppContext appContext = new AppContext(); + NotifyingLogger notifyingLogger = new NotifyingLogger(); + appContext[Logger] = notifyingLogger; - return runZoned(() { + return appContext.runInZone(() { Stream<Map<String, dynamic>> commandStream = stdin .transform(UTF8.decoder) .transform(const LineSplitter()) @@ -47,10 +51,10 @@ Daemon daemon = new Daemon(commandStream, (Map command) { stdout.writeln('[${JSON.encode(command, toEncodable: _jsonEncodeObject)}]'); - }, daemonCommand: this, appContext: appContext); + }, daemonCommand: this, notifyingLogger: notifyingLogger); return daemon.onExit; - }, zoneValues: {'context': appContext}); + }); } dynamic _jsonEncodeObject(dynamic object) { @@ -67,7 +71,7 @@ class Daemon { Daemon(Stream<Map> commandStream, this.sendCommand, { this.daemonCommand, - this.appContext + this.notifyingLogger }) { // Set up domains. _registerDomain(new DaemonDomain(this)); @@ -83,7 +87,7 @@ final DispatchComand sendCommand; final DaemonCommand daemonCommand; - final NotifyingAppContext appContext; + final NotifyingLogger notifyingLogger; final Completer<int> _onExitCompleter = new Completer<int>(); final Map<String, Domain> _domainMap = <String, Domain>{}; @@ -185,7 +189,7 @@ registerHandler('version', version); registerHandler('shutdown', shutdown); - _subscription = daemon.appContext.onMessage.listen((LogMessage message) { + _subscription = daemon.notifyingLogger.onMessage.listen((LogMessage message) { if (message.stackTrace != null) { sendEvent('daemon.logMessage', { 'level': message.level, @@ -467,13 +471,11 @@ return '$obj'; } -class NotifyingAppContext implements AppContext { +class NotifyingLogger extends Logger { StreamController<LogMessage> _messageController = new StreamController<LogMessage>.broadcast(); Stream<LogMessage> get onMessage => _messageController.stream; - bool verbose = false; - void printError(String message, [StackTrace stackTrace]) { _messageController.add(new LogMessage('error', message, stackTrace)); }
diff --git a/packages/flutter_tools/lib/src/commands/ios.dart b/packages/flutter_tools/lib/src/commands/ios.dart index b424981..96f110a 100644 --- a/packages/flutter_tools/lib/src/commands/ios.dart +++ b/packages/flutter_tools/lib/src/commands/ios.dart
@@ -8,7 +8,7 @@ import "package:path/path.dart" as path; import "../artifacts.dart"; -import "../base/context.dart"; +import "../base/globals.dart"; import "../base/process.dart"; import "../runner/flutter_command.dart"; import "../runner/flutter_command_runner.dart";
diff --git a/packages/flutter_tools/lib/src/commands/list.dart b/packages/flutter_tools/lib/src/commands/list.dart index 885ba15..2eb0437 100644 --- a/packages/flutter_tools/lib/src/commands/list.dart +++ b/packages/flutter_tools/lib/src/commands/list.dart
@@ -4,7 +4,7 @@ import 'dart:async'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../device.dart'; import '../runner/flutter_command.dart'; @@ -15,9 +15,7 @@ bool get requiresProjectRoot => false; Future<int> runInProject() async { - DeviceManager deviceManager = new DeviceManager(); - - List<Device> devices = await deviceManager.getDevices(); + List<Device> devices = await deviceManager.getAllConnectedDevices(); if (devices.isEmpty) { printStatus('No connected devices.');
diff --git a/packages/flutter_tools/lib/src/commands/listen.dart b/packages/flutter_tools/lib/src/commands/listen.dart index b139355..4fd76de 100644 --- a/packages/flutter_tools/lib/src/commands/listen.dart +++ b/packages/flutter_tools/lib/src/commands/listen.dart
@@ -5,7 +5,7 @@ import 'dart:async'; import 'dart:io'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; import 'start.dart';
diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart index 0b274d3..3766de2 100644 --- a/packages/flutter_tools/lib/src/commands/logs.dart +++ b/packages/flutter_tools/lib/src/commands/logs.dart
@@ -4,7 +4,7 @@ import 'dart:async'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../device.dart'; import '../runner/flutter_command.dart'; @@ -24,21 +24,14 @@ Future<int> runInProject() async { DeviceManager deviceManager = new DeviceManager(); - List<Device> devices; + deviceManager.specifiedDeviceId = globalResults['device-id']; - String deviceId = globalResults['device-id']; - if (deviceId != null) { - Device device = await deviceManager.getDeviceById(deviceId); - if (device == null) { - printError("No device found with id '$deviceId'."); - return 1; - } - devices = <Device>[device]; - } else { - devices = await deviceManager.getDevices(); - } + List<Device> devices = await deviceManager.getDevices(); - if (devices.isEmpty) { + if (devices.isEmpty && deviceManager.hasSpecifiedDeviceId) { + printError("No device found with id '${deviceManager.specifiedDeviceId}'."); + return 1; + } else if (devices.isEmpty) { printStatus('No connected devices.'); return 0; }
diff --git a/packages/flutter_tools/lib/src/commands/refresh.dart b/packages/flutter_tools/lib/src/commands/refresh.dart index 02bb4d5..35ff972 100644 --- a/packages/flutter_tools/lib/src/commands/refresh.dart +++ b/packages/flutter_tools/lib/src/commands/refresh.dart
@@ -7,7 +7,7 @@ import 'package:path/path.dart' as path; -import '../base/context.dart'; +import '../base/globals.dart'; import '../flx.dart'; import '../runner/flutter_command.dart';
diff --git a/packages/flutter_tools/lib/src/commands/run_mojo.dart b/packages/flutter_tools/lib/src/commands/run_mojo.dart index 9acffbc..77dc2a1 100644 --- a/packages/flutter_tools/lib/src/commands/run_mojo.dart +++ b/packages/flutter_tools/lib/src/commands/run_mojo.dart
@@ -8,7 +8,7 @@ import 'package:path/path.dart' as path; import '../artifacts.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../flx.dart' as flx; @@ -118,7 +118,7 @@ if (useDevtools) { final String buildFlag = argResults['mojo-debug'] ? '--debug' : '--release'; args.add(buildFlag); - if (context.verbose) + if (logger.verbose) args.add('--verbose'); }
diff --git a/packages/flutter_tools/lib/src/commands/start.dart b/packages/flutter_tools/lib/src/commands/start.dart index ba653b0..9b9259e 100644 --- a/packages/flutter_tools/lib/src/commands/start.dart +++ b/packages/flutter_tools/lib/src/commands/start.dart
@@ -9,7 +9,7 @@ import '../application_package.dart'; import '../base/common.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../build_configuration.dart'; import '../device.dart'; import '../flx.dart';
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 127391b..e7ebac2 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -9,7 +9,7 @@ import 'package:test/src/executable.dart' as executable; import '../artifacts.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../build_configuration.dart'; import '../runner/flutter_command.dart'; import '../test/loader.dart' as loader;
diff --git a/packages/flutter_tools/lib/src/commands/trace.dart b/packages/flutter_tools/lib/src/commands/trace.dart index d66b741..a40af6d 100644 --- a/packages/flutter_tools/lib/src/commands/trace.dart +++ b/packages/flutter_tools/lib/src/commands/trace.dart
@@ -6,7 +6,7 @@ import '../android/device_android.dart'; import '../application_package.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../runner/flutter_command.dart'; class TraceCommand extends FlutterCommand {
diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart index b9d249c..5e2a124 100644 --- a/packages/flutter_tools/lib/src/commands/upgrade.dart +++ b/packages/flutter_tools/lib/src/commands/upgrade.dart
@@ -5,7 +5,7 @@ import 'dart:async'; import '../artifacts.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; import '../runner/flutter_command.dart'; import '../runner/version.dart';
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 460ade4..7c865b3 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart
@@ -7,33 +7,48 @@ import 'android/device_android.dart'; import 'application_package.dart'; import 'base/common.dart'; -import 'base/context.dart'; +import 'base/globals.dart'; import 'build_configuration.dart'; import 'ios/device_ios.dart'; import 'toolchain.dart'; /// A class to get all available devices. class DeviceManager { + /// Constructing DeviceManagers is cheap; they only do expensive work if some + /// of their methods are invoked. DeviceManager() { - // Init the known discoverers. + // Register the known discoverers. _deviceDiscoverers.add(new AndroidDeviceDiscovery()); _deviceDiscoverers.add(new IOSDeviceDiscovery()); _deviceDiscoverers.add(new IOSSimulatorDiscovery()); + } - Future.forEach(_deviceDiscoverers, (DeviceDiscovery discoverer) { - if (!discoverer.supportsPlatform) - return null; - return discoverer.init(); - }).then((_) { - _initedCompleter.complete(); - }).catchError((error, stackTrace) { - _initedCompleter.completeError(error, stackTrace); - }); + Future _init() { + if (_initedCompleter == null) { + _initedCompleter = new Completer(); + + Future.forEach(_deviceDiscoverers, (DeviceDiscovery discoverer) { + if (!discoverer.supportsPlatform) + return null; + return discoverer.init(); + }).then((_) { + _initedCompleter.complete(); + }).catchError((error, stackTrace) { + _initedCompleter.completeError(error, stackTrace); + }); + } + + return _initedCompleter.future; } List<DeviceDiscovery> _deviceDiscoverers = <DeviceDiscovery>[]; - Completer _initedCompleter = new Completer(); + /// A user-specified device ID. + String specifiedDeviceId; + + Completer _initedCompleter; + + bool get hasSpecifiedDeviceId => specifiedDeviceId != null; /// Return the device with the matching ID; else, complete the Future with /// `null`. @@ -41,15 +56,26 @@ /// This does a case insentitive compare with `deviceId`. Future<Device> getDeviceById(String deviceId) async { deviceId = deviceId.toLowerCase(); - List<Device> devices = await getDevices(); + List<Device> devices = await getAllConnectedDevices(); return devices.firstWhere( (Device device) => device.id.toLowerCase() == deviceId, orElse: () => null ); } + /// Return the list of connected devices, filtered by any user-specified device id. Future<List<Device>> getDevices() async { - await _initedCompleter.future; + if (specifiedDeviceId == null) { + return getAllConnectedDevices(); + } else { + Device device = await getDeviceById(specifiedDeviceId); + return device == null ? <Device>[] : <Device>[device]; + } + } + + /// Return the list of all connected devices. + Future<List<Device>> getAllConnectedDevices() async { + await _init(); return _deviceDiscoverers .where((DeviceDiscovery discoverer) => discoverer.supportsPlatform)
diff --git a/packages/flutter_tools/lib/src/flx.dart b/packages/flutter_tools/lib/src/flx.dart index 2fb6efc..00973bc 100644 --- a/packages/flutter_tools/lib/src/flx.dart +++ b/packages/flutter_tools/lib/src/flx.dart
@@ -13,7 +13,7 @@ import 'package:path/path.dart' as path; import 'package:yaml/yaml.dart'; -import 'base/context.dart'; +import 'base/globals.dart'; import 'base/file_system.dart'; import 'toolchain.dart';
diff --git a/packages/flutter_tools/lib/src/ios/device_ios.dart b/packages/flutter_tools/lib/src/ios/device_ios.dart index 321ef61..6ce1789 100644 --- a/packages/flutter_tools/lib/src/ios/device_ios.dart +++ b/packages/flutter_tools/lib/src/ios/device_ios.dart
@@ -9,7 +9,7 @@ import '../application_package.dart'; import '../base/common.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../device.dart';
diff --git a/packages/flutter_tools/lib/src/ios/simulator.dart b/packages/flutter_tools/lib/src/ios/simulator.dart index eecd1af..f776382 100644 --- a/packages/flutter_tools/lib/src/ios/simulator.dart +++ b/packages/flutter_tools/lib/src/ios/simulator.dart
@@ -6,7 +6,7 @@ import 'dart:convert' show JSON; import 'dart:io'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; const String _xcrunPath = '/usr/bin/xcrun';
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 4df0131..2e94cbc 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -8,9 +8,9 @@ import 'package:args/command_runner.dart'; import '../application_package.dart'; -import '../base/context.dart'; -import '../build_configuration.dart'; import '../artifacts.dart'; +import '../base/globals.dart'; +import '../build_configuration.dart'; import '../device.dart'; import '../toolchain.dart'; import 'flutter_command_runner.dart';
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart index 65da945..a01c21f 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -10,7 +10,7 @@ import 'package:path/path.dart' as path; import '../artifacts.dart'; -import '../base/context.dart'; +import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import 'version.dart'; @@ -158,10 +158,15 @@ } Future<int> runCommand(ArgResults globalResults) { - if (globalResults['verbose']) - context.verbose = true; - _globalResults = globalResults; + + // Check for verbose. + if (globalResults['verbose']) + logger.verbose = true; + + // See if the user specified a specific device. + deviceManager.specifiedDeviceId = globalResults['device-id']; + ArtifactStore.flutterRoot = path.normalize(path.absolute(globalResults['flutter-root'])); if (globalResults.wasParsed('package-root')) ArtifactStore.packageRoot = path.normalize(path.absolute(globalResults['package-root']));