From d5a6fceee5845571afd0db0470ae8bdc4c18b4e6 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 17 Feb 2016 00:59:56 -0800 Subject: [PATCH] add a summary option to the doctor class --- .../flutter_tools/lib/src/android/adb.dart | 2 +- .../lib/src/android/android_sdk.dart | 2 +- .../lib/src/android/android_workflow.dart | 13 ++- .../lib/src/android/device_android.dart | 2 +- packages/flutter_tools/lib/src/artifacts.dart | 2 +- .../flutter_tools/lib/src/base/process.dart | 2 +- .../lib/src/build_configuration.dart | 2 +- .../lib/src/commands/analyze.dart | 4 +- .../flutter_tools/lib/src/commands/apk.dart | 2 +- .../flutter_tools/lib/src/commands/build.dart | 4 +- .../flutter_tools/lib/src/commands/cache.dart | 2 +- .../lib/src/commands/create.dart | 2 +- .../lib/src/commands/daemon.dart | 2 +- .../lib/src/commands/devices.dart | 2 +- .../lib/src/commands/doctor.dart | 6 +- .../lib/src/commands/listen.dart | 2 +- .../flutter_tools/lib/src/commands/logs.dart | 4 +- .../lib/src/commands/refresh.dart | 2 +- .../flutter_tools/lib/src/commands/run.dart | 2 +- .../lib/src/commands/run_mojo.dart | 2 +- .../flutter_tools/lib/src/commands/test.dart | 4 +- .../flutter_tools/lib/src/commands/trace.dart | 2 +- .../lib/src/commands/upgrade.dart | 2 +- packages/flutter_tools/lib/src/dart/pub.dart | 2 +- packages/flutter_tools/lib/src/device.dart | 2 +- packages/flutter_tools/lib/src/doctor.dart | 82 +++++++++++++++---- packages/flutter_tools/lib/src/flx.dart | 2 +- .../lib/src/{base => }/globals.dart | 12 +-- .../flutter_tools/lib/src/ios/device_ios.dart | 6 +- .../lib/src/ios/ios_workflow.dart | 23 ++++-- .../lib/src/ios/setup_xcodeproj.dart | 2 +- .../flutter_tools/lib/src/ios/simulator.dart | 2 +- .../lib/src/runner/flutter_command.dart | 2 +- .../src/runner/flutter_command_runner.dart | 10 ++- packages/flutter_tools/lib/src/services.dart | 2 +- packages/flutter_tools/test/context_test.dart | 2 +- packages/flutter_tools/test/daemon_test.dart | 2 +- 37 files changed, 146 insertions(+), 74 deletions(-) rename packages/flutter_tools/lib/src/{base => }/globals.dart (87%) diff --git a/packages/flutter_tools/lib/src/android/adb.dart b/packages/flutter_tools/lib/src/android/adb.dart index f5a5840b0a5..2392dc36ccf 100644 --- a/packages/flutter_tools/lib/src/android/adb.dart +++ b/packages/flutter_tools/lib/src/android/adb.dart @@ -5,8 +5,8 @@ import 'dart:async'; import 'dart:io'; -import '../base/globals.dart'; import '../base/process.dart'; +import '../globals.dart'; // https://android.googlesource.com/platform/system/core/+/android-4.4_r1/adb/OVERVIEW.TXT // https://android.googlesource.com/platform/system/core/+/android-4.4_r1/adb/SERVICES.TXT diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart index 27096f25a08..819f64f812b 100644 --- a/packages/flutter_tools/lib/src/android/android_sdk.dart +++ b/packages/flutter_tools/lib/src/android/android_sdk.dart @@ -7,8 +7,8 @@ import 'dart:io'; import 'package:path/path.dart' as path; import 'package:pub_semver/pub_semver.dart'; -import '../base/globals.dart'; import '../base/os.dart'; +import '../globals.dart'; // Android SDK layout: // diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart index 3bbc619e592..52b994219b1 100644 --- a/packages/flutter_tools/lib/src/android/android_workflow.dart +++ b/packages/flutter_tools/lib/src/android/android_workflow.dart @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import '../base/globals.dart'; import '../doctor.dart'; +import '../globals.dart'; import 'android_sdk.dart'; class AndroidWorkflow extends Workflow { @@ -15,8 +15,11 @@ class AndroidWorkflow extends Workflow { bool get canLaunchDevices => androidSdk != null && androidSdk.validateSdkWellFormed(complain: false); - void diagnose() { - Validator androidValidator = new Validator('Develop for Android devices'); + ValidationResult validate() { + Validator androidValidator = new Validator( + '$name toolchain', + description: 'develop for Android devices' + ); Function _sdkExists = () { return androidSdk == null ? ValidationType.missing : ValidationType.installed; @@ -29,6 +32,8 @@ class AndroidWorkflow extends Workflow { validatorFunction: _sdkExists )); - androidValidator.validate().print(); + return androidValidator.validate(); } + + void diagnose() => validate().print(); } diff --git a/packages/flutter_tools/lib/src/android/device_android.dart b/packages/flutter_tools/lib/src/android/device_android.dart index 5a3ec9c5041..2deaa9cc6d1 100644 --- a/packages/flutter_tools/lib/src/android/device_android.dart +++ b/packages/flutter_tools/lib/src/android/device_android.dart @@ -11,12 +11,12 @@ import 'package:path/path.dart' as path; import '../android/android_sdk.dart'; import '../application_package.dart'; import '../base/common.dart'; -import '../base/globals.dart'; import '../base/os.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../device.dart'; import '../flx.dart' as flx; +import '../globals.dart'; import '../toolchain.dart'; import 'adb.dart'; import 'android.dart'; diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index b57d81b8a76..6f962a95ef4 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -8,10 +8,10 @@ import 'dart:io'; import 'package:archive/archive.dart'; import 'package:path/path.dart' as path; -import 'base/globals.dart'; import 'base/os.dart'; import 'base/process.dart'; import 'build_configuration.dart'; +import 'globals.dart'; String _getNameForHostPlatform(HostPlatform platform) { switch (platform) { diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart index 28b4df5395b..1009e96c98e 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:async'; import 'dart:convert'; import 'dart:io'; -import 'globals.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 160334b4e7d..0dc165fdb2c 100644 --- a/packages/flutter_tools/lib/src/build_configuration.dart +++ b/packages/flutter_tools/lib/src/build_configuration.dart @@ -6,7 +6,7 @@ import 'dart:io'; import 'package:path/path.dart' as path; -import 'base/globals.dart'; +import '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 b50b90eea7d..d5a929df059 100644 --- a/packages/flutter_tools/lib/src/commands/analyze.dart +++ b/packages/flutter_tools/lib/src/commands/analyze.dart @@ -11,14 +11,14 @@ import 'package:den_api/den_api.dart'; import 'package:path/path.dart' as path; import '../artifacts.dart'; -import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; class AnalyzeCommand extends FlutterCommand { String get name => 'analyze'; - String get description => 'Runs a carefully configured dartanalyzer over the current project\'s Dart code.'; + String get description => 'Analyze the project\'s Dart code.'; AnalyzeCommand() { argParser.addFlag('flutter-repo', help: 'Include all the examples and tests from the Flutter repository.', defaultsTo: false); diff --git a/packages/flutter_tools/lib/src/commands/apk.dart b/packages/flutter_tools/lib/src/commands/apk.dart index ffc67815a12..57fb54e22f7 100644 --- a/packages/flutter_tools/lib/src/commands/apk.dart +++ b/packages/flutter_tools/lib/src/commands/apk.dart @@ -11,12 +11,12 @@ import '../android/android_sdk.dart'; import '../application_package.dart'; import '../artifacts.dart'; import '../base/file_system.dart'; -import '../base/globals.dart'; import '../base/os.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../device.dart'; import '../flx.dart' as flx; +import '../globals.dart'; import '../runner/flutter_command.dart'; import '../services.dart'; import '../toolchain.dart'; diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index 5e1f76332d5..4318334e2a3 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -4,14 +4,14 @@ import 'dart:async'; -import '../base/globals.dart'; import '../flx.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; import '../toolchain.dart'; class BuildCommand extends FlutterCommand { final String name = 'build'; - final String description = 'Packages your Flutter app into an FLX.'; + final String description = 'Package your Flutter app into an FLX.'; BuildCommand() { argParser.addFlag('precompiled', negatable: false); diff --git a/packages/flutter_tools/lib/src/commands/cache.dart b/packages/flutter_tools/lib/src/commands/cache.dart index 872dc43a9c2..c33d046bc30 100644 --- a/packages/flutter_tools/lib/src/commands/cache.dart +++ b/packages/flutter_tools/lib/src/commands/cache.dart @@ -7,7 +7,7 @@ import 'dart:async'; import 'package:args/command_runner.dart'; import '../artifacts.dart'; -import '../base/globals.dart'; +import '../globals.dart'; class CacheCommand extends Command { final String name = 'cache'; diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index 3f9f0cf26a6..14f6db96760 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -11,8 +11,8 @@ import 'package:path/path.dart' as path; import '../android/android.dart' as android; import '../artifacts.dart'; -import '../base/globals.dart'; import '../dart/pub.dart'; +import '../globals.dart'; import '../ios/setup_xcodeproj.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 4fdb860d611..252e929f760 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -10,9 +10,9 @@ import '../android/adb.dart'; import '../android/android_sdk.dart'; import '../android/device_android.dart'; import '../base/context.dart'; -import '../base/globals.dart'; import '../base/logger.dart'; import '../device.dart'; +import '../globals.dart'; import '../ios/device_ios.dart'; import '../ios/simulator.dart'; import '../runner/flutter_command.dart'; diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart index 3ff2697f744..6531c6389de 100644 --- a/packages/flutter_tools/lib/src/commands/devices.dart +++ b/packages/flutter_tools/lib/src/commands/devices.dart @@ -4,8 +4,8 @@ import 'dart:async'; -import '../base/globals.dart'; import '../device.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; class DevicesCommand extends FlutterCommand { diff --git a/packages/flutter_tools/lib/src/commands/doctor.dart b/packages/flutter_tools/lib/src/commands/doctor.dart index ed049d0d51d..dd30c60ce1f 100644 --- a/packages/flutter_tools/lib/src/commands/doctor.dart +++ b/packages/flutter_tools/lib/src/commands/doctor.dart @@ -5,20 +5,20 @@ import 'dart:async'; import '../artifacts.dart'; -import '../base/globals.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; import '../runner/version.dart'; class DoctorCommand extends FlutterCommand { final String name = 'doctor'; - final String description = 'Diagnose the flutter tool.'; + final String description = 'Show information about the installed tooling.'; bool get requiresProjectRoot => false; Future runInProject() async { // general info String flutterRoot = ArtifactStore.flutterRoot; - printStatus('Flutter root is $flutterRoot.'); + printStatus('Flutter root: $flutterRoot.'); printStatus(''); // doctor diff --git a/packages/flutter_tools/lib/src/commands/listen.dart b/packages/flutter_tools/lib/src/commands/listen.dart index f7680883260..e52cfc072d1 100644 --- a/packages/flutter_tools/lib/src/commands/listen.dart +++ b/packages/flutter_tools/lib/src/commands/listen.dart @@ -5,8 +5,8 @@ import 'dart:async'; import 'dart:io'; -import '../base/globals.dart'; import '../base/process.dart'; +import '../globals.dart'; import 'run.dart'; class ListenCommand extends RunCommandBase { diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart index 81956b66324..06d662295c2 100644 --- a/packages/flutter_tools/lib/src/commands/logs.dart +++ b/packages/flutter_tools/lib/src/commands/logs.dart @@ -4,13 +4,13 @@ import 'dart:async'; -import '../base/globals.dart'; import '../device.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; class LogsCommand extends FlutterCommand { final String name = 'logs'; - final String description = 'Show logs for running Flutter apps.'; + final String description = 'Show log output for running Flutter apps.'; LogsCommand() { argParser.addFlag('clear', diff --git a/packages/flutter_tools/lib/src/commands/refresh.dart b/packages/flutter_tools/lib/src/commands/refresh.dart index d4d5fc108ee..bed138dde21 100644 --- a/packages/flutter_tools/lib/src/commands/refresh.dart +++ b/packages/flutter_tools/lib/src/commands/refresh.dart @@ -7,8 +7,8 @@ import 'dart:io'; import 'package:path/path.dart' as path; -import '../base/globals.dart'; import '../flx.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; class RefreshCommand extends FlutterCommand { diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index 1ae20a57cd5..c4fcb7b900a 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -9,11 +9,11 @@ import 'package:path/path.dart' as path; import '../application_package.dart'; import '../base/common.dart'; -import '../base/globals.dart'; import '../build_configuration.dart'; import '../dart/pub.dart'; import '../device.dart'; import '../flx.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; import '../toolchain.dart'; import 'apk.dart'; diff --git a/packages/flutter_tools/lib/src/commands/run_mojo.dart b/packages/flutter_tools/lib/src/commands/run_mojo.dart index 28b6fbd774e..d6e8a928881 100644 --- a/packages/flutter_tools/lib/src/commands/run_mojo.dart +++ b/packages/flutter_tools/lib/src/commands/run_mojo.dart @@ -8,10 +8,10 @@ import 'dart:io'; import 'package:path/path.dart' as path; import '../artifacts.dart'; -import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../flx.dart' as flx; +import '../globals.dart'; import '../runner/flutter_command.dart'; import 'run.dart'; diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 91e0fbecdf8..fcd2324c183 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -9,14 +9,14 @@ import 'package:path/path.dart' as path; import 'package:test/src/executable.dart' as executable; import '../artifacts.dart'; -import '../base/globals.dart'; import '../build_configuration.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; import '../test/loader.dart' as loader; class TestCommand extends FlutterCommand { String get name => 'test'; - String get description => 'Runs Flutter unit tests for the current project (Linux only).'; + String get description => 'Run Flutter unit tests for the current project (Linux only).'; bool get requiresProjectRoot => false; diff --git a/packages/flutter_tools/lib/src/commands/trace.dart b/packages/flutter_tools/lib/src/commands/trace.dart index 365d552f4d6..a5b0744aadc 100644 --- a/packages/flutter_tools/lib/src/commands/trace.dart +++ b/packages/flutter_tools/lib/src/commands/trace.dart @@ -6,7 +6,7 @@ import 'dart:async'; import '../android/device_android.dart'; import '../application_package.dart'; -import '../base/globals.dart'; +import '../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 48b4c8f50fb..fbe67eedf94 100644 --- a/packages/flutter_tools/lib/src/commands/upgrade.dart +++ b/packages/flutter_tools/lib/src/commands/upgrade.dart @@ -5,8 +5,8 @@ import 'dart:async'; import '../artifacts.dart'; -import '../base/globals.dart'; import '../base/process.dart'; +import '../globals.dart'; import '../runner/flutter_command.dart'; import '../runner/version.dart'; diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart index 1856561c162..709d034390e 100644 --- a/packages/flutter_tools/lib/src/dart/pub.dart +++ b/packages/flutter_tools/lib/src/dart/pub.dart @@ -7,8 +7,8 @@ import 'dart:io'; import 'package:path/path.dart' as path; -import '../base/globals.dart'; import '../base/process.dart'; +import '../globals.dart'; Future pubGet({ String directory, diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 274d1fff69d..28c9333654f 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -7,8 +7,8 @@ import 'dart:async'; import 'android/device_android.dart'; import 'application_package.dart'; import 'base/common.dart'; -import 'base/globals.dart'; import 'build_configuration.dart'; +import 'globals.dart'; import 'ios/device_ios.dart'; import 'toolchain.dart'; diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index 4fb43863950..d5f1d99ede1 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -4,7 +4,7 @@ import 'android/android_workflow.dart'; import 'base/context.dart'; -import 'base/globals.dart'; +import 'globals.dart'; import 'ios/ios_workflow.dart'; class Doctor { @@ -34,6 +34,35 @@ class Doctor { List get workflows => _workflows; + /// Print a summary of the state of the tooling, as well as how to get more info. + void summary() => printStatus(summaryText); + + String get summaryText { + StringBuffer buffer = new StringBuffer(); + + bool allGood = true; + + for (Workflow workflow in workflows) { + ValidationResult result = workflow.validate(); + buffer.write('${result.leadingBox} The ${workflow.name} toolchain is '); + if (result.type == ValidationType.missing) + buffer.writeln('not installed.'); + else if (result.type == ValidationType.partial) + buffer.writeln('partially installed; more components are available.'); + else + buffer.writeln('fully installed.'); + if (result.type != ValidationType.installed) + allGood = false; + } + + if (!allGood) { + buffer.writeln(); + buffer.write('Run "flutter doctor" for information about installing additional components.'); + } + + return buffer.toString(); + } + /// Print verbose information about the state of installed tooling. void diagnose() { for (int i = 0; i < workflows.length; i++) { @@ -63,6 +92,8 @@ abstract class Workflow { /// Could this thing launch *something*? It may still have minor issues. bool get canLaunchDevices; + ValidationResult validate(); + /// Print verbose information about the state of the workflow. void diagnose(); @@ -85,20 +116,28 @@ class Validator { final String resolution; final ValidationFunction validatorFunction; - List _children = []; + List _children = []; ValidationResult validate() { + List childResults; + ValidationType type; + if (validatorFunction != null) - return new ValidationResult(validatorFunction(), this); + type = validatorFunction(); - List results = _children.map((Validator child) { - return child.validate(); - }).toList(); + childResults = _children.map((Validator child) => child.validate()).toList(); - ValidationType type = _combine(results.map((ValidationResult result) { - return result.type; - })); - return new ValidationResult(type, this, results); + // If there's no immediate validator, the result we return is synthesized + // from the sub-tree of children. This is so we can show that the branch is + // not fully installed. + if (type == null) { + type = _combine(childResults + .expand((ValidationResult child) => child._allResults) + .map((ValidationResult result) => result.type) + ); + } + + return new ValidationResult(type, this, childResults); } ValidationType _combine(Iterable types) { @@ -119,6 +158,15 @@ class ValidationResult { final Validator validator; final List childResults; + String get leadingBox { + if (type == ValidationType.missing) + return '[ ]'; + else if (type == ValidationType.installed) + return '[✓]'; + else + return '[-]'; + } + void print([String indent = '']) { printSelf(indent); @@ -126,15 +174,15 @@ class ValidationResult { child.print(indent + ' '); } - void printSelf(String indent) { + void printSelf([String indent = '']) { String result = indent; if (type == ValidationType.missing) - result += '[ ] '; + result += '$leadingBox '; else if (type == ValidationType.installed) - result += '[✓] '; + result += '$leadingBox '; else - result += '[-] '; + result += '$leadingBox '; result += '${validator.name} '; @@ -151,4 +199,10 @@ class ValidationResult { if (type == ValidationType.missing && validator.resolution != null) printStatus('$indent ${validator.resolution}'); } + + List get _allResults { + List results = [this]; + results.addAll(childResults); + return results; + } } diff --git a/packages/flutter_tools/lib/src/flx.dart b/packages/flutter_tools/lib/src/flx.dart index 2e03bd1fafd..e12c43413e7 100644 --- a/packages/flutter_tools/lib/src/flx.dart +++ b/packages/flutter_tools/lib/src/flx.dart @@ -14,7 +14,7 @@ import 'package:path/path.dart' as path; import 'package:yaml/yaml.dart'; import 'base/file_system.dart'; -import 'base/globals.dart'; +import 'globals.dart'; import 'toolchain.dart'; const String defaultMainPath = 'lib/main.dart'; diff --git a/packages/flutter_tools/lib/src/base/globals.dart b/packages/flutter_tools/lib/src/globals.dart similarity index 87% rename from packages/flutter_tools/lib/src/base/globals.dart rename to packages/flutter_tools/lib/src/globals.dart index d4f139862fa..efd072ef865 100644 --- a/packages/flutter_tools/lib/src/base/globals.dart +++ b/packages/flutter_tools/lib/src/globals.dart @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import '../android/android_sdk.dart'; -import '../device.dart'; -import '../doctor.dart'; -import '../ios/mac.dart'; -import 'context.dart'; -import 'logger.dart'; +import 'android/android_sdk.dart'; +import 'base/context.dart'; +import 'base/logger.dart'; +import 'device.dart'; +import 'doctor.dart'; +import 'ios/mac.dart'; DeviceManager get deviceManager => context[DeviceManager]; Logger get logger => context[Logger]; diff --git a/packages/flutter_tools/lib/src/ios/device_ios.dart b/packages/flutter_tools/lib/src/ios/device_ios.dart index eebcf1898b1..b6a667c98f4 100644 --- a/packages/flutter_tools/lib/src/ios/device_ios.dart +++ b/packages/flutter_tools/lib/src/ios/device_ios.dart @@ -3,21 +3,21 @@ // found in the LICENSE file. import 'dart:async'; -import 'dart:io'; import 'dart:convert'; +import 'dart:io'; import 'package:path/path.dart' as path; import '../application_package.dart'; import '../artifacts.dart'; import '../base/common.dart'; -import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; import '../device.dart'; +import '../globals.dart'; +import '../ios/setup_xcodeproj.dart'; import '../services.dart'; import '../toolchain.dart'; -import '../ios/setup_xcodeproj.dart'; import 'simulator.dart'; const String _ideviceinstallerInstructions = diff --git a/packages/flutter_tools/lib/src/ios/ios_workflow.dart b/packages/flutter_tools/lib/src/ios/ios_workflow.dart index 8dfc94f2c50..5cc4f704729 100644 --- a/packages/flutter_tools/lib/src/ios/ios_workflow.dart +++ b/packages/flutter_tools/lib/src/ios/ios_workflow.dart @@ -4,9 +4,9 @@ import 'dart:io'; -import '../base/globals.dart'; import '../base/process.dart'; import '../doctor.dart'; +import '../globals.dart'; class IOSWorkflow extends Workflow { IOSWorkflow() : super('iOS'); @@ -20,8 +20,11 @@ class IOSWorkflow extends Workflow { // for real devices. bool get canLaunchDevices => xcode.isInstalled; - void diagnose() { - Validator iosValidator = new Validator('Develop for iOS devices'); + ValidationResult validate() { + Validator iosValidator = new Validator( + '$name toolchain', + description: 'develop for iOS devices' + ); Function _xcodeExists = () { return xcode.isInstalled ? ValidationType.installed : ValidationType.missing; @@ -48,30 +51,34 @@ class IOSWorkflow extends Workflow { validatorFunction: _xcodeExists )); - iosValidator.addValidator(new Validator( + Validator brewValidator = new Validator( 'brew', description: 'install additional development packages', resolution: 'Download at http://brew.sh/', validatorFunction: _brewExists - )); + ); - iosValidator.addValidator(new Validator( + iosValidator.addValidator(brewValidator); + + brewValidator.addValidator(new Validator( 'ideviceinstaller', description: 'discover connected iOS devices', resolution: "Install via 'brew install ideviceinstaller'", validatorFunction: _ideviceinstallerExists )); - iosValidator.addValidator(new Validator( + brewValidator.addValidator(new Validator( 'ios-deploy', description: 'deploy to connected iOS devices', resolution: "Install via 'brew install ios-deploy'", validatorFunction: _iosdeployExists )); - iosValidator.validate().print(); + return iosValidator.validate(); } + void diagnose() => validate().print(); + bool get hasIdeviceId => exitsHappy(['idevice_id', '-h']); /// Return whether the tooling to list and deploy to real iOS devices (not the diff --git a/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart b/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart index 3d391750d45..ce97d9471c7 100644 --- a/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart @@ -8,8 +8,8 @@ import 'dart:io'; import 'package:path/path.dart' as path; import '../artifacts.dart'; -import '../base/globals.dart'; import '../base/process.dart'; +import '../globals.dart'; import '../runner/flutter_command_runner.dart'; /// A map from file path to file contents. diff --git a/packages/flutter_tools/lib/src/ios/simulator.dart b/packages/flutter_tools/lib/src/ios/simulator.dart index f77638215e5..33281914213 100644 --- a/packages/flutter_tools/lib/src/ios/simulator.dart +++ b/packages/flutter_tools/lib/src/ios/simulator.dart @@ -6,8 +6,8 @@ import 'dart:async'; import 'dart:convert' show JSON; import 'dart:io'; -import '../base/globals.dart'; import '../base/process.dart'; +import '../globals.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 2e94cbcbefa..6bc0cd2797d 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -9,9 +9,9 @@ import 'package:args/command_runner.dart'; import '../application_package.dart'; import '../artifacts.dart'; -import '../base/globals.dart'; import '../build_configuration.dart'; import '../device.dart'; +import '../globals.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 9e68c79cd2d..5b5d6b6895a 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart @@ -12,9 +12,9 @@ import 'package:path/path.dart' as path; import '../android/android_sdk.dart'; import '../artifacts.dart'; import '../base/context.dart'; -import '../base/globals.dart'; import '../base/process.dart'; import '../build_configuration.dart'; +import '../globals.dart'; import 'version.dart'; const String kFlutterRootEnvironmentVariableName = 'FLUTTER_ROOT'; // should point to //flutter/ (root of flutter/flutter repo) @@ -45,6 +45,7 @@ class FlutterCommandRunner extends CommandRunner { else packagesHelp = '\n(required, since the current directory does not contain a "packages" subdirectory)'; argParser.addOption('package-root', + hide: !verboseHelp, help: 'Path to your packages directory.$packagesHelp'); argParser.addOption('flutter-root', help: 'The root directory of the Flutter repository. Uses \$$kFlutterRootEnvironmentVariableName if set,\n' @@ -122,7 +123,10 @@ class FlutterCommandRunner extends CommandRunner { defaultsTo: 'out/ios_sim_Release/'); } - final String usageFooter = 'Run "flutter -h -v" for verbose help output, including less commonly used options.'; + String get usageFooter => + 'Run "flutter -h -v" for verbose help output, including less commonly used options.\n' + '\n' + '${doctor.summaryText}'; List get buildConfigurations { if (_buildConfigurations == null) @@ -191,6 +195,8 @@ class FlutterCommandRunner extends CommandRunner { if (globalResults['version']) { printStatus(getVersion(ArtifactStore.flutterRoot)); + printStatus(''); + doctor.summary(); return new Future.value(0); } diff --git a/packages/flutter_tools/lib/src/services.dart b/packages/flutter_tools/lib/src/services.dart index ca422b745d2..ce08d094b16 100644 --- a/packages/flutter_tools/lib/src/services.dart +++ b/packages/flutter_tools/lib/src/services.dart @@ -10,7 +10,7 @@ import 'package:path/path.dart' as path; import 'package:yaml/yaml.dart'; import 'artifacts.dart'; -import 'base/globals.dart'; +import 'globals.dart'; const String _kFlutterManifestPath = 'flutter.yaml'; const String _kFlutterServicesManifestPath = 'flutter_services.yaml'; diff --git a/packages/flutter_tools/test/context_test.dart b/packages/flutter_tools/test/context_test.dart index 74ecb0c9210..1de58405d4d 100644 --- a/packages/flutter_tools/test/context_test.dart +++ b/packages/flutter_tools/test/context_test.dart @@ -3,8 +3,8 @@ // found in the LICENSE file. import 'package:flutter_tools/src/base/context.dart' hide context; -import 'package:flutter_tools/src/base/globals.dart'; import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/globals.dart'; import 'package:test/test.dart'; main() => defineTests(); diff --git a/packages/flutter_tools/test/daemon_test.dart b/packages/flutter_tools/test/daemon_test.dart index e735bd36937..70035a973b7 100644 --- a/packages/flutter_tools/test/daemon_test.dart +++ b/packages/flutter_tools/test/daemon_test.dart @@ -5,9 +5,9 @@ import 'dart:async'; import 'package:flutter_tools/src/base/context.dart'; -import 'package:flutter_tools/src/base/globals.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/commands/daemon.dart'; +import 'package:flutter_tools/src/globals.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart';