Commit 9662d49e authored by Adam Barth's avatar Adam Barth

Clean up code organization in flutter_tools

1) Moved basic utility code into base/ directory to make it clear which code
   doesn't depend on Flutter-specific knowldge.
2) Move the CommandRunner subclasses into a runner/ directory because these
   aren't commands themselves.
parent 38215608
...@@ -9,12 +9,12 @@ import 'package:args/command_runner.dart'; ...@@ -9,12 +9,12 @@ import 'package:args/command_runner.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:stack_trace/stack_trace.dart'; import 'package:stack_trace/stack_trace.dart';
import 'src/base/process.dart';
import 'src/commands/analyze.dart'; import 'src/commands/analyze.dart';
import 'src/commands/apk.dart'; import 'src/commands/apk.dart';
import 'src/commands/build.dart'; import 'src/commands/build.dart';
import 'src/commands/cache.dart'; import 'src/commands/cache.dart';
import 'src/commands/daemon.dart'; import 'src/commands/daemon.dart';
import 'src/commands/flutter_command_runner.dart';
import 'src/commands/init.dart'; import 'src/commands/init.dart';
import 'src/commands/install.dart'; import 'src/commands/install.dart';
import 'src/commands/list.dart'; import 'src/commands/list.dart';
...@@ -26,7 +26,7 @@ import 'src/commands/stop.dart'; ...@@ -26,7 +26,7 @@ import 'src/commands/stop.dart';
import 'src/commands/test.dart'; import 'src/commands/test.dart';
import 'src/commands/trace.dart'; import 'src/commands/trace.dart';
import 'src/commands/upgrade.dart'; import 'src/commands/upgrade.dart';
import 'src/process.dart'; import 'src/runner/flutter_command_runner.dart';
/// Main entry point for commands. /// Main entry point for commands.
/// ///
......
...@@ -4,14 +4,11 @@ ...@@ -4,14 +4,11 @@
import 'dart:async'; import 'dart:async';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'artifacts.dart'; import 'artifacts.dart';
import 'build_configuration.dart'; import 'build_configuration.dart';
final Logger _logging = new Logger('flutter_tools.application_package');
abstract class ApplicationPackage { abstract class ApplicationPackage {
/// Path to the actual apk or bundle. /// Path to the actual apk or bundle.
final String localPath; final String localPath;
......
...@@ -6,14 +6,12 @@ import 'dart:async'; ...@@ -6,14 +6,12 @@ import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:archive/archive.dart'; import 'package:archive/archive.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'build_configuration.dart'; import 'build_configuration.dart';
import 'os_utils.dart'; import 'base/os.dart';
import 'process.dart'; import 'base/process.dart';
import 'base/logging.dart';
final Logger _logging = new Logger('flutter_tools.artifacts');
String _getNameForHostPlatform(HostPlatform platform) { String _getNameForHostPlatform(HostPlatform platform) {
switch (platform) { switch (platform) {
...@@ -221,12 +219,12 @@ class ArtifactStore { ...@@ -221,12 +219,12 @@ class ArtifactStore {
/// and extract it to the local cache. /// and extract it to the local cache.
static Future _doDownloadArtifactsFromZip(String platform) async { static Future _doDownloadArtifactsFromZip(String platform) async {
String url = getCloudStorageBaseUrl(platform) + 'artifacts.zip'; String url = getCloudStorageBaseUrl(platform) + 'artifacts.zip';
_logging.info('Downloading $url.'); logging.info('Downloading $url.');
HttpClient httpClient = new HttpClient(); HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.getUrl(Uri.parse(url)); HttpClientRequest request = await httpClient.getUrl(Uri.parse(url));
HttpClientResponse response = await request.close(); HttpClientResponse response = await request.close();
_logging.fine('Received response statusCode=${response.statusCode}'); logging.fine('Received response statusCode=${response.statusCode}');
if (response.statusCode != 200) if (response.statusCode != 200)
throw new Exception(response.reasonPhrase); throw new Exception(response.reasonPhrase);
...@@ -246,7 +244,7 @@ class ArtifactStore { ...@@ -246,7 +244,7 @@ class ArtifactStore {
for (Artifact artifact in knownArtifacts) { for (Artifact artifact in knownArtifacts) {
if (artifact.platform == platform && artifact.executable) { if (artifact.platform == platform && artifact.executable) {
ProcessResult result = osUtils.makeExecutable( ProcessResult result = os.makeExecutable(
new File(path.join(cacheDir.path, artifact.fileName))); new File(path.join(cacheDir.path, artifact.fileName)));
if (result.exitCode != 0) if (result.exitCode != 0)
throw new Exception(result.stderr); throw new Exception(result.stderr);
...@@ -270,7 +268,7 @@ class ArtifactStore { ...@@ -270,7 +268,7 @@ class ArtifactStore {
static Directory _getBaseCacheDir() { static Directory _getBaseCacheDir() {
if (flutterRoot == null) { if (flutterRoot == null) {
_logging.severe('FLUTTER_ROOT not specified. Cannot find artifact cache.'); logging.severe('FLUTTER_ROOT not specified. Cannot find artifact cache.');
throw new ProcessExit(2); throw new ProcessExit(2);
} }
Directory cacheDir = new Directory(path.join(flutterRoot, 'bin', 'cache', 'artifacts')); Directory cacheDir = new Directory(path.join(flutterRoot, 'bin', 'cache', 'artifacts'));
...@@ -296,7 +294,7 @@ class ArtifactStore { ...@@ -296,7 +294,7 @@ class ArtifactStore {
if (!cachedFile.existsSync()) { if (!cachedFile.existsSync()) {
await _downloadArtifactsFromZip(artifact.platform); await _downloadArtifactsFromZip(artifact.platform);
if (!cachedFile.existsSync()) { if (!cachedFile.existsSync()) {
_logging.severe('File not found in the platform artifacts: ${cachedFile.path}'); logging.severe('File not found in the platform artifacts: ${cachedFile.path}');
throw new ProcessExit(2); throw new ProcessExit(2);
} }
} }
...@@ -305,7 +303,7 @@ class ArtifactStore { ...@@ -305,7 +303,7 @@ class ArtifactStore {
static void clear() { static void clear() {
Directory cacheDir = _getBaseCacheDir(); Directory cacheDir = _getBaseCacheDir();
_logging.fine('Clearing cache directory ${cacheDir.path}'); logging.fine('Clearing cache directory ${cacheDir.path}');
cacheDir.deleteSync(recursive: true); cacheDir.deleteSync(recursive: true);
} }
......
// 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:logging/logging.dart';
final Logger logging = new Logger('flutter_tools');
...@@ -4,11 +4,7 @@ ...@@ -4,11 +4,7 @@
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart'; final OperatingSystemUtils os = new OperatingSystemUtils._();
final OperatingSystemUtils osUtils = new OperatingSystemUtils._();
final Logger _logging = new Logger('flutter_tools.os');
abstract class OperatingSystemUtils { abstract class OperatingSystemUtils {
factory OperatingSystemUtils._() { factory OperatingSystemUtils._() {
......
...@@ -6,9 +6,7 @@ import 'dart:async'; ...@@ -6,9 +6,7 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart'; import 'logging.dart';
final Logger _logging = new Logger('flutter_tools.process');
/// This runs the command and streams stdout/stderr from the child process to /// This runs the command and streams stdout/stderr from the child process to
/// this process' stdout/stderr. /// this process' stdout/stderr.
...@@ -17,7 +15,7 @@ Future<int> runCommandAndStreamOutput(List<String> cmd, { ...@@ -17,7 +15,7 @@ Future<int> runCommandAndStreamOutput(List<String> cmd, {
RegExp filter, RegExp filter,
String workingDirectory String workingDirectory
}) async { }) async {
_logging.info(cmd.join(' ')); logging.info(cmd.join(' '));
Process process = await Process.start( Process process = await Process.start(
cmd[0], cmd[0],
cmd.sublist(1), cmd.sublist(1),
...@@ -49,13 +47,13 @@ Future<int> runCommandAndStreamOutput(List<String> cmd, { ...@@ -49,13 +47,13 @@ Future<int> runCommandAndStreamOutput(List<String> cmd, {
Future runAndKill(List<String> cmd, Duration timeout) { Future runAndKill(List<String> cmd, Duration timeout) {
Future<Process> proc = runDetached(cmd); Future<Process> proc = runDetached(cmd);
return new Future.delayed(timeout, () async { return new Future.delayed(timeout, () async {
_logging.info('Intentionally killing ${cmd[0]}'); logging.info('Intentionally killing ${cmd[0]}');
Process.killPid((await proc).pid); Process.killPid((await proc).pid);
}); });
} }
Future<Process> runDetached(List<String> cmd) { Future<Process> runDetached(List<String> cmd) {
_logging.info(cmd.join(' ')); logging.info(cmd.join(' '));
Future<Process> proc = Process.start( Future<Process> proc = Process.start(
cmd[0], cmd.getRange(1, cmd.length).toList(), cmd[0], cmd.getRange(1, cmd.length).toList(),
mode: ProcessStartMode.DETACHED); mode: ProcessStartMode.DETACHED);
...@@ -81,20 +79,20 @@ String _runWithLoggingSync(List<String> cmd, { ...@@ -81,20 +79,20 @@ String _runWithLoggingSync(List<String> cmd, {
bool checked: false, bool checked: false,
String workingDirectory String workingDirectory
}) { }) {
_logging.info(cmd.join(' ')); logging.info(cmd.join(' '));
ProcessResult results = ProcessResult results =
Process.runSync(cmd[0], cmd.getRange(1, cmd.length).toList(), workingDirectory: workingDirectory); Process.runSync(cmd[0], cmd.getRange(1, cmd.length).toList(), workingDirectory: workingDirectory);
if (results.exitCode != 0) { if (results.exitCode != 0) {
String errorDescription = 'Error code ${results.exitCode} ' String errorDescription = 'Error code ${results.exitCode} '
'returned when attempting to run command: ${cmd.join(' ')}'; 'returned when attempting to run command: ${cmd.join(' ')}';
_logging.info(errorDescription); logging.info(errorDescription);
if (results.stderr.length > 0) if (results.stderr.length > 0)
_logging.info('Errors logged: ${results.stderr.trim()}'); logging.info('Errors logged: ${results.stderr.trim()}');
if (checked) if (checked)
throw errorDescription; throw errorDescription;
} }
if (results.stdout.trim().isNotEmpty) if (results.stdout.trim().isNotEmpty)
_logging.fine(results.stdout.trim()); logging.fine(results.stdout.trim());
return results.stdout; return results.stdout;
} }
......
...@@ -4,10 +4,9 @@ ...@@ -4,10 +4,9 @@
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
final Logger _logging = new Logger('flutter_tools.build_configuration'); import 'base/logging.dart';
enum BuildType { enum BuildType {
prebuilt, prebuilt,
...@@ -33,7 +32,7 @@ HostPlatform getCurrentHostPlatform() { ...@@ -33,7 +32,7 @@ HostPlatform getCurrentHostPlatform() {
return HostPlatform.mac; return HostPlatform.mac;
if (Platform.isLinux) if (Platform.isLinux)
return HostPlatform.linux; return HostPlatform.linux;
_logging.warning('Unsupported host platform, defaulting to Linux'); logging.warning('Unsupported host platform, defaulting to Linux');
return HostPlatform.linux; return HostPlatform.linux;
} }
...@@ -42,7 +41,7 @@ TargetPlatform getCurrentHostPlatformAsTarget() { ...@@ -42,7 +41,7 @@ TargetPlatform getCurrentHostPlatformAsTarget() {
return TargetPlatform.mac; return TargetPlatform.mac;
if (Platform.isLinux) if (Platform.isLinux)
return TargetPlatform.linux; return TargetPlatform.linux;
_logging.warning('Unsupported host platform, defaulting to Linux'); logging.warning('Unsupported host platform, defaulting to Linux');
return TargetPlatform.linux; return TargetPlatform.linux;
} }
......
...@@ -6,15 +6,13 @@ import 'dart:async'; ...@@ -6,15 +6,13 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import '../artifacts.dart'; import '../artifacts.dart';
import '../base/logging.dart';
import '../base/process.dart';
import '../build_configuration.dart'; import '../build_configuration.dart';
import '../process.dart'; import '../runner/flutter_command.dart';
import 'flutter_command.dart';
final Logger _logging = new Logger('sky_tools.analyze');
class AnalyzeCommand extends FlutterCommand { class AnalyzeCommand extends FlutterCommand {
String get name => 'analyze'; String get name => 'analyze';
...@@ -174,7 +172,7 @@ class AnalyzeCommand extends FlutterCommand { ...@@ -174,7 +172,7 @@ class AnalyzeCommand extends FlutterCommand {
for (String package in dependencies.keys) { for (String package in dependencies.keys) {
if (packages.containsKey(package)) { if (packages.containsKey(package)) {
if (packages[package] != dependencies[package]) { if (packages[package] != dependencies[package]) {
_logging.warning('Inconsistent requirements for $package; using ${packages[package]} (and not ${dependencies[package]}).'); logging.warning('Inconsistent requirements for $package; using ${packages[package]} (and not ${dependencies[package]}).');
hadInconsistentRequirements = true; hadInconsistentRequirements = true;
} }
} else { } else {
...@@ -185,9 +183,9 @@ class AnalyzeCommand extends FlutterCommand { ...@@ -185,9 +183,9 @@ class AnalyzeCommand extends FlutterCommand {
} }
if (hadInconsistentRequirements) { if (hadInconsistentRequirements) {
if (argResults['flutter-repo']) if (argResults['flutter-repo'])
_logging.warning('You may need to run "dart ${path.normalize(path.relative(path.join(ArtifactStore.flutterRoot, 'dev/update_packages.dart')))} --upgrade".'); logging.warning('You may need to run "dart ${path.normalize(path.relative(path.join(ArtifactStore.flutterRoot, 'dev/update_packages.dart')))} --upgrade".');
if (foundAnyInCurrentDirectory) if (foundAnyInCurrentDirectory)
_logging.warning('You may need to run "pub upgrade".'); logging.warning('You may need to run "pub upgrade".');
} }
String buildDir = buildConfigurations.firstWhere((BuildConfiguration config) => config.testable, orElse: () => null)?.buildDir; String buildDir = buildConfigurations.firstWhere((BuildConfiguration config) => config.testable, orElse: () => null)?.buildDir;
...@@ -222,7 +220,7 @@ class AnalyzeCommand extends FlutterCommand { ...@@ -222,7 +220,7 @@ class AnalyzeCommand extends FlutterCommand {
mainFile.path mainFile.path
]; ];
_logging.info(cmd.join(' ')); logging.info(cmd.join(' '));
Process process = await Process.start( Process process = await Process.start(
cmd[0], cmd[0],
cmd.sublist(1), cmd.sublist(1),
......
...@@ -5,15 +5,15 @@ ...@@ -5,15 +5,15 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import '../artifacts.dart'; import '../artifacts.dart';
import '../base/file_system.dart';
import '../base/logging.dart';
import '../build_configuration.dart'; import '../build_configuration.dart';
import '../device.dart'; import '../device.dart';
import '../file_system.dart'; import '../runner/flutter_command.dart';
import 'build.dart'; import 'build.dart';
import 'flutter_command.dart';
import 'start.dart'; import 'start.dart';
const String _kDefaultAndroidManifestPath = 'apk/AndroidManifest.xml'; const String _kDefaultAndroidManifestPath = 'apk/AndroidManifest.xml';
...@@ -24,8 +24,6 @@ const String _kKeystorePassword = "chromium"; ...@@ -24,8 +24,6 @@ const String _kKeystorePassword = "chromium";
const String _kAndroidPlatformVersion = '22'; const String _kAndroidPlatformVersion = '22';
const String _kBuildToolsVersion = '22.0.1'; const String _kBuildToolsVersion = '22.0.1';
final Logger _logging = new Logger('flutter_tools.apk');
/// Copies files into a new directory structure. /// Copies files into a new directory structure.
class _AssetBuilder { class _AssetBuilder {
final Directory outDir; final Directory outDir;
...@@ -172,19 +170,19 @@ class ApkCommand extends FlutterCommand { ...@@ -172,19 +170,19 @@ class ApkCommand extends FlutterCommand {
components.keystore = new File(artifactPaths[3]); components.keystore = new File(artifactPaths[3]);
if (!components.androidSdk.existsSync()) { if (!components.androidSdk.existsSync()) {
_logging.severe('Can not locate Android SDK: $androidSdkPath'); logging.severe('Can not locate Android SDK: $androidSdkPath');
return null; return null;
} }
if (!(new _ApkBuilder(components.androidSdk.path).checkSdkPath())) { if (!(new _ApkBuilder(components.androidSdk.path).checkSdkPath())) {
_logging.severe('Can not locate expected Android SDK tools at $androidSdkPath'); logging.severe('Can not locate expected Android SDK tools at $androidSdkPath');
_logging.severe('You must install version $_kAndroidPlatformVersion of the SDK platform'); logging.severe('You must install version $_kAndroidPlatformVersion of the SDK platform');
_logging.severe('and version $_kBuildToolsVersion of the build tools.'); logging.severe('and version $_kBuildToolsVersion of the build tools.');
return null; return null;
} }
for (File f in [components.manifest, components.icuData, components.classesDex, for (File f in [components.manifest, components.icuData, components.classesDex,
components.libSkyShell, components.keystore]) { components.libSkyShell, components.keystore]) {
if (!f.existsSync()) { if (!f.existsSync()) {
_logging.severe('Can not locate file: ${f.path}'); logging.severe('Can not locate file: ${f.path}');
return null; return null;
} }
} }
...@@ -227,7 +225,7 @@ class ApkCommand extends FlutterCommand { ...@@ -227,7 +225,7 @@ class ApkCommand extends FlutterCommand {
_ApkComponents components = await _findApkComponents(config); _ApkComponents components = await _findApkComponents(config);
if (components == null) { if (components == null) {
_logging.severe('Unable to build APK.'); logging.severe('Unable to build APK.');
return 1; return 1;
} }
...@@ -235,8 +233,8 @@ class ApkCommand extends FlutterCommand { ...@@ -235,8 +233,8 @@ class ApkCommand extends FlutterCommand {
if (!flxPath.isEmpty) { if (!flxPath.isEmpty) {
if (!FileSystemEntity.isFileSync(flxPath)) { if (!FileSystemEntity.isFileSync(flxPath)) {
_logging.severe('FLX does not exist: $flxPath'); logging.severe('FLX does not exist: $flxPath');
_logging.severe('(Omit the --flx option to build the FLX automatically)'); logging.severe('(Omit the --flx option to build the FLX automatically)');
return 1; return 1;
} }
return _buildApk(components, flxPath); return _buildApk(components, flxPath);
......
...@@ -9,21 +9,19 @@ import 'dart:typed_data'; ...@@ -9,21 +9,19 @@ import 'dart:typed_data';
import 'package:archive/archive.dart'; import 'package:archive/archive.dart';
import 'package:flx/bundle.dart'; import 'package:flx/bundle.dart';
import 'package:flx/signing.dart'; import 'package:flx/signing.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:yaml/yaml.dart'; import 'package:yaml/yaml.dart';
import '../file_system.dart'; import '../base/file_system.dart';
import '../base/logging.dart';
import '../runner/flutter_command.dart';
import '../toolchain.dart'; import '../toolchain.dart';
import 'flutter_command.dart';
const String _kSnapshotKey = 'snapshot_blob.bin'; const String _kSnapshotKey = 'snapshot_blob.bin';
const List<String> _kDensities = const ['drawable-xxhdpi']; const List<String> _kDensities = const ['drawable-xxhdpi'];
const List<String> _kThemes = const ['white', 'black']; const List<String> _kThemes = const ['white', 'black'];
const List<int> _kSizes = const [18, 24, 36, 48]; const List<int> _kSizes = const [18, 24, 36, 48];
final Logger _logging = new Logger('flutter_tools.build');
class _Asset { class _Asset {
final String base; final String base;
final String key; final String key;
...@@ -182,7 +180,7 @@ class BuildCommand extends FlutterCommand { ...@@ -182,7 +180,7 @@ class BuildCommand extends FlutterCommand {
String privateKeyPath: _kDefaultPrivateKeyPath, String privateKeyPath: _kDefaultPrivateKeyPath,
bool precompiledSnapshot: false bool precompiledSnapshot: false
}) async { }) async {
_logging.fine('Building $outputPath'); logging.fine('Building $outputPath');
Map manifestDescriptor = _loadManifest(manifestPath); Map manifestDescriptor = _loadManifest(manifestPath);
......
...@@ -5,12 +5,9 @@ ...@@ -5,12 +5,9 @@
import 'dart:async'; import 'dart:async';
import 'package:args/command_runner.dart'; import 'package:args/command_runner.dart';
import 'package:logging/logging.dart';
import '../artifacts.dart'; import '../artifacts.dart';
final Logger _logging = new Logger('flutter_tools.cache');
class CacheCommand extends Command { class CacheCommand extends Command {
final String name = 'cache'; final String name = 'cache';
final String description = 'Manages Flutter\'s cache of binary artifacts.'; final String description = 'Manages Flutter\'s cache of binary artifacts.';
......
...@@ -6,9 +6,8 @@ import 'dart:async'; ...@@ -6,9 +6,8 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart'; import '../base/logging.dart';
import '../runner/flutter_command.dart';
import 'flutter_command.dart';
import 'start.dart'; import 'start.dart';
import 'stop.dart'; import 'stop.dart';
...@@ -20,8 +19,6 @@ const String domain = 'domain'; ...@@ -20,8 +19,6 @@ const String domain = 'domain';
/// A domain @command annotation. /// A domain @command annotation.
const String command = 'command'; const String command = 'command';
final Logger _logging = new Logger('flutter_tools.daemon');
// TODO: Create a `device` domain in order to list devices and fire events when // TODO: Create a `device` domain in order to list devices and fire events when
// devices are added or removed. // devices are added or removed.
...@@ -96,7 +93,7 @@ class Daemon { ...@@ -96,7 +93,7 @@ class Daemon {
var id = command['id']; var id = command['id'];
if (id == null) { if (id == null) {
_logging.severe('no id for command: $command'); logging.severe('no id for command: $command');
return; return;
} }
...@@ -113,7 +110,7 @@ class Daemon { ...@@ -113,7 +110,7 @@ class Daemon {
_domains[prefix].handleEvent(name, id, command['params']); _domains[prefix].handleEvent(name, id, command['params']);
} catch (error, trace) { } catch (error, trace) {
_send({'id': id, 'error': _toJsonable(error)}); _send({'id': id, 'error': _toJsonable(error)});
_logging.warning('error handling ${command['event']}', error, trace); logging.warning('error handling ${command['event']}', error, trace);
} }
} }
...@@ -151,7 +148,7 @@ abstract class Domain { ...@@ -151,7 +148,7 @@ abstract class Domain {
} }
}).catchError((error, trace) { }).catchError((error, trace) {
_send({'id': id, 'error': _toJsonable(error)}); _send({'id': id, 'error': _toJsonable(error)});
_logging.warning('error handling $name', error, trace); logging.warning('error handling $name', error, trace);
}); });
} }
......
...@@ -6,14 +6,12 @@ import 'dart:async'; ...@@ -6,14 +6,12 @@ import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:args/command_runner.dart'; import 'package:args/command_runner.dart';
import 'package:logging/logging.dart';
import 'package:mustache4dart/mustache4dart.dart' as mustache; import 'package:mustache4dart/mustache4dart.dart' as mustache;
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import '../artifacts.dart'; import '../artifacts.dart';
import '../process.dart'; import '../base/logging.dart';
import '../base/process.dart';
final Logger _logging = new Logger('sky_tools.init');
class InitCommand extends Command { class InitCommand extends Command {
final String name = 'init'; final String name = 'init';
...@@ -82,7 +80,7 @@ class InitCommand extends Command { ...@@ -82,7 +80,7 @@ class InitCommand extends Command {
if (!pubSpecYaml.existsSync()) { if (!pubSpecYaml.existsSync()) {
if (skipIfAbsent) if (skipIfAbsent)
return 0; return 0;
_logging.severe('$directory: no pubspec.yaml found'); logging.severe('$directory: no pubspec.yaml found');
return 1; return 1;
} }
...@@ -101,7 +99,7 @@ class InitCommand extends Command { ...@@ -101,7 +99,7 @@ class InitCommand extends Command {
(dotPackages.existsSync() && dotPackages.lastModifiedSync().isAfter(pubSpecYaml.lastModifiedSync()))) (dotPackages.existsSync() && dotPackages.lastModifiedSync().isAfter(pubSpecYaml.lastModifiedSync())))
return 0; return 0;
_logging.severe('$directory: pubspec.yaml, pubspec.lock, and .packages are in an inconsistent state'); logging.severe('$directory: pubspec.yaml, pubspec.lock, and .packages are in an inconsistent state');
return 1; return 1;
} }
} }
......
...@@ -6,7 +6,7 @@ import 'dart:async'; ...@@ -6,7 +6,7 @@ import 'dart:async';
import '../application_package.dart'; import '../application_package.dart';
import '../device.dart'; import '../device.dart';
import 'flutter_command.dart'; import '../runner/flutter_command.dart';
class InstallCommand extends FlutterCommand { class InstallCommand extends FlutterCommand {
final String name = 'install'; final String name = 'install';
......
...@@ -4,12 +4,8 @@ ...@@ -4,12 +4,8 @@
import 'dart:async'; import 'dart:async';
import 'package:logging/logging.dart';
import '../device.dart'; import '../device.dart';
import 'flutter_command.dart'; import '../runner/flutter_command.dart';
final Logger _logging = new Logger('flutter_tools.list');
class ListCommand extends FlutterCommand { class ListCommand extends FlutterCommand {
final String name = 'list'; final String name = 'list';
......
...@@ -5,15 +5,12 @@ ...@@ -5,15 +5,12 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart';
import '../application_package.dart'; import '../application_package.dart';
import '../base/logging.dart';
import '../base/process.dart';
import '../device.dart'; import '../device.dart';
import '../process.dart'; import '../runner/flutter_command.dart';
import 'build.dart'; import 'build.dart';
import 'flutter_command.dart';
final Logger _logging = new Logger('flutter_tools.listen');
class ListenCommand extends FlutterCommand { class ListenCommand extends FlutterCommand {
final String name = 'listen'; final String name = 'listen';
...@@ -48,7 +45,7 @@ class ListenCommand extends FlutterCommand { ...@@ -48,7 +45,7 @@ class ListenCommand extends FlutterCommand {
} }
while (true) { while (true) {
_logging.info('Updating running Flutter apps...'); logging.info('Updating running Flutter apps...');
BuildCommand builder = new BuildCommand(); BuildCommand builder = new BuildCommand();
builder.inheritFromParent(this); builder.inheritFromParent(this);
...@@ -85,7 +82,7 @@ class ListenCommand extends FlutterCommand { ...@@ -85,7 +82,7 @@ class ListenCommand extends FlutterCommand {
try { try {
runCheckedSync(['which', 'fswatch']); runCheckedSync(['which', 'fswatch']);
} catch (e) { } catch (e) {
_logging.severe('"listen" command is only useful if you have installed ' logging.severe('"listen" command is only useful if you have installed '
'fswatch on Mac. Run "brew install fswatch" to install it with ' 'fswatch on Mac. Run "brew install fswatch" to install it with '
'homebrew.'); 'homebrew.');
return null; return null;
...@@ -95,7 +92,7 @@ class ListenCommand extends FlutterCommand { ...@@ -95,7 +92,7 @@ class ListenCommand extends FlutterCommand {
try { try {
runCheckedSync(['which', 'inotifywait']); runCheckedSync(['which', 'inotifywait']);
} catch (e) { } catch (e) {
_logging.severe('"listen" command is only useful if you have installed ' logging.severe('"listen" command is only useful if you have installed '
'inotifywait on Linux. Run "apt-get install inotify-tools" or ' 'inotifywait on Linux. Run "apt-get install inotify-tools" or '
'equivalent to install it.'); 'equivalent to install it.');
return null; return null;
...@@ -109,7 +106,7 @@ class ListenCommand extends FlutterCommand { ...@@ -109,7 +106,7 @@ class ListenCommand extends FlutterCommand {
'modify,close_write,move,create,delete', 'modify,close_write,move,create,delete',
]..addAll(directories); ]..addAll(directories);
} else { } else {
_logging.severe('"listen" command is only available on Mac and Linux.'); logging.severe('"listen" command is only available on Mac and Linux.');
} }
return null; return null;
} }
...@@ -121,7 +118,7 @@ class ListenCommand extends FlutterCommand { ...@@ -121,7 +118,7 @@ class ListenCommand extends FlutterCommand {
try { try {
runCheckedSync(watchCommand); runCheckedSync(watchCommand);
} catch (e) { } catch (e) {
_logging.warning('Watching directories failed.', e); logging.warning('Watching directories failed.', e);
return false; return false;
} }
......
...@@ -4,12 +4,8 @@ ...@@ -4,12 +4,8 @@
import 'dart:async'; import 'dart:async';
import 'package:logging/logging.dart';
import '../device.dart'; import '../device.dart';
import 'flutter_command.dart'; import '../runner/flutter_command.dart';
final Logger _logging = new Logger('flutter_tools.logs');
class LogsCommand extends FlutterCommand { class LogsCommand extends FlutterCommand {
final String name = 'logs'; final String name = 'logs';
......
...@@ -9,16 +9,15 @@ import 'package:logging/logging.dart'; ...@@ -9,16 +9,15 @@ import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import '../artifacts.dart'; import '../artifacts.dart';
import '../base/logging.dart';
import '../base/process.dart';
import '../build_configuration.dart'; import '../build_configuration.dart';
import '../process.dart'; import '../runner/flutter_command.dart';
import 'build.dart'; import 'build.dart';
import 'flutter_command.dart';
import 'start.dart'; import 'start.dart';
const String _kDefaultBundlePath = 'build/app.flx'; const String _kDefaultBundlePath = 'build/app.flx';
final Logger _logging = new Logger('flutter_tools.run_mojo');
class RunMojoCommand extends FlutterCommand { class RunMojoCommand extends FlutterCommand {
final String name = 'run_mojo'; final String name = 'run_mojo';
final String description = 'Run a Flutter app in mojo.'; final String description = 'Run a Flutter app in mojo.';
...@@ -121,9 +120,9 @@ class RunMojoCommand extends FlutterCommand { ...@@ -121,9 +120,9 @@ class RunMojoCommand extends FlutterCommand {
if (useDevtools) { if (useDevtools) {
final String buildFlag = argResults['mojo-debug'] ? '--debug' : '--release'; final String buildFlag = argResults['mojo-debug'] ? '--debug' : '--release';
args.add(buildFlag); args.add(buildFlag);
if (_logging.level <= Level.INFO) { if (logging.level <= Level.INFO) {
args.add('--verbose'); args.add('--verbose');
if (_logging.level <= Level.FINE) { if (logging.level <= Level.FINE) {
args.add('--verbose'); args.add('--verbose');
} }
} }
...@@ -141,12 +140,12 @@ class RunMojoCommand extends FlutterCommand { ...@@ -141,12 +140,12 @@ class RunMojoCommand extends FlutterCommand {
@override @override
Future<int> runInProject() async { Future<int> runInProject() async {
if ((argResults['mojo-path'] == null && argResults['devtools-path'] == null) || (argResults['mojo-path'] != null && argResults['devtools-path'] != null)) { if ((argResults['mojo-path'] == null && argResults['devtools-path'] == null) || (argResults['mojo-path'] != null && argResults['devtools-path'] != null)) {
_logging.severe('Must specify either --mojo-path or --devtools-path.'); logging.severe('Must specify either --mojo-path or --devtools-path.');
return 1; return 1;
} }
if (argResults['mojo-debug'] && argResults['mojo-release']) { if (argResults['mojo-debug'] && argResults['mojo-release']) {
_logging.severe('Cannot specify both --mojo-debug and --mojo-release'); logging.severe('Cannot specify both --mojo-debug and --mojo-release');
return 1; return 1;
} }
......
...@@ -5,18 +5,16 @@ ...@@ -5,18 +5,16 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import '../application_package.dart'; import '../application_package.dart';
import '../base/logging.dart';
import '../device.dart'; import '../device.dart';
import '../runner/flutter_command.dart';
import 'build.dart'; import 'build.dart';
import 'flutter_command.dart';
import 'install.dart'; import 'install.dart';
import 'stop.dart'; import 'stop.dart';
final Logger _logging = new Logger('flutter_tools.start');
class StartCommand extends FlutterCommand { class StartCommand extends FlutterCommand {
final String name = 'start'; final String name = 'start';
final String description = 'Start your Flutter app on attached devices.'; final String description = 'Start your Flutter app on attached devices.';
...@@ -51,7 +49,7 @@ class StartCommand extends FlutterCommand { ...@@ -51,7 +49,7 @@ class StartCommand extends FlutterCommand {
@override @override
Future<int> runInProject() async { Future<int> runInProject() async {
_logging.fine('downloading toolchain'); logging.fine('downloading toolchain');
await Future.wait([ await Future.wait([
downloadToolchain(), downloadToolchain(),
...@@ -60,13 +58,13 @@ class StartCommand extends FlutterCommand { ...@@ -60,13 +58,13 @@ class StartCommand extends FlutterCommand {
bool poke = argResults['poke']; bool poke = argResults['poke'];
if (!poke) { if (!poke) {
_logging.fine('running stop command'); logging.fine('running stop command');
StopCommand stopper = new StopCommand(); StopCommand stopper = new StopCommand();
stopper.inheritFromParent(this); stopper.inheritFromParent(this);
stopper.stop(); stopper.stop();
_logging.fine('running install command'); logging.fine('running install command');
// Only install if the user did not specify a poke // Only install if the user did not specify a poke
InstallCommand installer = new InstallCommand(); InstallCommand installer = new InstallCommand();
...@@ -91,14 +89,14 @@ class StartCommand extends FlutterCommand { ...@@ -91,14 +89,14 @@ class StartCommand extends FlutterCommand {
continue; continue;
} }
_logging.fine('running build command for $device'); logging.fine('running build command for $device');
BuildCommand builder = new BuildCommand(); BuildCommand builder = new BuildCommand();
builder.inheritFromParent(this); builder.inheritFromParent(this);
await builder.buildInTempDir( await builder.buildInTempDir(
mainPath: mainPath, mainPath: mainPath,
onBundleAvailable: (String localBundlePath) { onBundleAvailable: (String localBundlePath) {
_logging.fine('running start bundle for $device'); logging.fine('running start bundle for $device');
if (device.startBundle(package, localBundlePath, if (device.startBundle(package, localBundlePath,
poke: poke, poke: poke,
...@@ -108,7 +106,7 @@ class StartCommand extends FlutterCommand { ...@@ -108,7 +106,7 @@ class StartCommand extends FlutterCommand {
} }
); );
} else { } else {
_logging.fine('running start command for $device'); logging.fine('running start command for $device');
if (await device.startApp(package)) if (await device.startApp(package))
startedSomething = true; startedSomething = true;
...@@ -117,13 +115,13 @@ class StartCommand extends FlutterCommand { ...@@ -117,13 +115,13 @@ class StartCommand extends FlutterCommand {
if (!startedSomething) { if (!startedSomething) {
if (!devices.all.any((device) => device.isConnected())) { if (!devices.all.any((device) => device.isConnected())) {
_logging.severe('Unable to run application - no connected devices.'); logging.severe('Unable to run application - no connected devices.');
} else { } else {
_logging.severe('Unable to run application.'); logging.severe('Unable to run application.');
} }
} }
_logging.fine('finished start command'); logging.fine('finished start command');
return startedSomething ? 0 : 2; return startedSomething ? 0 : 2;
} }
......
...@@ -4,13 +4,9 @@ ...@@ -4,13 +4,9 @@
import 'dart:async'; import 'dart:async';
import 'package:logging/logging.dart';
import '../application_package.dart'; import '../application_package.dart';
import '../device.dart'; import '../device.dart';
import 'flutter_command.dart'; import '../runner/flutter_command.dart';
final Logger _logging = new Logger('flutter_tools.stop');
class StopCommand extends FlutterCommand { class StopCommand extends FlutterCommand {
final String name = 'stop'; final String name = 'stop';
......
...@@ -5,16 +5,14 @@ ...@@ -5,16 +5,14 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:test/src/executable.dart' as executable; import 'package:test/src/executable.dart' as executable;
import '../artifacts.dart'; import '../artifacts.dart';
import '../base/logging.dart';
import '../build_configuration.dart'; import '../build_configuration.dart';
import '../runner/flutter_command.dart';
import '../test/loader.dart' as loader; import '../test/loader.dart' as loader;
import 'flutter_command.dart';
final Logger _logging = new Logger('flutter_tools.test');
class TestCommand extends FlutterCommand { class TestCommand extends FlutterCommand {
String get name => 'test'; String get name => 'test';
...@@ -88,7 +86,7 @@ class TestCommand extends FlutterCommand { ...@@ -88,7 +86,7 @@ class TestCommand extends FlutterCommand {
foundOne = true; foundOne = true;
loader.shellPath = path.join(Directory.current.path, getShellPath(config.targetPlatform, config.buildDir)); loader.shellPath = path.join(Directory.current.path, getShellPath(config.targetPlatform, config.buildDir));
if (!FileSystemEntity.isFileSync(loader.shellPath)) { if (!FileSystemEntity.isFileSync(loader.shellPath)) {
_logging.severe('Cannot find Flutter shell at ${loader.shellPath}'); logging.severe('Cannot find Flutter shell at ${loader.shellPath}');
return 1; return 1;
} }
await _runTests(testArgs, testDir); await _runTests(testArgs, testDir);
......
...@@ -4,13 +4,10 @@ ...@@ -4,13 +4,10 @@
import 'dart:async'; import 'dart:async';
import 'package:logging/logging.dart';
import '../application_package.dart'; import '../application_package.dart';
import '../base/logging.dart';
import '../device.dart'; import '../device.dart';
import 'flutter_command.dart'; import '../runner/flutter_command.dart';
final Logger _logging = new Logger('flutter_tools.trace');
class TraceCommand extends FlutterCommand { class TraceCommand extends FlutterCommand {
final String name = 'trace'; final String name = 'trace';
...@@ -32,7 +29,7 @@ class TraceCommand extends FlutterCommand { ...@@ -32,7 +29,7 @@ class TraceCommand extends FlutterCommand {
await downloadApplicationPackagesAndConnectToDevices(); await downloadApplicationPackagesAndConnectToDevices();
if (!devices.android.isConnected()) { if (!devices.android.isConnected()) {
_logging.warning('No device connected, so no trace was completed.'); logging.warning('No device connected, so no trace was completed.');
return 1; return 1;
} }
...@@ -57,7 +54,7 @@ class TraceCommand extends FlutterCommand { ...@@ -57,7 +54,7 @@ class TraceCommand extends FlutterCommand {
void _stopTracing(AndroidDevice android, AndroidApk androidApp) { void _stopTracing(AndroidDevice android, AndroidApk androidApp) {
String tracePath = android.stopTracing(androidApp); String tracePath = android.stopTracing(androidApp);
if (tracePath == null) { if (tracePath == null) {
_logging.warning('No trace file saved.'); logging.warning('No trace file saved.');
} else { } else {
print('Trace file saved to $tracePath'); print('Trace file saved to $tracePath');
} }
......
...@@ -4,13 +4,9 @@ ...@@ -4,13 +4,9 @@
import 'dart:async'; import 'dart:async';
import 'package:logging/logging.dart';
import '../artifacts.dart'; import '../artifacts.dart';
import '../process.dart'; import '../base/process.dart';
import 'flutter_command.dart'; import '../runner/flutter_command.dart';
final Logger _logging = new Logger('flutter_tools.upgrade');
class UpgradeCommand extends FlutterCommand { class UpgradeCommand extends FlutterCommand {
final String name = 'upgrade'; final String name = 'upgrade';
......
...@@ -6,14 +6,12 @@ import 'dart:async'; ...@@ -6,14 +6,12 @@ import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'application_package.dart'; import 'application_package.dart';
import 'base/logging.dart';
import 'base/process.dart';
import 'build_configuration.dart'; import 'build_configuration.dart';
import 'process.dart';
final Logger _logging = new Logger('flutter_tools.device');
abstract class Device { abstract class Device {
final String id; final String id;
...@@ -140,11 +138,11 @@ class IOSDevice extends Device { ...@@ -140,11 +138,11 @@ class IOSDevice extends Device {
command = runCheckedSync(['which', command]).trim(); command = runCheckedSync(['which', command]).trim();
} catch (e) { } catch (e) {
if (Platform.isMacOS) { if (Platform.isMacOS) {
_logging.severe(macInstructions); logging.severe(macInstructions);
} else if (Platform.isLinux) { } else if (Platform.isLinux) {
_logging.severe(linuxInstructions); logging.severe(linuxInstructions);
} else { } else {
_logging.severe('$command is not available on your platform.'); logging.severe('$command is not available on your platform.');
} }
} }
return command; return command;
...@@ -204,7 +202,7 @@ class IOSDevice extends Device { ...@@ -204,7 +202,7 @@ class IOSDevice extends Device {
(_) { (_) {
return true; return true;
}, onError: (e) { }, onError: (e) {
_logging.info('Failure running $debuggerPath: ', e); logging.info('Failure running $debuggerPath: ', e);
return false; return false;
} }
); );
...@@ -297,11 +295,11 @@ class IOSSimulator extends Device { ...@@ -297,11 +295,11 @@ class IOSSimulator extends Device {
// More than one simulator is listed as booted, which is not allowed but // More than one simulator is listed as booted, which is not allowed but
// sometimes happens erroneously. Kill them all because we don't know // sometimes happens erroneously. Kill them all because we don't know
// which one is actually running. // which one is actually running.
_logging.warning('Multiple running simulators were detected, ' logging.warning('Multiple running simulators were detected, '
'which is not supposed to happen.'); 'which is not supposed to happen.');
for (Match m in matches) { for (Match m in matches) {
if (m.groupCount > 0) { if (m.groupCount > 0) {
_logging.warning('Killing simulator ${m.group(1)}'); logging.warning('Killing simulator ${m.group(1)}');
runSync([xcrunPath, 'simctl', 'shutdown', m.group(1)]); runSync([xcrunPath, 'simctl', 'shutdown', m.group(1)]);
} }
} }
...@@ -312,7 +310,7 @@ class IOSSimulator extends Device { ...@@ -312,7 +310,7 @@ class IOSSimulator extends Device {
if (match != null && match.groupCount > 0) { if (match != null && match.groupCount > 0) {
return match.group(1); return match.group(1);
} else { } else {
_logging.info('No running simulators found'); logging.info('No running simulators found');
return null; return null;
} }
} }
...@@ -357,11 +355,11 @@ class IOSSimulator extends Device { ...@@ -357,11 +355,11 @@ class IOSSimulator extends Device {
runDetached([iOSSimPath]); runDetached([iOSSimPath]);
Future<bool> checkConnection([int attempts = 20]) async { Future<bool> checkConnection([int attempts = 20]) async {
if (attempts == 0) { if (attempts == 0) {
_logging.info('Timed out waiting for iOS Simulator $id to boot.'); logging.info('Timed out waiting for iOS Simulator $id to boot.');
return false; return false;
} }
if (!isConnected()) { if (!isConnected()) {
_logging.info('Waiting for iOS Simulator $id to boot...'); logging.info('Waiting for iOS Simulator $id to boot...');
return await new Future.delayed(new Duration(milliseconds: 500), return await new Future.delayed(new Duration(milliseconds: 500),
() => checkConnection(attempts - 1)); () => checkConnection(attempts - 1));
} }
...@@ -372,7 +370,7 @@ class IOSSimulator extends Device { ...@@ -372,7 +370,7 @@ class IOSSimulator extends Device {
try { try {
runCheckedSync([xcrunPath, 'simctl', 'boot', id]); runCheckedSync([xcrunPath, 'simctl', 'boot', id]);
} catch (e) { } catch (e) {
_logging.warning('Unable to boot iOS Simulator $id: ', e); logging.warning('Unable to boot iOS Simulator $id: ', e);
return false; return false;
} }
} }
...@@ -511,7 +509,7 @@ class AndroidDevice extends Device { ...@@ -511,7 +509,7 @@ class AndroidDevice extends Device {
try { try {
runCheckedSync([adbPath, 'version']); runCheckedSync([adbPath, 'version']);
} catch (e) { } catch (e) {
_logging.severe('Unable to find adb. Is "adb" in your path?'); logging.severe('Unable to find adb. Is "adb" in your path?');
return devices; return devices;
} }
...@@ -554,12 +552,12 @@ class AndroidDevice extends Device { ...@@ -554,12 +552,12 @@ class AndroidDevice extends Device {
} else if (unauthorizedRegex.hasMatch(line)) { } else if (unauthorizedRegex.hasMatch(line)) {
Match match = unauthorizedRegex.firstMatch(line); Match match = unauthorizedRegex.firstMatch(line);
String deviceID = match[1]; String deviceID = match[1];
_logging.warning( logging.warning(
'Device $deviceID is not authorized.\n' 'Device $deviceID is not authorized.\n'
'You might need to check your device for an authorization dialog.' 'You might need to check your device for an authorization dialog.'
); );
} else { } else {
_logging.warning( logging.warning(
'Unexpected failure parsing device information from adb output:\n' 'Unexpected failure parsing device information from adb output:\n'
'$line\n' '$line\n'
'Please report a bug at https://github.com/flutter/flutter/issues/new'); 'Please report a bug at https://github.com/flutter/flutter/issues/new');
...@@ -578,7 +576,7 @@ class AndroidDevice extends Device { ...@@ -578,7 +576,7 @@ class AndroidDevice extends Device {
_hasValidAndroid = _checkForSupportedAndroidVersion(); _hasValidAndroid = _checkForSupportedAndroidVersion();
if (!_hasAdb || !_hasValidAndroid) { if (!_hasAdb || !_hasValidAndroid) {
_logging.warning('Unable to run on Android.'); logging.warning('Unable to run on Android.');
} }
} }
...@@ -592,11 +590,11 @@ class AndroidDevice extends Device { ...@@ -592,11 +590,11 @@ class AndroidDevice extends Device {
path.join(androidHomeDir, 'sdk', 'platform-tools'))) { path.join(androidHomeDir, 'sdk', 'platform-tools'))) {
return path.join(androidHomeDir, 'sdk'); return path.join(androidHomeDir, 'sdk');
} else { } else {
_logging.warning('Android SDK not found at $androidHomeDir'); logging.warning('Android SDK not found at $androidHomeDir');
return null; return null;
} }
} else { } else {
_logging.warning('Android SDK not found. The ANDROID_HOME variable must be set.'); logging.warning('Android SDK not found. The ANDROID_HOME variable must be set.');
return null; return null;
} }
} }
...@@ -612,7 +610,7 @@ class AndroidDevice extends Device { ...@@ -612,7 +610,7 @@ class AndroidDevice extends Device {
} else if (FileSystemEntity.isFileSync(adbPath2)) { } else if (FileSystemEntity.isFileSync(adbPath2)) {
return adbPath2; return adbPath2;
} else { } else {
_logging.info('"adb" not found at\n "$adbPath1" or\n "$adbPath2"\n' + logging.info('"adb" not found at\n "$adbPath1" or\n "$adbPath2"\n' +
'using default path "$_ADB_PATH"'); 'using default path "$_ADB_PATH"');
return _ADB_PATH; return _ADB_PATH;
} }
...@@ -649,7 +647,7 @@ class AndroidDevice extends Device { ...@@ -649,7 +647,7 @@ class AndroidDevice extends Device {
} }
return false; return false;
} }
_logging.warning( logging.warning(
'Unrecognized adb version string $adbVersion. Skipping version check.'); 'Unrecognized adb version string $adbVersion. Skipping version check.');
return true; return true;
} }
...@@ -662,16 +660,16 @@ class AndroidDevice extends Device { ...@@ -662,16 +660,16 @@ class AndroidDevice extends Device {
} }
String locatedAdbPath = runCheckedSync(['which', 'adb']); String locatedAdbPath = runCheckedSync(['which', 'adb']);
_logging.severe('"$locatedAdbPath" is too old. ' logging.severe('"$locatedAdbPath" is too old. '
'Please install version 1.0.32 or later.\n' 'Please install version 1.0.32 or later.\n'
'Try setting ANDROID_HOME to the path to your Android SDK install. ' 'Try setting ANDROID_HOME to the path to your Android SDK install. '
'Android builds are unavailable.'); 'Android builds are unavailable.');
} catch (e, stack) { } catch (e, stack) {
_logging.severe('"adb" not found in \$PATH. ' logging.severe('"adb" not found in \$PATH. '
'Please install the Android SDK or set ANDROID_HOME ' 'Please install the Android SDK or set ANDROID_HOME '
'to the path of your Android SDK install.'); 'to the path of your Android SDK install.');
_logging.info(e); logging.info(e);
_logging.info(stack); logging.info(stack);
} }
return false; return false;
} }
...@@ -686,7 +684,7 @@ class AndroidDevice extends Device { ...@@ -686,7 +684,7 @@ class AndroidDevice extends Device {
String ready = runSync(adbCommandForDevice(['shell', 'echo', 'ready'])); String ready = runSync(adbCommandForDevice(['shell', 'echo', 'ready']));
if (ready.trim() != 'ready') { if (ready.trim() != 'ready') {
_logging.info('Android device not found.'); logging.info('Android device not found.');
return false; return false;
} }
...@@ -698,17 +696,17 @@ class AndroidDevice extends Device { ...@@ -698,17 +696,17 @@ class AndroidDevice extends Device {
int sdkVersionParsed = int sdkVersionParsed =
int.parse(sdkVersion, onError: (String source) => null); int.parse(sdkVersion, onError: (String source) => null);
if (sdkVersionParsed == null) { if (sdkVersionParsed == null) {
_logging.severe('Unexpected response from getprop: "$sdkVersion"'); logging.severe('Unexpected response from getprop: "$sdkVersion"');
return false; return false;
} }
if (sdkVersionParsed < 16) { if (sdkVersionParsed < 16) {
_logging.severe('The Android version ($sdkVersion) on the target device ' logging.severe('The Android version ($sdkVersion) on the target device '
'is too old. Please use a Jelly Bean (version 16 / 4.1.x) device or later.'); 'is too old. Please use a Jelly Bean (version 16 / 4.1.x) device or later.');
return false; return false;
} }
return true; return true;
} catch (e) { } catch (e) {
_logging.severe('Unexpected failure from adb: ', e); logging.severe('Unexpected failure from adb: ', e);
} }
return false; return false;
} }
...@@ -735,12 +733,12 @@ class AndroidDevice extends Device { ...@@ -735,12 +733,12 @@ class AndroidDevice extends Device {
} }
if (runCheckedSync(adbCommandForDevice(['shell', 'pm', 'path', app.id])) == if (runCheckedSync(adbCommandForDevice(['shell', 'pm', 'path', app.id])) ==
'') { '') {
_logging.info( logging.info(
'TODO(iansf): move this log to the caller. ${app.name} is not on the device. Installing now...'); 'TODO(iansf): move this log to the caller. ${app.name} is not on the device. Installing now...');
return false; return false;
} }
if (_getDeviceApkSha1(app) != _getSourceSha1(app)) { if (_getDeviceApkSha1(app) != _getSourceSha1(app)) {
_logging.info( logging.info(
'TODO(iansf): move this log to the caller. ${app.name} is out of date. Installing now...'); 'TODO(iansf): move this log to the caller. ${app.name} is out of date. Installing now...');
return false; return false;
} }
...@@ -750,11 +748,11 @@ class AndroidDevice extends Device { ...@@ -750,11 +748,11 @@ class AndroidDevice extends Device {
@override @override
bool installApp(ApplicationPackage app) { bool installApp(ApplicationPackage app) {
if (!isConnected()) { if (!isConnected()) {
_logging.info('Android device not connected. Not installing.'); logging.info('Android device not connected. Not installing.');
return false; return false;
} }
if (!FileSystemEntity.isFileSync(app.localPath)) { if (!FileSystemEntity.isFileSync(app.localPath)) {
_logging.severe('"${app.localPath}" does not exist.'); logging.severe('"${app.localPath}" does not exist.');
return false; return false;
} }
...@@ -775,10 +773,10 @@ class AndroidDevice extends Device { ...@@ -775,10 +773,10 @@ class AndroidDevice extends Device {
bool checked, bool checked,
String route String route
}) { }) {
_logging.fine('$this startBundle'); logging.fine('$this startBundle');
if (!FileSystemEntity.isFileSync(bundlePath)) { if (!FileSystemEntity.isFileSync(bundlePath)) {
_logging.severe('Cannot find $bundlePath'); logging.severe('Cannot find $bundlePath');
return false; return false;
} }
...@@ -882,7 +880,7 @@ class AndroidDevice extends Device { ...@@ -882,7 +880,7 @@ class AndroidDevice extends Device {
runSync(adbCommandForDevice(['shell', 'rm', tracePath])); runSync(adbCommandForDevice(['shell', 'rm', tracePath]));
return path.basename(tracePath); return path.basename(tracePath);
} }
_logging.warning('No trace file detected. ' logging.warning('No trace file detected. '
'Did you remember to start the trace before stopping it?'); 'Did you remember to start the trace before stopping it?');
return null; return null;
} }
......
...@@ -11,10 +11,10 @@ import 'package:logging/logging.dart'; ...@@ -11,10 +11,10 @@ import 'package:logging/logging.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import '../artifacts.dart'; import '../artifacts.dart';
import '../base/logging.dart';
import '../base/process.dart';
import '../build_configuration.dart'; import '../build_configuration.dart';
import '../process.dart'; import 'version.dart';
final Logger _logging = new Logger('flutter_tools.flutter_command_runner');
const String kFlutterRootEnvironmentVariableName = 'FLUTTER_ROOT'; // should point to //flutter/ (root of flutter/flutter repo) const String kFlutterRootEnvironmentVariableName = 'FLUTTER_ROOT'; // should point to //flutter/ (root of flutter/flutter repo)
const String kFlutterEngineEnvironmentVariableName = 'FLUTTER_ENGINE'; // should point to //engine/src/ (root of flutter/engine repo) const String kFlutterEngineEnvironmentVariableName = 'FLUTTER_ENGINE'; // should point to //engine/src/ (root of flutter/engine repo)
...@@ -45,7 +45,7 @@ class FlutterCommandRunner extends CommandRunner { ...@@ -45,7 +45,7 @@ class FlutterCommandRunner extends CommandRunner {
help: 'Path to your packages directory.$packagesHelp'); help: 'Path to your packages directory.$packagesHelp');
argParser.addOption('flutter-root', argParser.addOption('flutter-root',
help: 'The root directory of the Flutter repository. Defaults to \$$kFlutterRootEnvironmentVariableName if set,\n' help: 'The root directory of the Flutter repository. Defaults to \$$kFlutterRootEnvironmentVariableName if set,\n'
'otherwise defaults to a value derived from the location of this tool.', defaultsTo: defaultFlutterRoot); 'otherwise defaults to a value derived from the location of this tool.', defaultsTo: _defaultFlutterRoot);
argParser.addOption('android-device-id', argParser.addOption('android-device-id',
help: 'Serial number of the target Android device.'); help: 'Serial number of the target Android device.');
...@@ -128,10 +128,10 @@ class FlutterCommandRunner extends CommandRunner { ...@@ -128,10 +128,10 @@ class FlutterCommandRunner extends CommandRunner {
ArgResults _globalResults; ArgResults _globalResults;
String get defaultFlutterRoot { String get _defaultFlutterRoot {
String script = Platform.script.toFilePath();
if (Platform.environment.containsKey(kFlutterRootEnvironmentVariableName)) if (Platform.environment.containsKey(kFlutterRootEnvironmentVariableName))
return Platform.environment[kFlutterRootEnvironmentVariableName]; return Platform.environment[kFlutterRootEnvironmentVariableName];
String script = Platform.script.toFilePath();
if (path.basename(script) == kSnapshotFileName) if (path.basename(script) == kSnapshotFileName)
return path.dirname(path.dirname(path.dirname(script))); return path.dirname(path.dirname(path.dirname(script)));
if (path.basename(script) == kFlutterToolsScriptFileName) if (path.basename(script) == kFlutterToolsScriptFileName)
...@@ -151,31 +151,12 @@ class FlutterCommandRunner extends CommandRunner { ...@@ -151,31 +151,12 @@ class FlutterCommandRunner extends CommandRunner {
if (globalResults.wasParsed('package-root')) if (globalResults.wasParsed('package-root'))
ArtifactStore.packageRoot = globalResults['package-root']; ArtifactStore.packageRoot = globalResults['package-root'];
if (globalResults['version']) if (globalResults['version']) {
return _printVersion(); print(getVersion(ArtifactStore.flutterRoot));
return new Future<int>.value(0);
return super.runCommand(globalResults);
}
Future<int> _printVersion() async {
String upstream = runSync([
'git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{u}'
], workingDirectory: ArtifactStore.flutterRoot).trim();
String repository = '<unknown>';
int slash = upstream.indexOf('/');
if (slash != -1) {
String remote = upstream.substring(0, slash);
repository = runSync([
'git', 'ls-remote', '--get-url', remote
], workingDirectory: ArtifactStore.flutterRoot).trim();
upstream = upstream.substring(slash + 1);
} }
String revision = runSync([
'git', 'log', '-n', '1', '--pretty=format:%H (%ar)'
], workingDirectory: ArtifactStore.flutterRoot).trim();
print('Flutter\nRepository: $repository\nBranch: $upstream\nRevision: $revision'); return super.runCommand(globalResults);
return 0;
} }
String _tryEnginePath(String enginePath) { String _tryEnginePath(String enginePath) {
...@@ -239,7 +220,7 @@ class FlutterCommandRunner extends CommandRunner { ...@@ -239,7 +220,7 @@ class FlutterCommandRunner extends CommandRunner {
)); ));
} else { } else {
if (!FileSystemEntity.isDirectorySync(enginePath)) if (!FileSystemEntity.isDirectorySync(enginePath))
_logging.warning('$enginePath is not a valid directory'); logging.warning('$enginePath is not a valid directory');
if (!isDebug && !isRelease) if (!isDebug && !isRelease)
isDebug = true; isDebug = true;
......
// 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 '../base/process.dart';
String getVersion(String flutterRoot) {
String upstream = runSync([
'git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{u}'
], workingDirectory: flutterRoot).trim();
String repository = '<unknown>';
int slash = upstream.indexOf('/');
if (slash != -1) {
String remote = upstream.substring(0, slash);
repository = runSync([
'git', 'ls-remote', '--get-url', remote
], workingDirectory: flutterRoot).trim();
upstream = upstream.substring(slash + 1);
}
String revision = runSync([
'git', 'log', '-n', '1', '--pretty=format:%H (%ar)'
], workingDirectory: flutterRoot).trim();
return 'Flutter\nRepository: $repository\nBranch: $upstream\nRevision: $revision';
}
...@@ -9,7 +9,7 @@ import 'package:path/path.dart' as path; ...@@ -9,7 +9,7 @@ import 'package:path/path.dart' as path;
import 'artifacts.dart'; import 'artifacts.dart';
import 'build_configuration.dart'; import 'build_configuration.dart';
import 'process.dart'; import 'base/process.dart';
class Compiler { class Compiler {
Compiler(this._path); Compiler(this._path);
......
...@@ -8,7 +8,7 @@ import 'package:args/command_runner.dart'; ...@@ -8,7 +8,7 @@ import 'package:args/command_runner.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/commands/init.dart'; import 'package:flutter_tools/src/commands/init.dart';
import 'package:flutter_tools/src/process.dart'; import 'package:flutter_tools/src/base/process.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
main() => defineTests(); main() => defineTests();
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter_tools/src/os_utils.dart'; import 'package:flutter_tools/src/base/os.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
...@@ -25,7 +25,7 @@ defineTests() { ...@@ -25,7 +25,7 @@ defineTests() {
test('makeExecutable', () { test('makeExecutable', () {
File file = new File(path.join(temp.path, 'foo.script')); File file = new File(path.join(temp.path, 'foo.script'));
file.writeAsStringSync('hello world'); file.writeAsStringSync('hello world');
osUtils.makeExecutable(file); os.makeExecutable(file);
// Skip this test on windows. // Skip this test on windows.
if (!Platform.isWindows) { if (!Platform.isWindows) {
......
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'package:mockito/mockito.dart';
import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/application_package.dart';
import 'package:flutter_tools/src/build_configuration.dart'; import 'package:flutter_tools/src/build_configuration.dart';
import 'package:flutter_tools/src/commands/flutter_command.dart';
import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:flutter_tools/src/toolchain.dart'; import 'package:flutter_tools/src/toolchain.dart';
import 'package:mockito/mockito.dart';
class MockApplicationPackageStore extends ApplicationPackageStore { class MockApplicationPackageStore extends ApplicationPackageStore {
MockApplicationPackageStore() : super( MockApplicationPackageStore() : super(
......
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