From 43ef68809b5cd9f4e24f1f4e5706e025667a7c0f Mon Sep 17 00:00:00 2001 From: rosen-vladimirov Date: Tue, 10 Nov 2015 18:45:23 +0200 Subject: [PATCH 1/2] Fix doctor command for android and adb Fix doctor command, which checks adb and android incorrectly. Pass correct paths for verification. Also make sure "No issues were detected" is printed when there are no issues. --- lib/android-tools-info.ts | 20 +++++++++++++++++++- lib/common | 2 +- lib/config.ts | 17 ++--------------- lib/declarations.ts | 8 +++++++- lib/services/doctor-service.ts | 9 ++++++--- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/android-tools-info.ts b/lib/android-tools-info.ts index 63dabba12b..e47bb177b6 100644 --- a/lib/android-tools-info.ts +++ b/lib/android-tools-info.ts @@ -149,7 +149,7 @@ export class AndroidToolsInfo implements IAndroidToolsInfo { } } - return detectedErrors || isAndroidHomeValid; + return detectedErrors || !isAndroidHomeValid; }).future()(); } @@ -177,6 +177,24 @@ export class AndroidToolsInfo implements IAndroidToolsInfo { }).future()(); } + public getPathToAdbFromAndroidHome(): IFuture { + return (() => { + if(this.androidHome) { + let pathToAdb = path.join(this.androidHome, "platform-tools", "adb") + (this.$hostInfo.isWindows ? ".exe" : ""); + try { + this.$childProcess.execFile(pathToAdb, ["help"]).wait(); + return pathToAdb; + } catch (err) { + // adb does not exist, so ANDROID_HOME is not set correctly + // try getting default adb path (included in CLI package) + this.$logger.trace(`Error while executing '${pathToAdb} help'. Error is: ${err.message}`); + } + } + + return null; + }).future()(); + } + /** * Prints messages on the screen. In case the showWarningsAsErrors flag is set to true, warnings are shown, else - errors. * Uses logger.warn for warnings and errors.failWithoutHelp when erros must be shown. diff --git a/lib/common b/lib/common index 71b511fdcf..74925a6e30 160000 --- a/lib/common +++ b/lib/common @@ -1 +1 @@ -Subproject commit 71b511fdcf193e8f5872c828d38a023e7365d83d +Subproject commit 74925a6e30adb6d3a297ad713749dc69312531cb diff --git a/lib/config.ts b/lib/config.ts index bddf220364..894ac8a841 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -81,21 +81,8 @@ export class StaticConfig extends staticConfigBaseLibPath.StaticConfigBase imple public getAdbFilePath(): IFuture { return (() => { if(!this._adbFilePath) { - let androidHomeEnvVar = process.env.ANDROID_HOME; - if(androidHomeEnvVar) { - let pathToAdb = path.join(androidHomeEnvVar, "platform-tools", "adb"); - let childProcess: IChildProcess = this.$injector.resolve("$childProcess"); - try { - childProcess.execFile(pathToAdb, ["help"]).wait(); - this._adbFilePath = pathToAdb; - } catch (err) { - // adb does not exist, so ANDROID_HOME is not set correctly - // try getting default adb path (included in CLI package) - super.getAdbFilePath().wait(); - } - } else { - super.getAdbFilePath().wait(); - } + let androidToolsInfo: IAndroidToolsInfo = this.$injector.resolve("androidToolsInfo"); + this._adbFilePath = androidToolsInfo.getPathToAdbFromAndroidHome().wait() || super.getAdbFilePath().wait(); } return this._adbFilePath; diff --git a/lib/declarations.ts b/lib/declarations.ts index 6b121b50ab..a7f6ff2cea 100644 --- a/lib/declarations.ts +++ b/lib/declarations.ts @@ -127,9 +127,15 @@ interface IAndroidToolsInfo { /** * Returns the path to `android` executable. It should be `$ANDROID_HOME/tools/android`. * In case ANDROID_HOME is not defined, check if `android` is part of $PATH. - * @return {boolean} Path to the `android` executable. + * @return {string} Path to the `android` executable. */ getPathToAndroidExecutable(): IFuture; + + /** + * Gets the path to `adb` executable from ANDROID_HOME. It should be `$ANDROID_HOME/platform-tools/adb` in case it exists. + * @return {string} Path to the `adb` executable. In case it does not exists, null is returned. + */ + getPathToAdbFromAndroidHome(): IFuture; } /** diff --git a/lib/services/doctor-service.ts b/lib/services/doctor-service.ts index ebb4dac0f9..978c2d2752 100644 --- a/lib/services/doctor-service.ts +++ b/lib/services/doctor-service.ts @@ -13,7 +13,11 @@ class DoctorService implements IDoctorService { public printWarnings(): boolean { let result = false; - let sysInfo = this.$sysInfo.getSysInfo(); + let androidToolsInfo = { + pathToAdb: this.$androidToolsInfo.getPathToAdbFromAndroidHome().wait(), + pathToAndroid: this.$androidToolsInfo.getPathToAndroidExecutable().wait() + }; + let sysInfo = this.$sysInfo.getSysInfo(androidToolsInfo); if (!sysInfo.adbVer) { this.$logger.warn("WARNING: adb from the Android SDK is not installed or is not configured properly."); @@ -59,9 +63,8 @@ class DoctorService implements IDoctorService { result = true; } } else { - this.$logger.warn("WARNING: You can work with iOS only on Mac OS X systems."); + this.$logger.out("NOTE: You can develop for iOS only on Mac OS X systems."); this.$logger.out("To be able to work with iOS devices and projects, you need Mac OS X Mavericks or later." + EOL); - result = true; } if(!sysInfo.javaVer) { From b15065978fad06f774457a8cf98fcdc2385d111a Mon Sep 17 00:00:00 2001 From: rosen-vladimirov Date: Tue, 10 Nov 2015 22:09:53 +0200 Subject: [PATCH 2/2] Add SysInfo implementation Add SysInfo class that extends the base SysInfoBase class by calling `getSysInfo` method with correct paths to android and adb. Remove check for java, as javac check is enough for us. --- lib/android-tools-info.ts | 2 +- lib/bootstrap.ts | 1 + lib/common | 2 +- lib/services/android-project-service.ts | 2 +- lib/services/doctor-service.ts | 16 +--------------- lib/sys-info.ts | 25 +++++++++++++++++++++++++ 6 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 lib/sys-info.ts diff --git a/lib/android-tools-info.ts b/lib/android-tools-info.ts index e47bb177b6..84723e6581 100644 --- a/lib/android-tools-info.ts +++ b/lib/android-tools-info.ts @@ -180,7 +180,7 @@ export class AndroidToolsInfo implements IAndroidToolsInfo { public getPathToAdbFromAndroidHome(): IFuture { return (() => { if(this.androidHome) { - let pathToAdb = path.join(this.androidHome, "platform-tools", "adb") + (this.$hostInfo.isWindows ? ".exe" : ""); + let pathToAdb = path.join(this.androidHome, "platform-tools", "adb"); try { this.$childProcess.execFile(pathToAdb, ["help"]).wait(); return pathToAdb; diff --git a/lib/bootstrap.ts b/lib/bootstrap.ts index a6c091eedd..d55083a12b 100644 --- a/lib/bootstrap.ts +++ b/lib/bootstrap.ts @@ -84,3 +84,4 @@ $injector.require("androidToolsInfo", "./android-tools-info"); $injector.require("iosUsbLiveSyncServiceLocator", "./services/usb-livesync-service"); $injector.require("androidUsbLiveSyncServiceLocator", "./services/usb-livesync-service"); +$injector.require("sysInfo", "./sys-info"); diff --git a/lib/common b/lib/common index 74925a6e30..94bca0416f 160000 --- a/lib/common +++ b/lib/common @@ -1 +1 @@ -Subproject commit 74925a6e30adb6d3a297ad713749dc69312531cb +Subproject commit 94bca0416f782026c6496d3dc7e9deb634575573 diff --git a/lib/services/android-project-service.ts b/lib/services/android-project-service.ts index e589c33944..d98592360e 100644 --- a/lib/services/android-project-service.ts +++ b/lib/services/android-project-service.ts @@ -81,7 +81,7 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject // this call will fail in case `android` is not set correctly. this.$androidToolsInfo.getPathToAndroidExecutable().wait(); - this.$androidToolsInfo.validateJavacVersion(this.$sysInfo.getSysInfo().javacVersion, {showWarningsAsErrors: true}).wait(); + this.$androidToolsInfo.validateJavacVersion(this.$sysInfo.getSysInfo().wait().javacVersion, {showWarningsAsErrors: true}).wait(); }).future()(); } diff --git a/lib/services/doctor-service.ts b/lib/services/doctor-service.ts index 978c2d2752..a79d208efd 100644 --- a/lib/services/doctor-service.ts +++ b/lib/services/doctor-service.ts @@ -13,11 +13,7 @@ class DoctorService implements IDoctorService { public printWarnings(): boolean { let result = false; - let androidToolsInfo = { - pathToAdb: this.$androidToolsInfo.getPathToAdbFromAndroidHome().wait(), - pathToAndroid: this.$androidToolsInfo.getPathToAndroidExecutable().wait() - }; - let sysInfo = this.$sysInfo.getSysInfo(androidToolsInfo); + let sysInfo = this.$sysInfo.getSysInfo().wait(); if (!sysInfo.adbVer) { this.$logger.warn("WARNING: adb from the Android SDK is not installed or is not configured properly."); @@ -67,16 +63,6 @@ class DoctorService implements IDoctorService { this.$logger.out("To be able to work with iOS devices and projects, you need Mac OS X Mavericks or later." + EOL); } - if(!sysInfo.javaVer) { - this.$logger.warn("WARNING: The Java Development Kit (JDK) is not installed or is not configured properly."); - this.$logger.out("You will not be able to work with the Android SDK and you might not be able" + EOL - + "to perform some Android-related operations. To ensure that you can develop and" + EOL - + "test your apps for Android, verify that you have installed the JDK as" + EOL - + "described in http://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html (for JDK 8)" + EOL - + "or http://docs.oracle.com/javase/7/docs/webnotes/install/ (for JDK 7)." + EOL); - result = true; - } - let androidToolsIssues = this.$androidToolsInfo.validateInfo().wait(); let javaVersionIssue = this.$androidToolsInfo.validateJavacVersion(sysInfo.javacVersion).wait(); return result || androidToolsIssues || javaVersionIssue; diff --git a/lib/sys-info.ts b/lib/sys-info.ts new file mode 100644 index 0000000000..0a7f1c47b6 --- /dev/null +++ b/lib/sys-info.ts @@ -0,0 +1,25 @@ +/// +"use strict"; + +import {SysInfoBase} from "./common/sys-info-base"; + +export class SysInfo extends SysInfoBase { + constructor(protected $childProcess: IChildProcess, + protected $hostInfo: IHostInfo, + protected $iTunesValidator: Mobile.IiTunesValidator, + protected $logger: ILogger, + private $androidToolsInfo: IAndroidToolsInfo) { + super($childProcess, $hostInfo, $iTunesValidator, $logger); + } + + public getSysInfo(androidToolsInfo?: {pathToAdb: string, pathToAndroid: string}): IFuture { + return ((): ISysInfoData => { + let defaultAndroidToolsInfo = { + pathToAdb: this.$androidToolsInfo.getPathToAdbFromAndroidHome().wait(), + pathToAndroid: this.$androidToolsInfo.getPathToAndroidExecutable().wait() + }; + return super.getSysInfo(androidToolsInfo || defaultAndroidToolsInfo).wait(); + }).future()(); + } +} +$injector.register("sysInfo", SysInfo);