From 4599e9897dcbcf4b14bfe0fc0f530d4509f90500 Mon Sep 17 00:00:00 2001 From: Benn Mapes Date: Tue, 16 Apr 2013 10:34:14 -0700 Subject: [PATCH] [CB-2914] Cli script migration for windows jscript --- bin/check_reqs.bat | 9 + bin/check_reqs.js | 81 +++ bin/create.bat | 34 +- bin/create.js | 81 ++- bin/templates/cordova/build.bat | 20 +- bin/templates/cordova/clean.bat | 20 +- bin/templates/cordova/cordova.bat | 7 +- bin/templates/cordova/lib/cordova.js | 594 ++++++++++++++++++ bin/templates/cordova/lib/install-device.bat | 9 + .../cordova/lib/install-emulator.bat | 9 + bin/templates/cordova/lib/list-devices.bat | 9 + .../cordova/lib/list-emulator-images.bat | 9 + .../cordova/lib/list-started-emulators.bat | 9 + bin/templates/cordova/lib/start-emulator.bat | 9 + bin/templates/cordova/log.bat | 20 +- bin/templates/cordova/run.bat | 3 +- 16 files changed, 829 insertions(+), 94 deletions(-) create mode 100644 bin/check_reqs.bat create mode 100644 bin/check_reqs.js create mode 100644 bin/templates/cordova/lib/cordova.js create mode 100644 bin/templates/cordova/lib/install-device.bat create mode 100644 bin/templates/cordova/lib/install-emulator.bat create mode 100644 bin/templates/cordova/lib/list-devices.bat create mode 100644 bin/templates/cordova/lib/list-emulator-images.bat create mode 100644 bin/templates/cordova/lib/list-started-emulators.bat create mode 100644 bin/templates/cordova/lib/start-emulator.bat diff --git a/bin/check_reqs.bat b/bin/check_reqs.bat new file mode 100644 index 00000000..65514c85 --- /dev/null +++ b/bin/check_reqs.bat @@ -0,0 +1,9 @@ +@ECHO OFF +SET full_path=%~dp0 +IF EXIST %full_path%check_reqs.js ( + cscript "%full_path%check_reqs.js" //nologo +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'check_reqs.js' in 'bin' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/check_reqs.js b/bin/check_reqs.js new file mode 100644 index 00000000..ef309918 --- /dev/null +++ b/bin/check_reqs.js @@ -0,0 +1,81 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +var ROOT = WScript.ScriptFullName.split('\\bin\\check_reqs.js').join(''), + shell = WScript.CreateObject("WScript.Shell"), + fso = WScript.CreateObject('Scripting.FileSystemObject'); + + +// executes a command in the shell, returns stdout or stderr if error +function exec_out(command) { + var oExec=shell.Exec(command); + var output = new String(); + while (oExec.Status == 0) { + if (!oExec.StdOut.AtEndOfStream) { + var line = oExec.StdOut.ReadAll(); + // XXX: Change to verbose mode + // WScript.StdOut.WriteLine(line); + output += line; + } + WScript.sleep(100); + } + //Check to make sure our scripts did not encounter an error + if (!oExec.StdErr.AtEndOfStream) { + var line = oExec.StdErr.ReadAll(); + return {'error' : true, 'output' : line}; + } else if (!oExec.StdOut.AtEndOfStream) { + var line = oExec.StdOut.ReadAll(); + // XXX: Change to verbose mode + // WScript.StdOut.WriteLine(line); + output += line; + } + return {'error' : false, 'output' : output}; +} + +// log to stdout or stderr +function Log(msg, error) { + if (error) { + WScript.StdErr.WriteLine(msg); + } + else { + WScript.StdOut.WriteLine(msg); + } +} + +// checks that android requirements are met +function check_requirements() { + var result = exec_out('%comspec% /c android list target'); + if(result.error) { + Log('The command `android` failed. Make sure you have the latest Android SDK installed, and the `android` command (inside the tools/ folder) added to your path. Output: ' + result.output, true); + WScript.Quit(2); + } + else if(!result.output.match(/android[-]17/)) { + Log('Please install Android target 17 (the Android 4.2 SDK). Make sure you have the latest Android tools installed as well. Run `android` from your command-line to install/update any missing SDKs or tools.', true); + Log('Output : ' + result.output); + WScript.Quit(2); + } + else { + var cmd = '%comspec% /c android update project -p ' + ROOT + '\\framework -t android-17'; + result = exec_out(cmd); + if(result.error) { + Log('Error updating the Cordova library to work with your Android environment. Command run: "' + cmd + '", output: ' + result.output, true); + WScript.Quit(2); + } + } +} + +check_requirements(); \ No newline at end of file diff --git a/bin/create.bat b/bin/create.bat index cdbd6118..7f0346f2 100644 --- a/bin/create.bat +++ b/bin/create.bat @@ -1,3 +1,5 @@ +@ECHO OFF +GOTO BEGIN :: Licensed to the Apache Software Foundation (ASF) under one :: or more contributor license agreements. See the NOTICE file :: distributed with this work for additional information @@ -15,23 +17,23 @@ :: specific language governing permissions and limitations :: under the License. -@ECHO OFF -IF NOT DEFINED JAVA_HOME GOTO MISSING_JAVA_HOME +:BEGIN + IF NOT DEFINED JAVA_HOME GOTO MISSING_JAVA_HOME -FOR %%X in (java.exe javac.exe ant.bat android.bat) do ( - IF [%%~$PATH:X]==[] ( - ECHO Cannot locate %%X using the PATH environment variable. - ECHO Retry after adding directory containing %%X to the PATH variable. - ECHO Remember to open a new command window after updating the PATH variable. - IF "%%X"=="java.exe" GOTO GET_JAVA - IF "%%X"=="javac.exe" GOTO GET_JAVA - IF "%%X"=="ant.bat" GOTO GET_ANT - IF "%%X"=="android.bat" GOTO GET_ANDROID - GOTO ERROR - ) -) -cscript "%~dp0\create.js" %* -GOTO END + FOR %%X in (java.exe javac.exe ant.bat android.bat) do ( + IF [%%~$PATH:X]==[] ( + ECHO Cannot locate %%X using the PATH environment variable. + ECHO Retry after adding directory containing %%X to the PATH variable. + ECHO Remember to open a new command window after updating the PATH variable. + IF "%%X"=="java.exe" GOTO GET_JAVA + IF "%%X"=="javac.exe" GOTO GET_JAVA + IF "%%X"=="ant.bat" GOTO GET_ANT + IF "%%X"=="android.bat" GOTO GET_ANDROID + GOTO ERROR + ) + ) + cscript "%~dp0\create.js" %* //nologo + GOTO END :MISSING_JAVA_HOME ECHO The JAVA_HOME environment variable is not set. ECHO Set JAVA_HOME to an existing JRE directory. diff --git a/bin/create.js b/bin/create.js index d0d99997..5176b7d4 100644 --- a/bin/create.js +++ b/bin/create.js @@ -24,7 +24,30 @@ * ./create [path package activity] */ -var fso = WScript.CreateObject('Scripting.FileSystemObject'); +var args = WScript.Arguments, PROJECT_PATH="example", + PACKAGE="org.apache.cordova.example", ACTIVITY="cordovaExample", + shell=WScript.CreateObject("WScript.Shell"), + fso = WScript.CreateObject('Scripting.FileSystemObject'); + +function Usage() { + Log("Usage: create PathTONewProject [ PackageName AppName ]"); + Log(" PathTONewProject : The path to where you wish to create the project"); + Log(" PackageName : The package for the project (default is org.apache.cordova.example)") + Log(" AppName : The name of the application/activity (default is cordovaExample)"); + Log("examples:"); + Log(" create C:\\Users\\anonymous\\Desktop\\MyProject"); + Log(" create C:\\Users\\anonymous\\Desktop\\MyProject io.Cordova.Example AnApp"); +} + +// logs messaged to stdout and stderr +function Log(msg, error) { + if (error) { + WScript.StdErr.WriteLine(msg); + } + else { + WScript.StdOut.WriteLine(msg); + } +} function read(filename) { var fso=WScript.CreateObject("Scripting.FileSystemObject"); @@ -36,7 +59,7 @@ function read(filename) { function checkTargets(targets) { if(!targets) { - WScript.Echo("You do not have any android targets setup. Please create at least one target with the `android` command"); + Log("You do not have any android targets setup. Please create at least one target with the `android` command", true); WScript.Quit(69); } } @@ -74,7 +97,7 @@ function exec(command) { function createAppInfoJar() { if(!fso.FileExists(ROOT+"\\bin\\templates\\cordova\\appinfo.jar")) { - WScript.Echo("Creating appinfo.jar..."); + Log("Creating appinfo.jar..."); var cur = shell.CurrentDirectory; shell.CurrentDirectory = ROOT+"\\bin\\templates\\cordova\\ApplicationInfo"; exec("javac ApplicationInfo.java"); @@ -120,7 +143,7 @@ function downloadCommonsCodec() { stream.SaveToFile(savePath); stream.Close(); } else { - WScript.Echo('Could not retrieve the commons-codec. Please download it yourself and put into the framework/libs directory. This process may fail now. Sorry.'); + Log('Could not retrieve the commons-codec. Please download it yourself and put into the framework/libs directory. This process may fail now. Sorry.'); } } var app = WScript.CreateObject('Shell.Application'); @@ -136,23 +159,34 @@ function downloadCommonsCodec() { fso.DeleteFolder(ROOT + '\\framework\\libs\\commons-codec-1.7', true); } } - -var args = WScript.Arguments, PROJECT_PATH="example", - PACKAGE="org.apache.cordova.example", ACTIVITY="cordovaExample", - shell=WScript.CreateObject("WScript.Shell"); // working dir var ROOT = WScript.ScriptFullName.split('\\bin\\create.js').join(''); +if (args.Count() > 0) { + // support help flags + if (args(0) == "--help" || args(0) == "/?" || + args(0) == "help" || args(0) == "-help" || args(0) == "/help" || args(0) == "-h") { + Usage(); + WScript.Quit(2); + } -if (args.Count() == 3) { PROJECT_PATH=args(0); - PACKAGE=args(1); - ACTIVITY=args(2); + if (args.Count() > 1) { + PACKAGE = args(1); + } + if (args.Count() > 2) { + ACTIVITY = args(2); + } +} +else { + Log("Error : No project path provided."); + Usage(); + WScript.Quit(2); } if(fso.FolderExists(PROJECT_PATH)) { - WScript.Echo("Project already exists!"); - WScript.Quit(1); + Log("Project already exists!", true); + WScript.Quit(2); } var PACKAGE_AS_PATH=PACKAGE.replace(/\./g, '\\'); @@ -162,13 +196,13 @@ var TARGET=setTarget(); var API_LEVEL=setApiLevel(); var VERSION=read(ROOT+'\\VERSION').replace(/\r\n/,'').replace(/\n/,''); // create the project -WScript.Echo("Creating new android project..."); +Log("Creating new android project..."); exec('android.bat create project --target '+TARGET+' --path '+PROJECT_PATH+' --package '+PACKAGE+' --activity '+ACTIVITY); // build from source. distro should have these files if (!fso.FileExists(ROOT+'\\cordova-'+VERSION+'.jar') && !fso.FileExists(ROOT+'\\cordova-'+VERSION+'.js')) { - WScript.Echo("Building jar and js files..."); + Log("Building jar and js files..."); // update the cordova framework project to a target that exists on this machine exec('android.bat update project --target '+TARGET+' --path '+ROOT+'\\framework'); // pull down commons codec if necessary @@ -177,14 +211,14 @@ if (!fso.FileExists(ROOT+'\\cordova-'+VERSION+'.jar') && } // copy in the project template -WScript.Echo("Copying template files..."); +Log("Copying template files..."); exec('%comspec% /c xcopy "'+ ROOT + '"\\bin\\templates\\project\\res '+PROJECT_PATH+'\\res\\ /E /Y'); exec('%comspec% /c xcopy "'+ ROOT + '"\\bin\\templates\\project\\assets '+PROJECT_PATH+'\\assets\\ /E /Y'); exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\project\\AndroidManifest.xml ' + PROJECT_PATH + '\\AndroidManifest.xml /Y'); exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\project\\Activity.java '+ ACTIVITY_PATH +' /Y'); // check if we have the source or the distro files -WScript.Echo("Copying js, jar & config.xml files..."); +Log("Copying js, jar & config.xml files..."); if(fso.FolderExists(ROOT + '\\framework')) { exec('%comspec% /c copy "'+ROOT+'"\\framework\\assets\\www\\cordova-'+VERSION+'.js '+PROJECT_PATH+'\\assets\\www\\cordova-'+VERSION+'.js /Y'); exec('%comspec% /c copy "'+ROOT+'"\\framework\\cordova-'+VERSION+'.jar '+PROJECT_PATH+'\\libs\\cordova-'+VERSION+'.jar /Y'); @@ -202,10 +236,17 @@ if(fso.FolderExists(ROOT + '\\framework')) { // copy cordova scripts fso.CreateFolder(PROJECT_PATH + '\\cordova'); +fso.CreateFolder(PROJECT_PATH + '\\cordova\\lib'); createAppInfoJar(); -WScript.Echo("Copying cordova command tools..."); +Log("Copying cordova command tools..."); exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\appinfo.jar ' + PROJECT_PATH + '\\cordova\\appinfo.jar /Y'); -exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\cordova.js ' + PROJECT_PATH + '\\cordova\\cordova.js /Y'); +exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\lib\\cordova.js ' + PROJECT_PATH + '\\cordova\\lib\\cordova.js /Y'); +exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\lib\\install-device.bat ' + PROJECT_PATH + '\\cordova\\lib\\install-device.bat /Y'); +exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\lib\\install-emulator.bat ' + PROJECT_PATH + '\\cordova\\lib\\install-emulator.bat /Y'); +exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\lib\\list-emulator-images.bat ' + PROJECT_PATH + '\\cordova\\lib\\list-emulator-images.bat /Y'); +exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\lib\\list-devices.bat ' + PROJECT_PATH + '\\cordova\\lib\\list-devices.bat /Y'); +exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\lib\\list-started-emulators.bat ' + PROJECT_PATH + '\\cordova\\lib\\list-started-emulators.bat /Y'); +exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\lib\\start-emulator.bat ' + PROJECT_PATH + '\\cordova\\lib\\start-emulator.bat /Y'); exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\cordova.bat ' + PROJECT_PATH + '\\cordova\\cordova.bat /Y'); exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\clean.bat ' + PROJECT_PATH + '\\cordova\\clean.bat /Y'); exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\build.bat ' + PROJECT_PATH + '\\cordova\\build.bat /Y'); @@ -213,7 +254,7 @@ exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\log.bat ' + PROJECT exec('%comspec% /c copy "'+ROOT+'"\\bin\\templates\\cordova\\run.bat ' + PROJECT_PATH + '\\cordova\\run.bat /Y'); // interpolate the activity name and package -WScript.Echo("Updating AndroidManifest.xml and Main Activity..."); +Log("Updating AndroidManifest.xml and Main Activity..."); replaceInFile(ACTIVITY_PATH, /__ACTIVITY__/, ACTIVITY); replaceInFile(ACTIVITY_PATH, /__ID__/, PACKAGE); diff --git a/bin/templates/cordova/build.bat b/bin/templates/cordova/build.bat index 8e6ca9ad..7aa7c75d 100644 --- a/bin/templates/cordova/build.bat +++ b/bin/templates/cordova/build.bat @@ -1,18 +1,2 @@ -:: Licensed to the Apache Software Foundation (ASF) under one -:: or more contributor license agreements. See the NOTICE file -:: distributed with this work for additional information -:: regarding copyright ownership. The ASF licenses this file -:: to you under the Apache License, Version 2.0 (the -:: "License"); you may not use this file except in compliance -:: with the License. You may obtain a copy of the License at -:: -:: http://www.apache.org/licenses/LICENSE-2.0 -:: -:: Unless required by applicable law or agreed to in writing, -:: software distributed under the License is distributed on an -:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -:: KIND, either express or implied. See the License for the -:: specific language governing permissions and limitations -:: under the License. - -%~dp0\cordova.bat build +@ECHO OFF +%~dp0\cordova.bat build %* \ No newline at end of file diff --git a/bin/templates/cordova/clean.bat b/bin/templates/cordova/clean.bat index fe5c09f0..b41bdc91 100644 --- a/bin/templates/cordova/clean.bat +++ b/bin/templates/cordova/clean.bat @@ -1,18 +1,2 @@ -:: Licensed to the Apache Software Foundation (ASF) under one -:: or more contributor license agreements. See the NOTICE file -:: distributed with this work for additional information -:: regarding copyright ownership. The ASF licenses this file -:: to you under the Apache License, Version 2.0 (the -:: "License"); you may not use this file except in compliance -:: with the License. You may obtain a copy of the License at -:: -:: http://www.apache.org/licenses/LICENSE-2.0 -:: -:: Unless required by applicable law or agreed to in writing, -:: software distributed under the License is distributed on an -:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -:: KIND, either express or implied. See the License for the -:: specific language governing permissions and limitations -:: under the License. - -%~dp0\cordova.bat clean +@ECHO OFF +%~dp0\cordova.bat clean %* diff --git a/bin/templates/cordova/cordova.bat b/bin/templates/cordova/cordova.bat index 22c289a2..9b561993 100644 --- a/bin/templates/cordova/cordova.bat +++ b/bin/templates/cordova/cordova.bat @@ -1,3 +1,5 @@ +@ECHO OFF +GOTO BEGIN :: Licensed to the Apache Software Foundation (ASF) under one :: or more contributor license agreements. See the NOTICE file :: distributed with this work for additional information @@ -14,14 +16,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. - -@ECHO OFF +:BEGIN IF NOT DEFINED JAVA_HOME GOTO MISSING FOR %%X in (java.exe ant.bat android.bat) do ( SET FOUND=%%~$PATH:X IF NOT DEFINED FOUND GOTO MISSING ) -cscript %~dp0\cordova.js %* +cscript %~dp0\lib\cordova.js %* //nologo GOTO END :MISSING ECHO Missing one of the following: diff --git a/bin/templates/cordova/lib/cordova.js b/bin/templates/cordova/lib/cordova.js new file mode 100644 index 00000000..d974ae22 --- /dev/null +++ b/bin/templates/cordova/lib/cordova.js @@ -0,0 +1,594 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +var ROOT = WScript.ScriptFullName.split('\\cordova\\lib\\cordova.js').join(''), + shell = WScript.CreateObject("WScript.Shell"), + fso = WScript.CreateObject('Scripting.FileSystemObject'); + + +// log to stdout or stderr +function Log(msg, error) { + if (error) { + WScript.StdErr.WriteLine(msg); + } + else { + WScript.StdOut.WriteLine(msg); + } +} + +// executes a commmand in the shell, returning stdout +function exec(command) { + var oExec=shell.Exec(command); + var output = new String(); + while (oExec.Status == 0) { + if (!oExec.StdOut.AtEndOfStream) { + var line = oExec.StdOut.ReadLine(); + output += line; + } + WScript.sleep(100); + } + return output; +} + +// executes a command in the shell, returns stdout or stderr if error +function exec_out(command) { + var oExec=shell.Exec(command); + var output = new String(); + while (oExec.Status == 0) { + if (!oExec.StdOut.AtEndOfStream) { + var line = oExec.StdOut.ReadLine(); + // XXX: Change to verbose mode + // WScript.StdOut.WriteLine(line); + output += line; + } + WScript.sleep(100); + } + //Check to make sure our scripts did not encounter an error + if (!oExec.StdErr.AtEndOfStream) { + var line = oExec.StdErr.ReadAll(); + return {'error' : true, 'output' : line}; + } + return {'error' : false, 'output' : output}; +} + +// executes a commmand in the shell and outputs stdout and fails on stderr +function exec_verbose(command) { + //Log("Command: " + command); + var oShell=shell.Exec(command); + while (oShell.Status == 0) { + //Wait a little bit so we're not super looping + WScript.sleep(100); + //Print any stdout output from the script + if (!oShell.StdOut.AtEndOfStream) { + var line = oShell.StdOut.ReadLine(); + Log(line); + } + } + //Check to make sure our scripts did not encounter an error + if (!oShell.StdErr.AtEndOfStream) { + var line = oShell.StdErr.ReadAll(); + Log(line, true); + WScript.Quit(2); + } +} + +function get_devices() { + var device_list = [] + var local_devices = shell.Exec("%comspec% /c adb devices").StdOut.ReadAll(); + if (local_devices.match(/\w+\tdevice/)) { + devices = local_devices.split('\r\n'); + //format (ID DESCRIPTION) + for (i in devices) { + if (devices[i].match(/\w+\tdevice/) && !devices[i].match(/emulator/)) { + device_list.push(devices[i].replace(/\t/, ' ')); + } + } + } + return device_list +} + +function list_devices() { + var devices = get_devices(); + if (devices.length > 0) { + for (i in devices) { + Log(devices[i]); + } + } + else { + Log('No devices found, if your device is connected and not showing,'); + Log(' then try and install the drivers for your device.'); + Log(' http://developer.android.com/tools/extras/oem-usb.html'); + } + +} + +function get_emulator_images() { + // discription contains all data recieved squashed onto one line + var add_description = true; + var oExec = shell.Exec("%comspec% /c android.bat list avd"); + var avd_list = []; + var local_emulators = shell.Exec("%comspec% /c android list avds").StdOut.ReadAll(); + if (local_emulators.match(/Name\:/)) { + emulators = local_emulators.split('\n'); + //format (ID DESCRIPTION) + var count = 0; + var output = ''; + for (i in emulators) { + if (emulators[i].match(/Name\:/)) { + var emulator_name = emulators[i].replace(/\s*Name\:\s/, '') + ' '; + if (add_description) { + count = 1; + output += emulator_name + } + else { + avd_list.push(emulator_name); + } + } + // add description if indicated (all data squeezed onto one line) + if (count > 0) { + var emulator_description = emulators[i].replace(/\s*/g, ''); + if (count > 4) { + avd_list.push(output + emulator_description); + count = 0; + output = ''; + } + else { + count++; + output += emulator_description + ' ' + } + } + } + } + return avd_list; +} + +function list_emulator_images() { + var images = get_emulator_images(); + if (images.length > 0) { + for(i in images) { + Log(images[i]); + } + } + else { + Log('No emulators found, if you would like to create an emulator follow the instructions'); + Log(' provided here : http://developer.android.com/tools/devices/index.html'); + Log(' Or run \'android create avd --name --target \' in on the command line.'); + } +} + +function get_started_emulators() { + var started_emulators = []; + var local_devices = shell.Exec("%comspec% /c adb devices").StdOut.ReadAll(); + if (local_devices.match(/emulator/)) { + devices = local_devices.split('\r\n'); + //format (ID DESCRIPTION) + for (i in devices) { + if (devices[i].match(/\w+\tdevice/) && devices[i].match(/emulator/)) { + started_emulators.push(devices[i].replace(/\t/, ' ')); + } + } + } + return started_emulators +} + +function list_started_emulators() { + var images = get_started_emulators(); + if (images.length > 0) { + for(i in images) { + Log(images[i]); + } + } + else { + Log('No started emulators found, if you would like to start an emulator call \'list-emulator-images\''); + Log(' to get the name of an emulator and then start the emulator with \'start-emulator \''); + } +} + +function start_emulator(name) { + var emulators = get_emulator_images(); + var started_emulators = get_started_emulators(); + var num_started = started_emulators.length; + var emulator_name; + var started = false; + if (name) { + for (i in emulators) { + if (emulators[i].substr(0,name.length) == name) { + Log("Starting emulator : " + name); + shell.Run("%comspec% /c start cmd /c emulator -avd " + name); + //shell.Run("%comspec% /c start cmd /c emulator -cpu-delay 0 -no-boot-anim -cache %Temp%\cache -avd " + name); + started = true; + } + } + } + else { + if (emulators.length > 0 && started_emulators < 1) { + emulator_name = emulators[0].split(' ', 1)[0]; + start_emulator(emulator_name); + return; + } else if (started_emulators.length > 0) { + Log("Emulator already started : " + started_emulators[0].split(' ', 1)); + return; + } else { + Log("Error : unable to start emulator, ensure you have emulators availible by checking \'list-emulator-images\'", true); + WScript.Quit(2); + } + } + if (!started) { + Log("Error : unable to start emulator, ensure you have emulators availible by checking \'list-emulator-images\'", true); + WScript.Quit(2); + } + else { // wait for emulator to boot before returning + WScript.Stdout.Write('Booting up emulator..'); + var boot_anim = null; + var emulator_ID = null; + var new_started = get_started_emulators(); + var i = 0; + // use boot animation property to tell when boot is complete. + while ((boot_anim == null || !boot_anim.output.match(/stopped/)) && i < 100) { + if (new_started.length > started_emulators.length && emulator_ID == null) { + // find new emulator that was just started to get it's ID + for(var i = 0; i < new_started.length; i++) { + if (new_started[i] != started_emulators[i]) { + emulator_ID = new_started[i].split(' ', 1)[0]; + boot_anim = exec_out('%comspec% /c adb -s ' + emulator_ID + ' shell getprop init.svc.bootanim'); + break; + } + } + } + else if (boot_anim == null) { + new_started = get_started_emulators(); + } + else { + boot_anim = exec_out('%comspec% /c adb -s ' + emulator_ID + ' shell getprop init.svc.bootanim'); + } + i++; + WScript.Stdout.Write('.'); + WScript.Sleep(2000); + } + if (i < 100) { + Log('\nBoot Complete!'); + } else { + Log('\nEmulator boot timed out. Failed to load emulator'); + WScript.Quit(2); + } + } +} + +function install_device(target) { + var devices = get_devices(); + var use_target = false; + if (devices.length < 1) { + Log("Error : No devices found to install to, make sure there are devices", true); + Log(" availible by checking \'\\cordova\\lib\\list-devices\'", true); + WScript.Quit(2); + } + if (target) { + var exists = false; + for (i in devices) { + if (devices[i].substr(0,target.length) == target) + { + exists = true; + break; + } + } + if (!exists) { + Log("Error : Unable to find target " + target, true); + Log("Please ensure the target exists by checking \'\\cordova\\lib\\list-devices'"); + WScript.Quit(2); + } + use_target = true; + } + // check if file .apk has been created + if (fso.FolderExists(ROOT + '\\bin')) { + var path_to_apk; + var out_folder = fso.GetFolder(ROOT + '\\bin'); + var out_files = new Enumerator(out_folder.Files); + for (;!out_files.atEnd(); out_files.moveNext()) { + var path = out_files.item() + ''; + if (fso.GetExtensionName(path) == 'apk' && !path.match(/unaligned/)) { + path_to_apk = out_files.item(); + break; + } + } + if (path_to_apk) { + var launch_name = exec_out("%comspec% /c java -jar "+ROOT+"\\cordova\\appinfo.jar "+ROOT+"\\AndroidManifest.xml"); + if (launch_name.error) { + Log("Failed to get application name from appinfo.jar + AndroidManifest : ", true); + Log("Output : " + launch_name.output, true); + WScript.Quit(2); + } + // install on device (-d) + Log("Installing app on device..."); + var cmd; + if (use_target) { + cmd = '%comspec% /c adb -s ' + target + ' install -r ' + path_to_apk; + } else { + cmd = '%comspec% /c adb -s ' + devices[0].split(' ', 1)[0] + ' install -r ' + path_to_apk; + } + var install = exec_out(cmd); + if ( install.error && install.output.match(/Failure/)) { + Log("Error : Could not install apk to device : ", true); + Log(install.output, true); + WScript.Quit(2); + } + else { + Log(install.output); + } + // run on device + Log("Launching application..."); + cmd; + if (use_target) { + cmd = '%comspec% /c adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output; + } else { + cmd = '%comspec% /c adb -s ' + devices[0].split(' ', 1)[0] + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output; + } + exec_verbose(cmd); + } + else { + Log('Failed to find apk, make sure you project is built and there is an ', true); + Log(' apk in \\bin\\. To build your project use \'\\cordova\\build\'', true); + WScript.Quit(2); + } + } +} + +function install_emulator(target) { + var emulators = get_started_emulators(); + var use_target = false; + if (emulators.length < 1) { + Log("Error : No emulators found to install to, make sure there are emulators", true); + Log(" availible by checking \'\\cordova\\lib\\list-started-emulators\'", true); + WScript.Quit(2); + } + if (target) { + var exists = false; + for (i in emulators) { + if (emulators[i].substr(0,target.length) == target) + { + exists = true; + break; + } + } + if (!exists) { + Log("Error : Unable to find target " + target, true); + Log("Please ensure the target exists by checking \'\\cordova\\lib\\list-started-emulators'") + } + use_target = true; + } else { + target = emulators[0].split(' ', 1)[0]; + Log("Deploying to emulator : " + target); + } + // check if file .apk has been created + if (fso.FolderExists(ROOT + '\\bin')) { + var path_to_apk; + var out_folder = fso.GetFolder(ROOT + '\\bin'); + var out_files = new Enumerator(out_folder.Files); + for (;!out_files.atEnd(); out_files.moveNext()) { + var path = out_files.item() + ''; + if (fso.GetExtensionName(path) == 'apk' && !path.match(/unaligned/)) { + path_to_apk = out_files.item(); + break; + } + } + if (path_to_apk) { + var launch_name = exec_out("%comspec% /c java -jar "+ROOT+"\\cordova\\appinfo.jar "+ROOT+"\\AndroidManifest.xml"); + if (launch_name.error) { + Log("Failed to get application name from appinfo.jar + AndroidManifest : ", true); + Log("Output : " + launch_name.output, true); + WScript.Quit(2); + } + // install on emulator (-e) + Log("Installing app on emulator..."); + var cmd = '%comspec% /c adb -s ' + target + ' install -r ' + path_to_apk; + var install = exec_out(cmd); + if ( install.error && install.output.match(/Failure/)) { + Log("Error : Could not install apk to emulator : ", true); + Log(install.output, true); + WScript.Quit(2); + } + else { + Log(install.output); + } + // run on emulator + Log("Launching application..."); + cmd; + if (use_target) { + cmd = '%comspec% /c adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output; + } else { + cmd = '%comspec% /c adb -s ' + emulators[0].split(' ', 1)[0] + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output + } + exec_verbose(cmd); + } + else { + Log('Failed to find apk, make sure you project is built and there is an ', true); + Log(' apk in \\bin\\. To build your project use \'\\cordova\\build\'', true); + WScript.Quit(2); + } + } + else { + Log('Failed to find apk, make sure you project is built and there is an ', true); + Log(' apk in \\bin\\. To build your project use \'\\cordova\\build\'', true); + WScript.Quit(2); + } +} + +function clean() { + Log("Cleaning project..."); + exec("%comspec% /c ant.bat clean -f "+ROOT+"\\build.xml 2>&1"); +} + +function build(build_type) { + if (build_type) { + switch (build_type) { + case "--debug" : + clean(); + Log("Building project..."); + exec_verbose("%comspec% /c ant.bat debug -f "+ROOT+"\\build.xml 2>&1"); + break; + case "--release" : + clean(); + Log("Building project..."); + exec_verbose("%comspec% /c ant.bat release -f "+ROOT+"\\build.xml 2>&1"); + break; + case "--nobuild" : + Log("Skipping build process."); + break; + default : + Log("Build option not recognized: " + build_type, true); + WScript.Quit(2); + break; + } + } + else { + Log("WARNING: [ --debug | --release | --nobuild ] not specified, defaulting to --debug."); + exec_verbose("%comspec% /c ant.bat debug -f "+ROOT+"\\build.xml 2>&1"); + } +} + +function log() { + // filter out nativeGetEnabledTags spam from latest sdk bug. + shell.Run("%comspec% /c adb logcat | grep -v nativeGetEnabledTags"); +} + +function run(target, build_type) { + var use_target = false; + if (!target) { + Log("WARNING: [ --target= | --emulator | --device ] not specified, using defaults"); + } + // build application + build(build_type); + // attempt to deploy to connected device + var devices = get_devices(); + if (devices.length > 0 || target == "--device") { + if (target) { + if (target.substr(0,9) == "--target=") { + install_device(target.split('--target=').join('')) + } else if (target == "--device") { + install_device(); + } else { + Log("Did not regognize " + target + " as a run option.", true); + WScript.Quit(2); + } + } + else { + Log("WARNING: [ --target= | --emulator | --device ] not specified, using defaults"); + install_device(); + } + } + else { + var emulators = get_started_emulators(); + if (emulators.length > 0) { + install_emulator(); + } + else { + var emulator_images = get_emulator_images(); + if (emulator_images.length < 1) { + Log('No emulators found, if you would like to create an emulator follow the instructions', true); + Log(' provided here : http://developer.android.com/tools/devices/index.html', true); + Log(' Or run \'android create avd --name --target \' in on the command line.', true); + WScript.Quit(2); + } + start_emulator(emulator_images[0].split(' ')[0]); + emulators = get_started_emulators(); + if (emulators.length > 0) { + install_emulator(); + } + else { + Log("Error : emulator failed to start.", true); + WScript.Quit(2); + } + } + } +} + +var args = WScript.Arguments; +if (args.count() == 0) { + Log("Error: no args provided."); + WScript.Quit(2); +} +else { + if (args(0) == "build") { + if (args.Count() > 1) { + build(args(1)) + } else { + build(); + } + } else if (args(0) == "clean") { + clean(); + } else if (args(0) == "list-devices") { + list_devices(); + } else if (args(0) == "list-emulator-images") { + list_emulator_images(); + } else if (args(0) == "list-started-emulators") { + list_started_emulators(); + } else if (args(0) == "start-emulator") { + if (args.Count() > 1) { + start_emulator(args(1)) + } else { + start_emulator(); + } + } else if (args(0) == "log") { + log(); + } else if (args(0) == "install-emulator") { + if (args.Count() == 2) { + if (args(1).substr(0,9) == "--target=") { + install_emulator(args(1).split('--target=').join('')); + } else { + Log('Error: \"' + args(1) + '\" is not recognized as an install option', true); + WScript.Quit(2); + } + } else { + install_emulator(); + } + } else if (args(0) == "install-device") { + if (args.Count() == 2) { + if (args(1).substr(0,9) == "--target=") { + install_device(args(1).split('--target=').join('')); + } else { + Log('Error: \"' + args(1) + '\" is not recognized as an install option', true); + WScript.Quit(2); + } + } else { + install_device(); + } + } else if (args(0) == "run") { + if (args.Count() == 3) { + run(args(1), args(2)); + } + else if (args.Count() == 2) { + if (args(1).substr(0,9) == "--target=" || + args(1) == "--emulator" || + args(1) == "--device") { + run(args(1)); + } else if (args(1) == "--debug" || + args(1) == "--release" || + args(1) == "--nobuild") { + run(null, args(1)) + } else { + Log('Error: \"' + args(1) + '\" is not recognized as a run option', true); + WScript.Quit(2); + } + } + else { + run(); + } + } else { + Log('Error: \"' + args(0) + '\" is not recognized as a tooling command', true); + WScript.Quit(2); + } +} + diff --git a/bin/templates/cordova/lib/install-device.bat b/bin/templates/cordova/lib/install-device.bat new file mode 100644 index 00000000..52d97759 --- /dev/null +++ b/bin/templates/cordova/lib/install-device.bat @@ -0,0 +1,9 @@ +@ECHO OFF +SET full_path=%~dp0 +IF EXIST %full_path%cordova.js ( + cscript "%full_path%cordova.js" install-device %* //nologo +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/install-emulator.bat b/bin/templates/cordova/lib/install-emulator.bat new file mode 100644 index 00000000..d11a7be3 --- /dev/null +++ b/bin/templates/cordova/lib/install-emulator.bat @@ -0,0 +1,9 @@ +@ECHO OFF +SET full_path=%~dp0 +IF EXIST %full_path%cordova.js ( + cscript "%full_path%cordova.js" install-emulator %* //nologo +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/list-devices.bat b/bin/templates/cordova/lib/list-devices.bat new file mode 100644 index 00000000..c146f105 --- /dev/null +++ b/bin/templates/cordova/lib/list-devices.bat @@ -0,0 +1,9 @@ +@ECHO OFF +SET full_path=%~dp0 +IF EXIST %full_path%cordova.js ( + cscript "%full_path%cordova.js" list-devices //nologo +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/list-emulator-images.bat b/bin/templates/cordova/lib/list-emulator-images.bat new file mode 100644 index 00000000..172520b3 --- /dev/null +++ b/bin/templates/cordova/lib/list-emulator-images.bat @@ -0,0 +1,9 @@ +@ECHO OFF +SET full_path=%~dp0 +IF EXIST %full_path%cordova.js ( + cscript "%full_path%cordova.js" list-emulator-images //nologo +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/list-started-emulators.bat b/bin/templates/cordova/lib/list-started-emulators.bat new file mode 100644 index 00000000..f1b3c5d3 --- /dev/null +++ b/bin/templates/cordova/lib/list-started-emulators.bat @@ -0,0 +1,9 @@ +@ECHO OFF +SET full_path=%~dp0 +IF EXIST %full_path%cordova.js ( + cscript "%full_path%cordova.js" list-started-emulators //nologo +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/start-emulator.bat b/bin/templates/cordova/lib/start-emulator.bat new file mode 100644 index 00000000..4f3fb5d8 --- /dev/null +++ b/bin/templates/cordova/lib/start-emulator.bat @@ -0,0 +1,9 @@ +@ECHO OFF +SET full_path=%~dp0 +IF EXIST %full_path%cordova.js ( + cscript "%full_path%cordova.js" start-emulator %* //nologo +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/log.bat b/bin/templates/cordova/log.bat index b8cc6bea..2c492e75 100644 --- a/bin/templates/cordova/log.bat +++ b/bin/templates/cordova/log.bat @@ -1,18 +1,2 @@ -:: Licensed to the Apache Software Foundation (ASF) under one -:: or more contributor license agreements. See the NOTICE file -:: distributed with this work for additional information -:: regarding copyright ownership. The ASF licenses this file -:: to you under the Apache License, Version 2.0 (the -:: "License"); you may not use this file except in compliance -:: with the License. You may obtain a copy of the License at -:: -:: http://www.apache.org/licenses/LICENSE-2.0 -:: -:: Unless required by applicable law or agreed to in writing, -:: software distributed under the License is distributed on an -:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -:: KIND, either express or implied. See the License for the -:: specific language governing permissions and limitations -:: under the License. - -%~dp0\cordova.bat log +@ECHO OFF +%~dp0\cordova.bat log %* diff --git a/bin/templates/cordova/run.bat b/bin/templates/cordova/run.bat index 7c470ed8..b1cab648 100644 --- a/bin/templates/cordova/run.bat +++ b/bin/templates/cordova/run.bat @@ -1 +1,2 @@ -%~dp0\cordova.bat run +@ECHO OFF +%~dp0\cordova.bat run %* \ No newline at end of file