diff --git a/VERSION b/VERSION index 38f8e886..90012116 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -dev +dev \ No newline at end of file diff --git a/bin/check_reqs b/bin/check_reqs index cdc3fdab..d50c78df 100755 --- a/bin/check_reqs +++ b/bin/check_reqs @@ -1,34 +1,26 @@ -#! /bin/bash -# 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. -# -ROOT="$( cd "$( dirname "$0" )/.." && pwd )" -cmd=`android list target` -if [[ $? != 0 ]]; then - echo "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." - exit 2 -elif [[ ! $cmd =~ "android-18" ]]; then - echo "Please install Android target 18 (the Android 4.3 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." - exit 2 -else - cmd="android update project -p $ROOT -t android-18 1> /dev/null 2>&1" - eval $cmd - if [[ $? != 0 ]]; then - echo "Error updating the Cordova library to work with your Android environment." - exit 2 - fi -fi +#!/usr/bin/env node + +/* + 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 check_reqs = require('./lib/check_reqs'); + +if(!check_reqs.run()) { + process.exit(2); +} \ No newline at end of file diff --git a/bin/check_reqs.bat b/bin/check_reqs.bat index 12da1e74..cb2c6f54 100644 --- a/bin/check_reqs.bat +++ b/bin/check_reqs.bat @@ -16,11 +16,11 @@ :: under the License. @ECHO OFF -SET full_path=%~dp0 -IF EXIST %full_path%check_reqs.js ( - cscript "%full_path%check_reqs.js" //nologo +SET script_path="%~dp0check_reqs" +IF EXIST %script_path% ( + node "%script_path%" %* ) ELSE ( ECHO. - ECHO ERROR: Could not find 'check_reqs.js' in 'bin' folder, aborting...>&2 + ECHO ERROR: Could not find 'check_reqs' script in 'bin' folder, aborting...>&2 EXIT /B 1 ) diff --git a/bin/check_reqs.js b/bin/check_reqs.js deleted file mode 100644 index 4a724a6e..00000000 --- a/bin/check_reqs.js +++ /dev/null @@ -1,102 +0,0 @@ -// 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 target = get_target(); - if(target==null) { - Log('Unable to find android target in project.properties'); - WScript.Quit(2); - } - 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.indexOf(target) == -1) { - Log(result.output.indexOf(target)); - Log('Please install the latest Android target (' + target + '). 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(result.output); - WScript.Quit(2); - } - else { - var cmd = '%comspec% /c android update project -p ' + ROOT + '\\framework -t ' + target; - 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); - } - } -} - -function get_target() { - var fso=WScript.CreateObject("Scripting.FileSystemObject"); - var f=fso.OpenTextFile(ROOT + '\\framework\\project.properties', 1); - var s=f.ReadAll(); - var lines = s.split('\n'); - for (var line in lines) { - if(lines[line].match(/target=/)) - { - return lines[line].split('=')[1].replace(' ', '').replace('\r', ''); - } - } - return null; -} - -check_requirements(); - diff --git a/bin/create b/bin/create index 6a49dc9c..0c2b7962 100755 --- a/bin/create +++ b/bin/create @@ -1,159 +1,32 @@ -#! /bin/bash -# 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. -# -# create a cordova/android project -# -# USAGE -# ./create [path package activity] -# -set -e +#!/usr/bin/env node -if [ -z "$1" ] || [ "$1" == "-h" ] -then - echo "Usage: $0 " - echo "Make sure the Android SDK tools folder is in your PATH!" - echo " : Path to your new Cordova iOS project" - echo " : Package name, following reverse-domain style convention" - echo " : Project name" - exit 0 -fi +/* + 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 -BUILD_PATH="$( cd "$( dirname "$0" )/.." && pwd )" -VERSION=$(cat "$BUILD_PATH"/VERSION) + http://www.apache.org/licenses/LICENSE-2.0 -PROJECT_PATH="${1:-'./example'}" -PACKAGE=${2:-"org.apache.cordova.example"} -ACTIVITY=$(echo ${3:-"cordovaExample"} | tr -d '[:blank:][:punct:]') -APP_LABEL=${3:-"Cordova Example"}; -PROJECT_TEMPLATE_DIR=${4:-"$BUILD_PATH/bin/templates/project"}; + 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. +*/ -# clobber any existing example -if [ -d "$PROJECT_PATH" ] -then - echo "Project already exists! Delete and recreate" - exit 1 -fi - -function createAppInfoJar { - pushd "$BUILD_PATH"/bin/templates/cordova/ApplicationInfo > /dev/null - javac ApplicationInfo.java - jar -cfe ../appinfo.jar ApplicationInfo ApplicationInfo.class - popd > /dev/null -} - -function on_error { - echo "An unexpected error occurred: $previous_command exited with $?" - echo "Deleting project..." - [ -d "$PROJECT_PATH" ] && rm -rf "$PROJECT_PATH" - exit 1 -} - -function replace { - local pattern=$1 - local filename=$2 - # Mac OS X requires -i argument - if [[ "$OSTYPE" =~ "darwin" ]] - then - /usr/bin/sed -i '' -e "$pattern" "$filename" - elif [[ "$OSTYPE" =~ "linux" ]] - then - /bin/sed -i -e $pattern "$filename" - fi -} - -# we do not want the script to silently fail -trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG -trap on_error ERR - -ANDROID_BIN="${ANDROID_BIN:=$( which android )}" -PACKAGE_AS_PATH=$(echo $PACKAGE | sed 's/\./\//g') -ACTIVITY_PATH="$PROJECT_PATH"/src/$PACKAGE_AS_PATH/$ACTIVITY.java -MANIFEST_PATH="$PROJECT_PATH"/AndroidManifest.xml -STRINGS_PATH="$PROJECT_PATH"/res/values/strings.xml - -TARGET=$("$ANDROID_BIN" list targets -c | grep '^android-' | tail -1 ) -API_LEVEL=${TARGET##android-} - -# check that build targets exist -if [ -z "$TARGET" ] || [ -z "$API_LEVEL" ] -then - echo "No Android Targets are installed. Please install at least one via the android SDK" - exit 1 -fi - -# if this a distribution release no need to build a jar -if [ ! -e "$BUILD_PATH"/cordova-$VERSION.jar ] && [ -d "$BUILD_PATH"/framework ] -then - # update the cordova-android framework for the desired target - "$ANDROID_BIN" update project --target $TARGET --path "$BUILD_PATH"/framework &> /dev/null - - # compile cordova.js and cordova.jar - pushd "$BUILD_PATH"/framework > /dev/null - ant jar > /dev/null - popd > /dev/null -fi - -# create new android project -"$ANDROID_BIN" create project --target $TARGET --path "$PROJECT_PATH" --package $PACKAGE --activity $ACTIVITY &> /dev/null - -# copy project template -cp -r "$PROJECT_TEMPLATE_DIR"/assets "$PROJECT_PATH" -cp -r "$PROJECT_TEMPLATE_DIR"/res "$PROJECT_PATH" - -# copy cordova.js, cordova.jar and res/xml -if [ -d "$BUILD_PATH"/framework ] -then - cp -r "$BUILD_PATH"/framework/res/xml "$PROJECT_PATH"/res - cp "$BUILD_PATH"/framework/assets/www/cordova.js "$PROJECT_PATH"/assets/www/cordova.js - cp "$BUILD_PATH"/framework/cordova-$VERSION.jar "$PROJECT_PATH"/libs/cordova-$VERSION.jar -else - cp -r "$BUILD_PATH"/xml "$PROJECT_PATH"/res/xml - cp "$BUILD_PATH"/cordova.js "$PROJECT_PATH"/assets/www/cordova.js - cp "$BUILD_PATH"/cordova-$VERSION.jar "$PROJECT_PATH"/libs/cordova-$VERSION.jar -fi - -# interpolate the activity name and package -cp "$PROJECT_TEMPLATE_DIR"/Activity.java "$ACTIVITY_PATH" -replace "s/__ACTIVITY__/${ACTIVITY}/g" "$ACTIVITY_PATH" -replace "s/__ID__/${PACKAGE}/g" "$ACTIVITY_PATH" - -# interpolate the app name into strings.xml -replace "s/>${ACTIVITY}${APP_LABEL}&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/create.js b/bin/create.js deleted file mode 100644 index c723b12a..00000000 --- a/bin/create.js +++ /dev/null @@ -1,214 +0,0 @@ -/* - 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. -*/ - -/* - * create a cordova/android project - * - * USAGE - * ./create [path package activity] - */ - -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"); - var f=fso.OpenTextFile(filename, 1); - var s=f.ReadAll(); - f.Close(); - return s; -} - -function checkTargets(targets) { - if(!targets) { - Log("You do not have any android targets setup. Please create at least one target with the `android` command", true); - WScript.Quit(69); - } -} - -function setTarget() { - var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s\d+/g); - checkTargets(targets); - return targets[targets.length - 1].replace(/id: /, ""); // TODO: give users the option to set their target -} -function setApiLevel() { - var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/API level:\s\d+/g); - checkTargets(targets); - return targets[targets.length - 1].replace(/API level: /, ""); -} -function write(filename, contents) { - var fso=WScript.CreateObject("Scripting.FileSystemObject"); - var f=fso.OpenTextFile(filename, 2, true); - f.Write(contents); - f.Close(); -} -function replaceInFile(filename, regexp, replacement) { - write(filename, read(filename).replace(regexp, replacement)); -} -function exec(command) { - var oShell=shell.Exec(command); - while (oShell.Status == 0) { - if(!oShell.StdOut.AtEndOfStream) { - var line = oShell.StdOut.ReadLine(); - // XXX: Change to verbose mode - // WScript.StdOut.WriteLine(line); - } - WScript.sleep(100); - } -} - -function createAppInfoJar() { - if(!fso.FileExists(ROOT+"\\bin\\templates\\cordova\\appinfo.jar")) { - Log("Creating appinfo.jar..."); - var cur = shell.CurrentDirectory; - shell.CurrentDirectory = ROOT+"\\bin\\templates\\cordova\\ApplicationInfo"; - exec("javac ApplicationInfo.java"); - exec("jar -cfe ..\\appinfo.jar ApplicationInfo ApplicationInfo.class"); - shell.CurrentDirectory = cur; - } -} - -// 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); - } - - PROJECT_PATH=args(0); - 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)) { - Log("Project path already exists!", true); - WScript.Quit(2); -} - -var PACKAGE_AS_PATH=PACKAGE.replace(/\./g, '\\'); -var ACTIVITY_DIR=PROJECT_PATH + '\\src\\' + PACKAGE_AS_PATH; -var SAFE_ACTIVITY = ACTIVITY.replace(/\W/g, ''); -var ACTIVITY_PATH=ACTIVITY_DIR+'\\'+SAFE_ACTIVITY+'.java'; -var MANIFEST_PATH=PROJECT_PATH+'\\AndroidManifest.xml'; -var STRINGS_PATH=PROJECT_PATH+'\\res\\values\\strings.xml'; -var TARGET=setTarget(); -var API_LEVEL=setApiLevel(); -var VERSION=read(ROOT+'\\VERSION').replace(/\r\n/,'').replace(/\n/,''); -// create the project -Log("Creating new android project..."); -exec('android.bat create project --target "'+TARGET+'" --path "'+PROJECT_PATH+'" --package "'+PACKAGE+'" --activity "'+SAFE_ACTIVITY+'"'); - -// build from source. distro should have these files -if (!fso.FileExists(ROOT+'\\cordova-'+VERSION+'.jar') && - !fso.FileExists(ROOT+'\\cordova.js')) { - 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"'); - exec('ant.bat -f "'+ ROOT +'\\framework\\build.xml" jar'); -} - -// copy in the project template -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 mkdir "' + ACTIVITY_DIR + '"'); -exec('%comspec% /c copy "' + ROOT + '"\\bin\\templates\\project\\Activity.java "' + ACTIVITY_PATH + '" /Y'); - -// check if we have the source or the distro files -Log("Copying js, jar & config.xml files..."); -if(fso.FolderExists(ROOT + '\\framework')) { - exec('%comspec% /c copy "'+ROOT+'\\framework\\assets\\www\\cordova.js" "'+PROJECT_PATH+'\\assets\\www\\cordova.js" /Y'); - exec('%comspec% /c copy "'+ROOT+'\\framework\\cordova-'+VERSION+'.jar" "'+PROJECT_PATH+'\\libs\\cordova-'+VERSION+'.jar" /Y'); - fso.CreateFolder(PROJECT_PATH + '\\res\\xml'); - exec('%comspec% /c copy "'+ROOT+'\\framework\\res\\xml\\config.xml" "' + PROJECT_PATH + '\\res\\xml\\config.xml" /Y'); -} else { - // copy in cordova.js - exec('%comspec% /c copy "'+ROOT+'\\cordova.js" "'+PROJECT_PATH+'\\assets\\www\\cordova.js" /Y'); - // copy in cordova.jar - exec('%comspec% /c copy "'+ROOT+'\\cordova-'+VERSION+'.jar" "'+PROJECT_PATH+'\\libs\\cordova-'+VERSION+'.jar" /Y'); - // copy in xml - fso.CreateFolder(PROJECT_PATH + '\\res\\xml'); - exec('%comspec% /c copy "'+ROOT+'\\xml\\config.xml" "' + PROJECT_PATH + '\\res\\xml\\config.xml" /Y'); -} - -// copy cordova scripts -fso.CreateFolder(PROJECT_PATH + '\\cordova'); -fso.CreateFolder(PROJECT_PATH + '\\cordova\\lib'); -createAppInfoJar(); -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\\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'); -exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\log.bat" "' + PROJECT_PATH + '\\cordova\\log.bat" /Y'); -exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\run.bat" "' + PROJECT_PATH + '\\cordova\\run.bat" /Y'); -exec('%comspec% /c copy "'+ROOT+'\\bin\\templates\\cordova\\version.bat" "' + PROJECT_PATH + '\\cordova\\version.bat" /Y'); - -// interpolate the activity name and package -Log("Updating AndroidManifest.xml and Main Activity..."); -replaceInFile(ACTIVITY_PATH, /__ACTIVITY__/, ACTIVITY); -replaceInFile(ACTIVITY_PATH, /__ID__/, PACKAGE); - -replaceInFile(MANIFEST_PATH, /__ACTIVITY__/, ACTIVITY); -replaceInFile(MANIFEST_PATH, /__PACKAGE__/, PACKAGE); -replaceInFile(MANIFEST_PATH, /__APILEVEL__/, API_LEVEL); - -replaceInFile(STRINGS_PATH, new RegExp('>' + SAFE_ACTIVITY + '<'), '>' + ACTIVITY + '<'); \ No newline at end of file diff --git a/bin/lib/check_reqs.js b/bin/lib/check_reqs.js new file mode 100644 index 00000000..eb0c4776 --- /dev/null +++ b/bin/lib/check_reqs.js @@ -0,0 +1,85 @@ +#!/usr/bin/env node + +/* + 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 shell = require('shelljs'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +// Get valid target from framework/project.properties +module.exports.get_target = function() { + if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { + // if no target found, we're probably in a project and project.properties is in ROOT. + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } +} + +module.exports.check_ant = function() { + var test = shell.exec('ant -version', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'); + return false; + } + return true; +} + +module.exports.check_java = function() { + if(process.env.JAVA_HOME) { + var test = shell.exec('java', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'); + return false; + } + return true; + } else { + console.error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'); + return false; + } +} + +module.exports.check_android = function() { + var valid_target = this.get_target(); + var targets = shell.exec('android list targets', {silent:true, async:false}); + + if(targets.code > 0 && targets.output.match(/command\snot\sfound/)) { + console.error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'); + return false; + } else if(!targets.output.match(valid_target)) { + console.error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest 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.'); + return false; + } else { + var cmd = 'android update project -p ' + ROOT + ' -t ' + valid_target + ' 1> /dev/null 2>&1'; + var result = shell.exec(cmd, {silent:false, async:true}); + if(result.code > 0) { + console.error('Error updating the Cordova library to work with your Android environment.'); + return false; + } + } + return true; +} + +module.exports.run = function() { + return this.check_ant() && this.check_java && this.check_android(); +} \ No newline at end of file diff --git a/bin/lib/create.js b/bin/lib/create.js new file mode 100755 index 00000000..4a7294c9 --- /dev/null +++ b/bin/lib/create.js @@ -0,0 +1,265 @@ +#!/usr/bin/env node + +/* + 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. +*/ +try { + require.resolve("shelljs"); +} catch(e) { + console.error('Shelljs module was not found, please run \'npm install\' from the bin folder.'); + process.exit(e.code); +} + +var shell = require('shelljs'), + path = require('path'), + fs = require('fs'), + check_reqs = require('./check_reqs'), + ROOT = path.join(__dirname, '..', '..'); + + +/** + * $ create [options] + * + * Creates an android application with the given options. + * + * Options: + * + * - `project_path` {String} Path to the new Cordova android project. + * - `package_name`{String} Package name, following reverse-domain style convention. + * - `project_name` {String} Project name. + */ + +module.exports.run = function(project_path, package_name, project_name) { + + var VERSION = fs.readFileSync(path.join(ROOT, 'VERSION'), 'utf-8'); + var project_template_dir = path.join(ROOT, 'bin', 'templates', 'project'); + + // Set default values for path, package and name + project_path = typeof project_path !== 'undefined' ? project_path : "CordovaExample"; + package_name = typeof package_name !== 'undefined' ? package_name : 'my.cordova.project'; + project_name = typeof project_name !== 'undefined' ? project_name : 'CordovaExample'; + + var safe_activity_name = project_name.replace(/\W/, ''); + var package_as_path = package_name.replace(/\./g, path.sep); + var activity_dir = path.join(project_path, 'src', package_as_path); + var activity_path = path.join(activity_dir, safe_activity_name + '.java'); + var target_api = check_reqs.get_target(); + var strings_path = path.join(project_path, 'res', 'values', 'strings.xml'); + var manifest_path = path.join(project_path, 'AndroidManifest.xml'); + + // Check if project already exists + if(fs.existsSync(project_path)) { + console.error('Project already exists! Delete and recreate'); + process.exit(2); + } + + // Check that requirements are met and proper targets are installed + if(!check_reqs.run()) { + console.error('Please make sure you meeet the software requirements in order to build an android cordova project'); + process.exit(2); + } + + // Log the given values for the project + console.log('Creating Cordova project for the Android platform :'); + console.log('\tPath : ' + path.relative(process.cwd(), project_path)); + console.log('\tPackage : ' + package_name); + console.log('\tName : ' + project_name); + console.log('\tAndroid target : ' + target_api); + + // build from source. distro should have these files + if(!fs.existsSync(path.join(ROOT, 'cordova-' + VERSION + '.jar')) && fs.existsSync(path.join(ROOT, 'framework'))) { + console.log('Building jar and js files...'); + // update the cordova-android framework for the desired target + exec('android update project --target ' + target_api + ' --path ' + path.join(ROOT, 'framework')); + + // compile cordova.js and cordova.jar + var cwd = process.cwd(); + process.chdir(path.join(ROOT, 'framework')); + exec('ant jar'); + process.chdir(cwd); + } + + // create new android project + var create_cmd = 'android create project --target "'+target_api+'" --path "'+path.relative(process.cwd(), project_path)+'" --package "'+package_name+'" --activity "'+safe_activity_name+'"'; + exec(create_cmd); + + console.log('Copying template files...'); + + // copy project template + shell.cp('-r', path.join(project_template_dir, 'assets'), project_path); + shell.cp('-r', path.join(project_template_dir, 'res'), project_path); + + // copy cordova.js, cordova.jar and res/xml + if(fs.existsSync(path.join(ROOT, 'framework'))) { + shell.cp('-r', path.join(ROOT, 'framework', 'res', 'xml'), path.join(project_path, 'res')); + shell.cp(path.join(ROOT, 'framework', 'assets', 'www', 'cordova.js'), path.join(project_path, 'assets', 'www', 'cordova.js')); + shell.cp(path.join(ROOT, 'framework', 'cordova-' + VERSION + '.jar'), path.join(project_path, 'libs', 'cordova-' + VERSION + '.jar')); + } else { + shell.cp('-r', path.join(ROOT, 'xml'), path.join(project_path, 'res')); + shell.cp(path.join(ROOT, 'cordova.js'), path.join(project_path, 'assets', 'www', 'cordova.js')); + shell.cp(path.join(ROOT, 'cordova-' + VERSION + '.jar'), path.join(project_path, 'libs', 'cordova-' + VERSION + '.jar')); + } + + // interpolate the activity name and package + shell.mkdir('-p', activity_dir); + shell.cp('-f', path.join(project_template_dir, 'Activity.java'), activity_path); + replaceInFile(activity_path, /__ACTIVITY__/, safe_activity_name); + replaceInFile(activity_path, /__ID__/, package_name); + + // interpolate the app name into strings.xml + replaceInFile(strings_path, />Cordova' + project_name + '<'); + + shell.cp('-f', path.join(project_template_dir, 'AndroidManifest.xml'), manifest_path); + replaceInFile(manifest_path, /__ACTIVITY__/, safe_activity_name); + replaceInFile(manifest_path, /__PACKAGE__/, package_name); + replaceInFile(manifest_path, /__APILEVEL__/, target_api.split('-')[1]); + + var cordova_path = path.join(ROOT, 'bin', 'templates', 'cordova'); + // create app info jar + if(!fs.existsSync(path.join(cordova_path, 'appinfo.jar'))) { + console.log('Creating appinfo.jar...'); + var cwd = process.cwd(); + process.chdir(path.join(cordova_path, 'ApplicationInfo')); + exec('javac ApplicationInfo.java'); + exec('jar -cfe ' + path.join(cordova_path, 'appinfo.jar') + ' ApplicationInfo ApplicationInfo.class'); + process.chdir(cwd); + } + + // creating cordova folder and copying run/build/log/launch/check_reqs scripts + var lib_path = path.join(cordova_path, 'lib'); + shell.mkdir(path.join(project_path, 'cordova')); + shell.mkdir(path.join(project_path, 'cordova', 'lib')); + + shell.cp(path.join(cordova_path, 'appinfo.jar'), path.join(project_path, 'cordova', 'appinfo.jar')); + shell.cp(path.join(cordova_path, 'build'), path.join(project_path, 'cordova', 'build')); + shell.chmod(755, path.join(project_path, 'cordova', 'build')); + shell.cp(path.join(cordova_path, 'clean'), path.join(project_path, 'cordova', 'clean')); + shell.chmod(755, path.join(project_path, 'cordova', 'clean')); + shell.cp(path.join(cordova_path, 'log'), path.join(project_path, 'cordova', 'log')); + shell.chmod(755, path.join(project_path, 'cordova', 'log')); + shell.cp(path.join(cordova_path, 'run'), path.join(project_path, 'cordova', 'run')); + shell.chmod(755, path.join(project_path, 'cordova', 'run')); + shell.cp(path.join(cordova_path, 'version'), path.join(project_path, 'cordova', 'version')); + shell.chmod(755, path.join(project_path, 'cordova', 'version')); + shell.cp(path.join(ROOT, 'bin', 'check_reqs'), path.join(project_path, 'cordova', 'check_reqs')); + shell.chmod(755, path.join(project_path, 'cordova', 'check_reqs')); + + shell.cp(path.join(lib_path, 'build.js'), path.join(project_path, 'cordova', 'lib', 'build.js')); + shell.cp(path.join(ROOT, 'bin', 'lib', 'check_reqs.js'), path.join(project_path, 'cordova', 'lib', 'check_reqs.js')); + shell.cp(path.join(lib_path, 'clean.js'), path.join(project_path, 'cordova', 'lib', 'clean.js')); + shell.cp(path.join(lib_path, 'device.js'), path.join(project_path, 'cordova', 'lib', 'device.js')); + shell.cp(path.join(lib_path, 'emulator.js'), path.join(project_path, 'cordova', 'lib', 'emulator.js')); + shell.cp(path.join(lib_path, 'log.js'), path.join(project_path, 'cordova', 'lib', 'log.js')); + shell.cp(path.join(lib_path, 'run.js'), path.join(project_path, 'cordova', 'lib', 'run.js')); + shell.cp(path.join(lib_path, 'version.js'), path.join(project_path, 'cordova', 'lib', 'version.js')); + shell.cp(path.join(lib_path, 'install-device'), path.join(project_path, 'cordova', 'lib', 'install-device')); + shell.chmod(755, path.join(project_path, 'cordova', 'lib', 'install-device')); + shell.cp(path.join(lib_path, 'install-emulator'), path.join(project_path, 'cordova', 'lib', 'install-emulator')); + shell.chmod(755, path.join(project_path, 'cordova', 'lib', 'install-emulator')); + shell.cp(path.join(lib_path, 'list-devices'), path.join(project_path, 'cordova', 'lib', 'list-devices')); + shell.chmod(755, path.join(project_path, 'cordova', 'lib', 'list-devices')); + shell.cp(path.join(lib_path, 'list-emulator-images'), path.join(project_path, 'cordova', 'lib', 'list-emulator-images')); + shell.chmod(755, path.join(project_path, 'cordova', 'lib', 'list-emulator-images')); + shell.cp(path.join(lib_path, 'list-started-emulators'), path.join(project_path, 'cordova', 'lib', 'list-started-emulators')); + shell.chmod(755, path.join(project_path, 'cordova', 'lib', 'list-started-emulators')); + shell.cp(path.join(lib_path, 'start-emulator'), path.join(project_path, 'cordova', 'lib', 'start-emulator')); + shell.chmod(755, path.join(project_path, 'cordova', 'lib', 'start-emulator')); + + // if on windows, copy .bat scripts + // TODO : make these not nessesary, they clutter the scripting folder. + if(process.platform == 'win32' || process.platform == 'win64') { + shell.cp(path.join(cordova_path, 'build.bat'), path.join(project_path, 'cordova', 'build.bat')); + shell.cp(path.join(cordova_path, 'clean.bat'), path.join(project_path, 'cordova', 'clean.bat')); + shell.cp(path.join(cordova_path, 'log.bat'), path.join(project_path, 'cordova', 'log.bat')); + shell.cp(path.join(cordova_path, 'run.bat'), path.join(project_path, 'cordova', 'run.bat')); + shell.cp(path.join(cordova_path, 'version.bat'), path.join(project_path, 'cordova', 'version.bat')); + shell.cp(path.join(ROOT, 'bin', 'check_reqs.bat'), path.join(project_path, 'cordova', 'check_reqs.bat')); + + // lib scripts + shell.cp(path.join(lib_path, 'install-device.bat'), path.join(project_path, 'cordova', 'lib', 'install-device.bat')); + shell.cp(path.join(lib_path, 'install-emulator.bat'), path.join(project_path, 'cordova', 'lib', 'install-emulator.bat')); + shell.cp(path.join(lib_path, 'list-devices.bat'), path.join(project_path, 'cordova', 'lib', 'list-devices.bat')); + shell.cp(path.join(lib_path, 'list-emulator-images.bat'), path.join(project_path, 'cordova', 'lib', 'list-emulator-images.bat')); + shell.cp(path.join(lib_path, 'list-started-emulators.bat'), path.join(project_path, 'cordova', 'lib', 'list-started-emulators.bat')); + shell.cp(path.join(lib_path, 'start-emulator.bat'), path.join(project_path, 'cordova', 'lib', 'start-emulator.bat')); + } + + // copy node related files + shell.cp(path.join(ROOT, 'bin', 'package.json'), path.join(project_path, 'cordova', 'package.json')); + shell.cp('-r', path.join(ROOT, 'bin', 'node_modules'), path.join(project_path, 'cordova')); + + /* + * HELPER FUNCTIONS + */ + + function exec(command) { + var result; + try { + result = shell.exec(command, {silent:false, async:false}); + } catch(e) { + console.error('Command error on execuation : ' + command); + console.error(e); + process.exit(2); + } + if(result && result.code > 0) { + console.error('Command failed to execute : ' + command); + console.error(result.output); + process.exit(2); + } else { + return result; + } + } + + function replaceInFile(filename, regex, replacement) { + write(filename, read(filename).replace(regex, replacement)); + } + + function read(filename) { + if(fs.existsSync(filename)) { + if(fs.lstatSync(filename).isFile()) { + return fs.readFileSync(filename, 'utf-8'); + } else { + console.error('Uanble to read directory : ' + filename); + process.exit(1); + } + } else { + console.error('Uanble to read file, not found : ' + filename); + process.exit(1); + } + } + + function write(filename, content) { + fs.writeFileSync(filename, content, 'utf-8'); + } +} + +/** + * Usage information. + **/ + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'bin', 'create')) + ' '); + console.log('Make sure the Android SDK tools folder is in your PATH!'); + console.log(' : Path to your new Cordova Android project'); + console.log(' : Package name, following reverse-domain style convention'); + console.log(' : Project name'); + process.exit(0); +} + + + diff --git a/bin/package.json b/bin/package.json new file mode 100644 index 00000000..cceb1517 --- /dev/null +++ b/bin/package.json @@ -0,0 +1,32 @@ +{ + "name": "cordova-android", + "description": "Cordova tooling for the android platform.", + "version": "0.0.0", + "homepage": "http://github.com/apache/cordova-android", + "repository": { + "type": "git", + "url": "https://git-wip-us.apache.org/repos/asf/cordova-andorid.git" + }, + "keywords": [ + "cli", + "cordova", + "tooling" + ], + "engineStrict": "true", + "engines": { + "node": ">=0.10.0" + }, + "dependencies": { + "shelljs" : "0.1.4" + }, + "devDependencies": { + }, + "optionalDependencies": { + }, + "author": { + "name": "Benn Mapes", + "email": "bennmapes@gmail.com" + }, + "contributors": [ + ] +} \ No newline at end of file diff --git a/bin/templates/cordova/build b/bin/templates/cordova/build index 5ba36c0c..752945f2 100755 --- a/bin/templates/cordova/build +++ b/bin/templates/cordova/build @@ -1,39 +1,35 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_PATH=$( cd "$DIR/.." && pwd ) +/* + 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 -if [[ "$#" -eq 1 ]] ; then - if [[ $1 == "--debug" ]] ; then - $DIR/clean - ant debug -f "$PROJECT_PATH"/build.xml - elif [[ $1 == "--release" ]] ; then - $DIR/clean - ant release -f "$PROJECT_PATH"/build.xml - elif [[ $1 == "--nobuild" ]] ; then - echo "Skipping build..." - else - echo "Error : Build command '$1' not recognized." - exit 2 - fi -else - echo "Warning : [ --debug | --release | --nobuild ] not specified, defaulting to --debug" - $DIR/clean - ant debug -f "$PROJECT_PATH"/build.xml -fi + 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 build = require('./lib/build'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Support basic help commands +if(args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + build.help(); +} else if(reqs.run()) { + build.run(args[2]); + process.exit(0); +} else { + process.exit(2); +} \ No newline at end of file diff --git a/bin/templates/cordova/build.bat b/bin/templates/cordova/build.bat index 392f374a..2f317e3b 100644 --- a/bin/templates/cordova/build.bat +++ b/bin/templates/cordova/build.bat @@ -14,5 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -%~dp0\cordova.bat build %* +SET script_path="%~dp0build" +IF EXIST %script_path% ( + node "%script_path%" %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'build' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/clean b/bin/templates/cordova/clean index b943b471..6b72e71b 100755 --- a/bin/templates/cordova/clean +++ b/bin/templates/cordova/clean @@ -1,22 +1,34 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_PATH=$( cd "$DIR/.." && pwd ) -echo "Cleaning project..." -ant -f "$PROJECT_PATH/build.xml" clean +/* + 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 clean = require('./lib/clean'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + clean.help(); +} else if(reqs.run()) { + clean.run(); + process.exit(0); +} else { + process.exit(2); +} \ No newline at end of file diff --git a/bin/templates/cordova/clean.bat b/bin/templates/cordova/clean.bat index 643c8d59..fa1f669a 100644 --- a/bin/templates/cordova/clean.bat +++ b/bin/templates/cordova/clean.bat @@ -14,5 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -%~dp0\cordova.bat clean %* +SET script_path="%~dp0clean" +IF EXIST %script_path% ( + node "%script_path%" %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'clean' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/cordova.bat b/bin/templates/cordova/cordova.bat deleted file mode 100644 index 6235fdb7..00000000 --- a/bin/templates/cordova/cordova.bat +++ /dev/null @@ -1,31 +0,0 @@ -:: 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. -@ECHO OFF -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\lib\cordova.js %* //nologo -GOTO END -:MISSING -ECHO Missing one of the following: -ECHO JDK: http://java.oracle.com -ECHO Android SDK: http://developer.android.com -ECHO Apache ant: http://ant.apache.org -EXIT /B 1 -:END diff --git a/bin/templates/cordova/lib/build.js b/bin/templates/cordova/lib/build.js new file mode 100644 index 00000000..84e4e02b --- /dev/null +++ b/bin/templates/cordova/lib/build.js @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +/* + 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 shell = require('shelljs'), + clean = require('./clean'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Builds the project with ant. + */ +module.exports.run = function(build_type) { + //default build type + build_type = typeof build_type !== 'undefined' ? build_type : "--debug"; + var cmd; + switch(build_type) { + case '--debug' : + clean.run(); + cmd = 'ant debug -f ' + path.join(ROOT, 'build.xml'); + break; + case '--release' : + clean.run(); + cmd = 'ant release -f ' + path.join(ROOT, 'build.xml'); + break; + case '--nobuild' : + console.log('Skipping build...'); + break; + default : + console.error('Build option \'' + build_type + '\' not recognized.'); + process.exit(2); + break; + } + if(cmd) { + var result = shell.exec(cmd, {silent:false, async:false}); + if(result.code > 0) { + console.error('ERROR: Failed to build android project.'); + console.error(result.output); + process.exit(2); + } + } +} + +/* + * Gets the path to the apk file, if not such file exists then + * the script will error out. (should we error or just return undefined?) + */ +module.exports.get_apk = function() { + if(fs.existsSync(path.join(ROOT, 'bin'))) { + var bin_files = fs.readdirSync(path.join(ROOT, 'bin')); + for (file in bin_files) { + if(path.extname(bin_files[file]) == '.apk') { + return path.join(ROOT, 'bin', bin_files[file]); + } + } + console.error('ERROR : No .apk found in \'bin\' folder'); + process.exit(2); + } else { + console.error('ERROR : unable to find project bin folder, could not locate .apk'); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'corodva', 'build')) + ' [build_type]'); + console.log('Build Types : '); + console.log(' \'--debug\': Default build, will build project in using ant debug'); + console.log(' \'--release\': will build project using ant release'); + console.log(' \'--nobuild\': will skip build process (can be used with run command)'); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/clean.js b/bin/templates/cordova/lib/clean.js new file mode 100644 index 00000000..579a5fa1 --- /dev/null +++ b/bin/templates/cordova/lib/clean.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + 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 shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Cleans the project using ant + */ +module.exports.run = function() { + var cmd = 'ant clean -f ' + path.join(ROOT, 'build.xml'); + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to clean android project.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), process.argv[1])); + console.log('Cleans the project directory.'); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/cordova.js b/bin/templates/cordova/lib/cordova.js deleted file mode 100644 index 2d0195af..00000000 --- a/bin/templates/cordova/lib/cordova.js +++ /dev/null @@ -1,612 +0,0 @@ -// 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'); -//device_id for targeting specific device -var device_id; -//build types -var NONE = 0, - DEBUG = '--debug', - RELEASE = '--release', - NO_BUILD = '--nobuild'; -var build_type = NONE; - -//deploy tpyes -var NONE = 0, - EMULATOR = 1, - DEVICE = 2, - TARGET = 3; -var deploy_type = NONE; - - -// 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 version(path) { - var cordovajs_path = path + "\\assets\\www\\cordova.js"; - if(fso.FileExists(cordovajs_path)) { - var f = fso.OpenTextFile(cordovajs_path, 1,2); - var cordovajs = f.ReadAll(); - f.Close(); - var version_regex = /^.*CORDOVA_JS_BUILD_LABEL.*$/m; - var version_line = cordovajs.match(version_regex) + ""; - var version = version_line.match(/(\d+)\.(\d+)\.(\d+)(rc\d)?/) + ""; - // TODO : figure out why this isn't matching properly so we can remove this substring workaround. - Log(version.substr(0, ((version.length/2) -1))); - } else { - Log("Error : Could not find cordova js.", true); - Log("Expected Location : " + cordovajs_path, 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() { - 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'); - var count = 0; - var output = ''; - for (i in emulators) { - // Find the line with the emulator name. - if (emulators[i].match(/Name\:/)) { - // strip description - var emulator_name = emulators[i].replace(/\s*Name\:\s/, '') + ' '; - avd_list.push(emulator_name); - } - } - } - 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 '); - Log('\'list-emulator-images\''); - Log(' to get the name of an emulator and then start the emulator with'); - Log('\'start-emulator \''); - } -} - -function create_emulator() { - //get targets - var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s\d+/g); - if(targets) { - exec('%comspec% /c android create avd --name cordova_emulator --target ' + targets[targets.length - 1].replace(/id: /, "")); - } else { - Log("You do not have any android targets setup. Please create at least one target with the `android` command so that an emulator can be created.", true); - WScript.Quit(69); - } -} - -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.Exec("%comspec% /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.length == 0) { - 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 get the ID - Log('Waiting for emulator...'); - var boot_anim = null; - var emulator_ID = null; - var new_started = null; - var i = 0; - while(emulator_ID == null && i < 10) { - new_started = get_started_emulators(); - if(new_started.length > started_emulators.length) { - // 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; - } - } - } - } - if (i == 10) { - Log('\nEmulator start timed out.'); - WScript.Quit(2); - } - i = 0; - WScript.Stdout.Write('Booting up emulator (this may take a while).'); - // use boot animation property to tell when boot is complete. - while (!boot_anim.output.match(/stopped/) && i < 100) { - 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!'); - // Unlock the device - shell.Exec("%comspec% /c adb -s " + emulator_ID + " shell input keyevent 82"); - } else { - Log('\nEmulator boot timed out. Failed to load emulator'); - WScript.Quit(2); - } - } -} - -function get_apk(path) { - // check if file .apk has been created - if (fso.FolderExists(path + '\\bin')) { - var path_to_apk; - var out_folder = fso.GetFolder(path + '\\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) { - return path_to_apk; - } - 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_device(path) { - 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); - } - launch(path, devices[0].split(' ', 1)[0], true); -} - -function install_emulator(path) { - 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); - } - launch(path, emulators[0].split(' ', 1)[0], false); -} - -function install_target(path) { - if(device_id) { - var device = false; - var emulators = get_started_emulators(); - var devices = get_devices(); - var exists = false; - for (i in emulators) { - if (emulators[i].substr(0,device_id.length) == device_id) { - exists = true; - break; - } - } - for (i in devices) { - if (devices[i].substr(0,device_id.length) == device_id) { - exists = true; - device = true - break; - } - } - if (!exists) { - Log("Error : Unable to find target " + device_id, true); - Log("Please ensure the target exists by checking \'\\cordova\\lib\\list-started-emulators'"); - Log(" Or \'\\cordova\\lib\\list-devices'"); - } - launch(path, device_id, device); - } - else { - Log("You cannot install to a target without providing a valid target ID.", true); - WScript.Quit(2); - } -} - -function launch(path, id, device) { - if(id) { - var path_to_apk = get_apk(path); - if (path_to_apk) { - var launch_name = exec_out("%comspec% /c java -jar "+path+"\\cordova\\appinfo.jar "+path+"\\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); - } - if (device) { - // install on device (-d) - Log("Installing app on device..."); - } else { - // install on emulator (-e) - Log("Installing app on emulator..."); - } - var cmd = '%comspec% /c adb -s ' + id + ' 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); - } - // launch the application - Log("Launching application..."); - cmd = '%comspec% /c adb -s ' + id + ' 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("You cannot install to a target without providing a valid target ID.", true); - WScript.Quit(2); - } -} - -function clean(path) { - Log("Cleaning project..."); - exec("%comspec% /c ant.bat clean -f "+path+"\\build.xml 2>&1"); -} - -function log() { - // filter out nativeGetEnabledTags spam from latest sdk bug. - shell.Run("%comspec% /c adb logcat | grep -v nativeGetEnabledTags"); -} - -function build(path) { - switch (build_type) { - case DEBUG : - clean(path); - Log("Building project..."); - exec_verbose("%comspec% /c ant.bat debug -f "+path+"\\build.xml 2>&1"); - break; - case RELEASE : - clean(path); - Log("Building project..."); - exec_verbose("%comspec% /c ant.bat release -f "+path+"\\build.xml 2>&1"); - break; - case NO_BUILD : - Log("Skipping build process."); - break; - case NONE : - clean(path); - Log("WARNING: [ --debug | --release | --nobuild ] not specified, defaulting to --debug."); - exec_verbose("%comspec% /c ant.bat debug -f "+path+"\\build.xml 2>&1"); - break; - default : - Log("Build option not recognized: " + build_type, true); - WScript.Quit(2); - break; - } -} - -function run(path) { - switch(deploy_type) { - case EMULATOR : - build(path); - if(get_started_emulators().length == 0) { - start_emulator(); - } - //TODO : Start emulator if one isn't started, and create one if none exists. - install_emulator(path); - break; - case DEVICE : - build(path); - install_device(path); - break; - case TARGET : - build(path); - install_target(path); - break; - case NONE : - if (get_devices().length > 0) { - Log("WARNING: [ --target= | --emulator | --device ] not specified, defaulting to --device"); - deploy_type = DEVICE; - } else { - Log("WARNING: [ --target= | --emulator | --device ] not specified, defaulting to --emulator"); - deploy_type = EMULATOR; - } - run(path); - break; - default : - Log("Deploy option not recognized: " + deploy_type, true); - WScript.Quit(2); - break; - } -} - - -var args = WScript.Arguments; -if (args.count() == 0) { - Log("Error: no args provided."); - WScript.Quit(2); -} -else { - // parse command - switch(args(0)) { - case "version" : - version(ROOT); - break; - case "build" : - if(args.Count() > 1) { - if (args(1) == "--release") { - build_type = RELEASE; - } - else if (args(1) == "--debug") { - build_type = DEBUG; - } - else if (args(1) == "--nobuild") { - build_type = NO_BUILD; - } - else { - Log('Error: \"' + args(i) + '\" is not recognized as a build option', true); - WScript.Quit(2); - } - } - build(ROOT); - break; - case "clean" : - clean(); - break; - case "log" : - log(); - break; - case "list-devices" : - list_devices(); - break; - case "list-emulator-images" : - list_emulator_images(); - break; - case "list-started-emulators" : - list_started_emulators(); - break; - case "start-emulator" : - if (args.Count() > 1) { - start_emulator(args(1)) - } else { - start_emulator(); - } - break; - case "install-emulator" : - if (args.Count() == 2) { - if (args(1).substr(0,9) == "--target=") { - device_id = args(1).split('--target=').join(''); - install_emulator(ROOT); - } else { - Log('Error: \"' + args(1) + '\" is not recognized as an install option', true); - WScript.Quit(2); - } - } else { - install_emulator(ROOT); - } - break; - case "install-device" : - if (args.Count() == 2) { - if (args(1).substr(0,9) == "--target=") { - device_id = args(1).split('--target=').join(''); - install_target(ROOT); - } else { - Log('Error: \"' + args(1) + '\" is not recognized as an install option', true); - WScript.Quit(2); - } - } else { - install_device(ROOT); - } - break; - case "run" : - //parse args - for(var i = 1; i < args.Count(); i++) { - if (args(i) == "--release") { - build_type = RELEASE; - } - else if (args(i) == "--debug") { - build_type = DEBUG; - } - else if (args(i) == "--nobuild") { - build_type = NO_BUILD; - } - else if (args(i) == "--emulator" || args(i) == "-e") { - deploy_type = EMULATOR; - } - else if (args(i) == "--device" || args(i) == "-d") { - deploy_type = DEVICE; - } - else if (args(i).substr(0,9) == "--target=") { - device_id = args(i).split("--target=").join(""); - deploy_type = TARGET; - } - else { - Log('Error: \"' + args(i) + '\" is not recognized as a run option', true); - WScript.Quit(2); - } - } - run(ROOT); - break; - default : - Log("Cordova does not regognize the command " + args(0), true); - WScript.Quit(2); - break; - } -} - diff --git a/bin/templates/cordova/lib/device.js b/bin/templates/cordova/lib/device.js new file mode 100644 index 00000000..900baf43 --- /dev/null +++ b/bin/templates/cordova/lib/device.js @@ -0,0 +1,101 @@ +#!/usr/bin/env node + +/* + 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 shell = require('shelljs'), + path = require('path'), + build = require('./build'), + exec = require('child_process').exec, + ROOT = path.join(__dirname, '..', '..'); + +/** + * Returns a list of the device ID's found + */ +module.exports.list = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var device_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/\w+\tdevice/) && !response[i].match(/emulator/)) { + device_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return device_list; + } +} + +/* + * Installs a previously built application on the device + * and launches it. + */ +module.exports.install = function(target) { + var device_list = this.list(); + if (device_list.length > 0) { + // default device + target = typeof target !== 'undefined' ? target : device_list[0]; + if (device_list.indexOf(target) > -1) { + var apk_path = build.get_apk(); + var cmd = 'java -jar ' + path.join(ROOT, 'cordova', 'appinfo.jar') + ' ' + path.join(ROOT, 'AndroidManifest.xml'); + var launch_name = shell.exec(cmd, {silent:true, async:false}); + if (launch_name.error) { + console.log('ERROR : Failed to get application name from appinfo.jar + AndroidManifest : '); + console.log("Output : " + launch_name.output); + process.exit(2); + } + + console.log('Installing app on device...'); + cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {silent:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to device : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output.replace('\r', '').replace('\n', ''); + var launch = shell.exec(cmd, {silent:true, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LANCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to device.'); + process.exit(2); + } + } else { + console.error('ERROR : Failed to deploy to device, no devices found.'); + process.exit(2); + } +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/emulator.js b/bin/templates/cordova/lib/emulator.js new file mode 100644 index 00000000..579c898f --- /dev/null +++ b/bin/templates/cordova/lib/emulator.js @@ -0,0 +1,342 @@ +#!/usr/bin/env node + +/* + 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 shell = require('shelljs'), + path = require('path'), + build = require('./build'), + ROOT = path.join(__dirname, '..', '..'), + new_emulator = 'cordova_emulator'; + +/** + * Returns a list of emulator images in the form of objects + * { + name : , + path : , + target : , + abi : , + skin : + } + */ +module.exports.list_images = function() { + var cmd = 'android list avds'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/\(API\slevel\s/)) { + i++; + img_obj['target'] = response[i].replace('\r', ''); + } + if (response[i + 1].match(/ABI:\s/)) { + i++; + img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + }*/ + + } + return emulator_list; + } +} + +/** + * Will return the closest avd to the projects target + * or undefined if no avds exist. + */ +module.exports.best_image = function() { + var project_target = this.get_target().replace('android-', ''); + var images = this.list_images(); + var closest = 9999; + var best = images[0]; + for (i in images) { + var target = images[i].target; + if(target) { + var num = target.split('(API level ')[1].replace(')', ''); + if (num == project_target) { + return images[i]; + } else if (project_target - num < closest && project_target > num) { + var closest = project_target - num; + best = images[i]; + } + } + } + return best; +} + +module.exports.list_started = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var started_emulator_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/device/) && response[i].match(/emulator/)) { + started_emulator_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return started_emulator_list; + } +} + +module.exports.get_target = function() { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); +} + +module.exports.list_targets = function() { + var target_out = shell.exec('android list targets', {silent:true, async:false}).output.split('\n'); + var targets = []; + for (var i = target_out.length; i >= 0; i--) { + if(target_out[i].match(/id:/)) { + targets.push(targets[i].split(' ')[1]); + } + } + return targets; +} + +/* + * Starts an emulator with the given ID, + * and returns the started ID of that emulator. + * If no ID is given it will used the first image availible, + * if no image is availible it will error out (maybe create one?). + */ +module.exports.start = function(emulator_ID) { + var started_emulators = this.list_started(); + var num_started = started_emulators.length; + if (typeof emulator_ID === 'undefined') { + var emulator_list = this.list_images(); + if (emulator_list.length > 0) { + emulator_ID = this.best_image().name; + console.log('WARNING : no emulator specified, defaulting to ' + emulator_ID); + } else { + console.error('ERROR : No emulator images (avds) found, if you would like to create an'); + console.error(' avd follow the instructions provided here : '); + console.error(' http://developer.android.com/tools/devices/index.html') + console.error(' Or run \'android create avd --name --target \' '); + console.error(' in on the command line.'); + process.exit(2); + /*console.log('WARNING : no emulators availible, creating \'' + new_emulator + '\'.'); + this.create_image(new_emulator, this.get_target()); + emulator_ID = new_emulator;*/ + } + } + + var pipe_null = (process.platform == 'win32' || process.platform == 'win64'? '> NUL' : '> /dev/null'); + var cmd = 'emulator -avd ' + emulator_ID + ' ' + pipe_null + ' &'; + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = '%comspec% /c start cmd /c ' + cmd; + } + var result = shell.exec(cmd, {silent:true, async:false}, function(code, output) { + if (code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + console.error(output); + process.exit(2); + } + }); + + // wait for emulator to start + console.log('Waiting for emulator...'); + var new_started = this.wait_for_emulator(num_started); + var emulator_id; + if (new_started.length > 1) { + for (i in new_started) { + console.log(new_started[i]); + console.log(started_emulators.indexOf(new_started[i])); + if (started_emulators.indexOf(new_started[i]) < 0) { + emulator_id = new_started[i]; + } + } + } else { + emulator_id = new_started[0]; + } + if (!emulator_id) { + console.error('ERROR : Failed to start emulator, could not find new emulator'); + process.exit(2); + } + + //wait for emulator to boot up + process.stdout.write('Booting up emulator (this may take a while)...'); + this.wait_for_boot(emulator_id); + console.log('BOOT COMPLETE'); + + //unlock screen + cmd = 'adb -s ' + emulator_id + ' shell input keyevent 82'; + shell.exec(cmd, {silent:false, async:false}); + + //return the new emulator id for the started emulators + return emulator_id; +} + +/* + * Waits for the new emulator to apear on the started-emulator list. + */ +module.exports.wait_for_emulator = function(num_running) { + var new_started = this.list_started(); + if (new_started.length > num_running) { + return new_started; + } else { + this.sleep(1); + return this.wait_for_emulator(num_running); + } +} + +/* + * Waits for the boot animation property of the emulator to switch to 'stopped' + */ +module.exports.wait_for_boot = function(emulator_id) { + var cmd; + // ShellJS opens a lot of file handles, and the default on OS X is too small. + // TODO : This is not working, need to find a better way to increese the ulimit. + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = 'adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } else { + cmd = 'ulimit -S -n 4096; adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } + var boot_anim = shell.exec(cmd, {silent:true, async:false}); + if (boot_anim.output.match(/stopped/)) { + return; + } else { + process.stdout.write('.'); + this.sleep(3); + return this.wait_for_boot(emulator_id); + } +} + +/* + * TODO : find a better way to wait for the emulator (maybe using async methods?) + */ +module.exports.sleep = function(time_sec) { + if (process.platform == 'win32' || process.platform == 'win64') { + shell.exec('ping 127.0.0.1 -n ' + time_sec, {silent:true, async:false}); + } else { + shell.exec('sleep ' + time_sec, {silent:true, async:false}); + } +} + +/* + * Create avd + * TODO : Enter the stdin input required to complete the creation of an avd. + */ +module.exports.create_image = function(name, target) { + console.log('Creating avd named ' + name); + if (target) { + var cmd = 'android create avd --name ' + name + ' --target ' + target; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(' Do you have the latest android targets including ' + target + '?'); + console.error(create.output); + process.exit(2); + } + } else { + console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); + var cmd = 'android create avd --name ' + name + ' --target ' + this.list_targets()[0]; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(create.output); + process.exit(2); + } + console.error('ERROR : Unable to create an avd emulator, no targets found.'); + console.error('Please insure you have targets availible by runing the "android" command'). + process.exit(2); + } +} + +/* + * Installs a previously built application on the emulator and launches it. + * If no target is specified, then it picks one. + * If no started emulators are found, error out. + */ +module.exports.install = function(target) { + var emulator_list = this.list_started(); + if (emulator_list.length < 1) { + console.error('ERROR : No started emulators found, please start an emultor before deploying your project.'); + process.exit(2); + /*console.log('WARNING : No started emulators found, attemting to start an avd...'); + this.start(this.best_image().name);*/ + } + // default emulator + target = typeof target !== 'undefined' ? target : emulator_list[0]; + if (emulator_list.indexOf(target) > -1) { + console.log('Installing app on emulator...'); + var apk_path = build.get_apk(); + var cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {sient:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to emulator : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + cmd = 'java -jar ' + path.join(ROOT, 'cordova', 'appinfo.jar') + ' ' + path.join(ROOT, 'AndroidManifest.xml'); + var launch_name = shell.exec(cmd, {silent:true, async:false}); + if (launch_name.error) { + console.log('ERROR : Failed to get application name from appinfo.jar + AndroidManifest : '); + console.log("Output : " + launch_name.output); + process.exit(2); + } + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launch_name.output.replace('\r', '').replace('\n', ''); + console.log(cmd); + var launch = shell.exec(cmd, {silent:false, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LANCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to emulator.'); + process.exit(2); + } +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/install-device b/bin/templates/cordova/lib/install-device index e70bef7d..cf53918b 100755 --- a/bin/templates/cordova/lib/install-device +++ b/bin/templates/cordova/lib/install-device @@ -1,49 +1,38 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_PATH=$( cd "$DIR/../.." && pwd ) -device_list=$("$DIR/list-devices") -if [ $? != 0 ]; then - echo "No devices found to deploy to. Please make sure your device is connected" - echo " and you can view it using the 'cordova/lib/list-devices' command." - exit 2 -fi +/* + 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 -apks=`find $PROJECT_PATH/bin -type f -maxdepth 1 | egrep '\.apk$'` -apk_list=($apks) -if [[ ${#apk_list[@]} > 0 ]] ; then - # handle target - read -ra device_array <<< "$device_list" - if [[ "$#" -eq 1 ]] ; then - # deploy to given target - target=${1/--target=/} - else - # delete trailing space and 'device' after device ID - target=${device_array[0]} - fi - echo "Installing ${apk_list[0]} onto device $target..." - adb -s $target install -r ${apk_list[0]}; - echo "Launching application..." - launch_str=$(java -jar "$PROJECT_PATH"/cordova/appinfo.jar "$PROJECT_PATH"/AndroidManifest.xml) - adb -s $target shell am start -W -a android.intent.action.MAIN -n $launch_str -else - echo "Application package not found, could not install to device" - echo " make sure your application is built before deploying." - exit 2 -fi + 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 device = require('./device'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + device.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + device.install(); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/install-device.bat b/bin/templates/cordova/lib/install-device.bat index b00e757b..ac7214ac 100644 --- a/bin/templates/cordova/lib/install-device.bat +++ b/bin/templates/cordova/lib/install-device.bat @@ -14,12 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -SET full_path=%~dp0 -IF EXIST %full_path%cordova.js ( - cscript "%full_path%cordova.js" install-device %* //nologo +SET script_path="%~dp0install-device" +IF EXIST %script_path% ( + node "%script_path%" %* ) ELSE ( - ECHO. - ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + ECHO. + ECHO ERROR: Could not find 'install-device' script in 'cordova\lib' folder, aborting...>&2 EXIT /B 1 -) +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/install-emulator b/bin/templates/cordova/lib/install-emulator index d4bffa45..70421be5 100755 --- a/bin/templates/cordova/lib/install-emulator +++ b/bin/templates/cordova/lib/install-emulator @@ -1,50 +1,38 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_PATH=$( cd "$DIR/../.." && pwd ) -emulator_list=$("$DIR/list-started-emulators") -if [ $? != 0 ]; then - echo "No emulators found to deploy to. Please make sure your emulator is started" - echo " You can view it using the 'cordova/lib/list-started-emulators' command." - echo " You can view created emulator images using the 'cordova/lib/list-emulator-images' command." - echo " You can start an emulator image using the 'cordova/lib/start-emulator' command." - exit 2 -fi +/* + 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 -apks=`find $PROJECT_PATH/bin -type f -maxdepth 1 | egrep '\.apk$'` -apk_list=($apks) -if [[ ${#apk_list[@]} > 0 ]] ; then - # handle target emulator - if [[ "$#" -eq 1 ]] ; then - # deploy to given target - target=${1/--target=/} - else - # delete trailing space and 'device' after emulator ID - target=${emulator_list[0]} - fi - echo "Installing ${apk_list[0]} onto emulator $target..." - adb -s $target install -r ${apk_list[0]}; - echo "Launching application..." - launch_str=$(java -jar "$PROJECT_PATH"/cordova/appinfo.jar "$PROJECT_PATH"/AndroidManifest.xml) - adb -s $target shell am start -W -a android.intent.action.MAIN -n $launch_str -else - echo "Application package not found, could not install to device" - echo " make sure your application is built before deploying." - exit 2 -fi + 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 emulator = require('./emulator'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.install(); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/install-emulator.bat b/bin/templates/cordova/lib/install-emulator.bat index 2b886304..1ec67790 100644 --- a/bin/templates/cordova/lib/install-emulator.bat +++ b/bin/templates/cordova/lib/install-emulator.bat @@ -14,12 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -SET full_path=%~dp0 -IF EXIST %full_path%cordova.js ( - cscript "%full_path%cordova.js" install-emulator %* //nologo +SET script_path="%~dp0install-emulator" +IF EXIST %script_path% ( + node "%script_path%" %* ) ELSE ( - ECHO. - ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + ECHO. + ECHO ERROR: Could not find 'install-emulator' script in 'cordova\lib' folder, aborting...>&2 EXIT /B 1 -) +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/list-devices b/bin/templates/cordova/lib/list-devices index 86d00548..bdd0abd5 100755 --- a/bin/templates/cordova/lib/list-devices +++ b/bin/templates/cordova/lib/list-devices @@ -1,30 +1,28 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep -v 'emulator' | awk '{ print $1; }'` -device_list=($devices) -if [[ ${#device_list[@]} > 0 ]] ; then - for i in ${devices[@]} - do - echo $i - done - exit 0 -else - echo "No devices found." - exit 2 -fi +/* + 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 devices = require('./device'); + +// Usage support for when args are given +var device_list = devices.list(); +for(device in device_list) { + console.log(device_list[device]); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/list-devices.bat b/bin/templates/cordova/lib/list-devices.bat index 3840d129..c0bcdd9a 100644 --- a/bin/templates/cordova/lib/list-devices.bat +++ b/bin/templates/cordova/lib/list-devices.bat @@ -14,12 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -SET full_path=%~dp0 -IF EXIST %full_path%cordova.js ( - cscript "%full_path%cordova.js" list-devices //nologo +SET script_path="%~dp0list-devices" +IF EXIST %script_path% ( + node "%script_path%" %* ) ELSE ( - ECHO. - ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + ECHO. + ECHO ERROR: Could not find 'list-devices' script in 'cordova\lib' folder, aborting...>&2 EXIT /B 1 -) +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/list-emulator-images b/bin/templates/cordova/lib/list-emulator-images index 202d0e58..69f47899 100755 --- a/bin/templates/cordova/lib/list-emulator-images +++ b/bin/templates/cordova/lib/list-emulator-images @@ -1,32 +1,29 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -emulator_images=`android list avds | grep "Name:" | cut -f 2 -d ":"` -emulator_list=($emulator_images) -if [[ ${#emulator_list[@]} > 0 ]] ; then - for i in ${emulator_list[@]} - do - echo $i - done - exit 0 -else - echo "No emulators found, if you would like to create an emulator follow the instructions" - echo " provided here : http://developer.android.com/tools/devices/index.html" - echo " Or run 'android create avd --name --target ' in on the command line." - exit 2 -fi +/* + 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 emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_images(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator].name); + process.exit(0); +} \ 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 index e21aafe9..661cbf95 100644 --- a/bin/templates/cordova/lib/list-emulator-images.bat +++ b/bin/templates/cordova/lib/list-emulator-images.bat @@ -14,12 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -SET full_path=%~dp0 -IF EXIST %full_path%cordova.js ( - cscript "%full_path%cordova.js" list-emulator-images //nologo +SET script_path="%~dp0list-emulator-images" +IF EXIST %script_path% ( + node "%script_path%" %* ) ELSE ( ECHO. - ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + ECHO ERROR: Could not find 'list-emulator-images' script in 'cordova\lib' folder, aborting...>&2 EXIT /B 1 ) diff --git a/bin/templates/cordova/lib/list-started-emulators b/bin/templates/cordova/lib/list-started-emulators index 2aa6e996..3e69b2f1 100755 --- a/bin/templates/cordova/lib/list-started-emulators +++ b/bin/templates/cordova/lib/list-started-emulators @@ -1,32 +1,29 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print $1;}}' | grep 'emulator' | grep -v 'offline'` -read -ra emulator_list <<< "$devices" -if [[ ${#emulator_list[@]} > 0 ]] ; then - for i in ${emulator_list[@]} - do - # remove space and 'device' - echo $i - done - exit 0 -else - echo "No started emulators found (it may still be booting up), you can start an emulator by using the command" - echo " 'cordova/lib/start-emulator'" - exit 2 -fi +/* + 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 emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_started(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator]); + process.exit(0); +} \ 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 index eb9f3b62..a4e88f7d 100644 --- a/bin/templates/cordova/lib/list-started-emulators.bat +++ b/bin/templates/cordova/lib/list-started-emulators.bat @@ -14,12 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -SET full_path=%~dp0 -IF EXIST %full_path%cordova.js ( - cscript "%full_path%cordova.js" list-started-emulators //nologo +SET script_path="%~dp0list-started-emulators" +IF EXIST %script_path% ( + node "%script_path%" %* ) ELSE ( - ECHO. - ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + ECHO. + ECHO ERROR: Could not find 'list-started-emulators' script in 'cordova\lib' folder, aborting...>&2 EXIT /B 1 -) +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/log.js b/bin/templates/cordova/lib/log.js new file mode 100644 index 00000000..ff14e469 --- /dev/null +++ b/bin/templates/cordova/lib/log.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + 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 shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Starts running logcat in the shell. + */ +module.exports.run = function() { + var cmd = 'adb logcat | grep -v nativeGetEnabledTags'; + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to run logcat command.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'corodva', 'log'))); + console.log('Gives the logcat output on the command line.'); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/run.js b/bin/templates/cordova/lib/run.js new file mode 100644 index 00000000..b1c8b2b9 --- /dev/null +++ b/bin/templates/cordova/lib/run.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +/* + 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 path = require('path'), + build = require('./build'), + emulator = require('./emulator'), + device = require('./device'); + +/* + * Runs the application on a device if availible. + * If not device is found, it will use a started emulator. + * If no started emulators are found it will attempt to start an avd. + * If no avds are found it will error out. + */ + module.exports.run = function(args) { + var build_type; + var install_target; + + for (var i=2; i -1) { + device.install(install_target); + } else if (started_emulators.indexOf(install_target) > -1) { + emulator.install(install_target); + } else { + // if target emulator isn't started, then start it. + var emulator_ID; + for(avd in avds) { + if(avds[avd].name == install_target) { + emulator_ID = emulator.start(install_target); + emulator.install(emulator_ID); + break; + } + } + if(!emulator_ID) { + console.error('ERROR : Target \'' + install_target + '\' not found, unalbe to run project'); + process.exit(2); + } + } + } else { + // no target given, deploy to device if availible, otherwise use the emulator. + var device_list = device.list(); + if (device_list.length > 0) { + console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); + device.install(device_list[0]) + } else { + var emulator_list = emulator.list_started(); + if (emulator_list.length > 0) { + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_list[0] + '\'.'); + emulator.install(emulator_list[0]); + } else { + console.log('WARNING : No started emulators found, starting an emulator.'); + var best_avd = emulator.best_image(); + if(best_avd) { + var emulator_ID = emulator.start(best_avd.name); + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_ID + '\'.'); + emulator.install(emulator_ID); + } else { + emulator.start(); + } + } + } + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), args[0]) + ' [options]'); + console.log('Build options :'); + console.log(' --debug : Builds project in debug mode'); + console.log(' --release : Builds project in release mode'); + console.log(' --nobuild : Runs the currently built project without recompiling'); + console.log('Deploy options :'); + console.log(' --device : Will deploy the built project to a device'); + console.log(' --emulator : Will deploy the built project to an emulator if one exists'); + console.log(' --target= : Installs to the target with the specified id.'); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/start-emulator b/bin/templates/cordova/lib/start-emulator index c7ce01a6..8ea6d3f5 100755 --- a/bin/templates/cordova/lib/start-emulator +++ b/bin/templates/cordova/lib/start-emulator @@ -1,111 +1,38 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_PATH=$( cd "$( dirname "$0" )/../.." && pwd ) +/* + 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 -function dot { - sleep 1 - echo -n "." -} + http://www.apache.org/licenses/LICENSE-2.0 -function wait_for_emulator() { - local emulator_log_path="$1" - local error_string - local status + 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. +*/ - # Try to detect fatal errors early - sleep 1.5 - error_string=$(grep -F "ERROR: " ${emulator_log_path}) - status=$? +var emulator = require('./emulator'), + args = process.argv; - if [ $status -eq 0 ]; then - echo "Emulator failed to start, fatal error detected" - echo "Error: ${error_string}" - echo "Full log available at: ${emulator_log_path}" - echo "Exiting..." - exit 1 - fi - - local i="0" - echo -n "Waiting for emulator" - emulator_string=$($DIR/list-started-emulators) - while [ $? != 0 ] - do - dot - i=$[i+1] - emulator_string=$($DIR/list-started-emulators) - done - read -ra target <<< "$emulator_string" - echo "" - echo -n "Waiting for it to boot up (this can take a while)" - while [ $i -lt 300 ] - do - boot_anim=$(adb -s $target shell getprop init.svc.bootanim 2>&1) - if [[ "$boot_anim" =~ "stopped" ]] ; then - break - else - i=$[i+1] - dot - fi - done - # Device timeout: emulator has not started in time - if [ $i -eq 300 ] - then - echo "" - echo "Emulator timeout!" - exit 69 - else - echo "" - echo "Connected!" - fi - # Unlock the device - adb -s $target shell input keyevent 82 - exit 0 -} - -emulator_images=$("$DIR/list-emulator-images") -if [ $? != 0 ]; then - echo "No emulators found, if you would like to create an emulator follow the instructions" - echo " provided here : http://developer.android.com/tools/devices/index.html" - echo " Or run 'android create avd --name --target ' in on the command line." - exit 2 -fi - -# start first emulator -log_path=$(mktemp -t android_emulator) - -# if target emulator is provided -if [[ "$#" -eq 1 ]] ; then - # check that it exists - if [[ $emulator_images =~ $1 ]] ; then - #xterm -e emulator -avd $1 & - emulator -avd $1 1> "${log_path}" 2>&1 & - else - echo "Could not find the provided emulator '$1', make sure the emulator exists" - echo " by checking 'cordova/lib/list-emulator-images'" - exit 2 - fi -else - read -ra emulator_list <<< "$emulator_images" - #xterm -e emulator -avd ${emulator_list[0]} & - emulator -avd ${emulator_list[0]} 1> "${log_path}" 2>&1 & -fi - -echo "Saving emulator log to: ${log_path}" -wait_for_emulator "$log_path" +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.start(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.start(); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/lib/start-emulator.bat b/bin/templates/cordova/lib/start-emulator.bat index 758c854c..9329d951 100644 --- a/bin/templates/cordova/lib/start-emulator.bat +++ b/bin/templates/cordova/lib/start-emulator.bat @@ -14,12 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -SET full_path=%~dp0 -IF EXIST %full_path%cordova.js ( - cscript "%full_path%cordova.js" start-emulator %* //nologo +SET script_path="%~dp0start-emulator" +IF EXIST %script_path% ( + node "%script_path%" %* ) ELSE ( - ECHO. - ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 + ECHO. + ECHO ERROR: Could not find 'start-emulator' script in 'cordova\lib' folder, aborting...>&2 EXIT /B 1 -) +) \ No newline at end of file diff --git a/bin/templates/cordova/lib/version.js b/bin/templates/cordova/lib/version.js new file mode 100644 index 00000000..f28b6728 --- /dev/null +++ b/bin/templates/cordova/lib/version.js @@ -0,0 +1,53 @@ +#!/usr/bin/env node + +/* + 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 shell = require('shelljs'), + fs = require('fs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Displays the version, gotten from cordova.js + */ +module.exports.run = function() { + var cordovajs_path = path.join(ROOT, 'assets', 'www', 'cordova.js'); + if (fs.existsSync(cordovajs_path)) { + var version_line = shell.grep(/^.*CORDOVA_JS_BUILD_LABEL.*$/, cordovajs_path); + var version = version_line.match(/(\d+)\.(\d+)\.(\d+)(rc\d)?/)[0]; + if (version) { + console.log(version); + return version; + } else { + console.error("ERROR : Unable to find version in cordova.js"); + process.exit(2); + } + } else { + console.error("ERROR : Could not find cordova.js"); + console.error('Expected Location : ' + cordovajs_path); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'corodva', 'version'))); + console.log('Returns the version of Cordova.'); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/log b/bin/templates/cordova/log index f8df9cc4..514f69c6 100755 --- a/bin/templates/cordova/log +++ b/bin/templates/cordova/log @@ -1,20 +1,33 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -# filter out nativeGetEnabledTags spam from latest sdk bug. -adb logcat | grep -v nativeGetEnabledTags +/* + 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 log = require('./lib/log'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + log.help(); +} else if(reqs.run()) { + log.run(); +} else { + process.exit(2); +} \ No newline at end of file diff --git a/bin/templates/cordova/log.bat b/bin/templates/cordova/log.bat index c2598026..875982f2 100644 --- a/bin/templates/cordova/log.bat +++ b/bin/templates/cordova/log.bat @@ -14,5 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -%~dp0\cordova.bat log %* +SET script_path="%~dp0log" +IF EXIST %script_path% ( + node "%script_path%" %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'log' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/run b/bin/templates/cordova/run index 47720589..c3a5772d 100755 --- a/bin/templates/cordova/run +++ b/bin/templates/cordova/run @@ -1,81 +1,35 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_PATH=$( cd "$DIR/.." && pwd ) +/* + 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 -function run_on_device_or_emulator { - devices=`$DIR/lib/list-devices` - if [ $? = 0 ]; then - $DIR/lib/install-device - else - run_on_emulator - fi -} + http://www.apache.org/licenses/LICENSE-2.0 -function run_on_emulator { - emulators=`$DIR/lib/list-started-emulators` - if [ $? = 0 ] ; then - $DIR/lib/install-emulator - else - images=`$DIR/lib/list-emulator-images` - if [ $? = 0 ] ; then - $DIR/lib/start-emulator - $DIR/lib/install-emulator - else - echo "No devices/emulators started nor images available to start. How are we supposed to do this, then?" - exit 2 - fi - fi -} + 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 run = require('./lib/run'), + reqs = require('./lib/check_reqs'), + args = process.argv; - -if [[ "$#" -eq 2 ]] ; then - # TODO: the order of arguments here may be reversed from the assumption below - $DIR/build $2 - if [[ $1 == "--device" ]] ; then - $DIR/lib/install-device - elif [[ $1 == "--emulator" ]] ; then - run_on_emulator - elif [[ $1 =~ "--target=" ]]; then - $DIR/lib/install-device $1 - else - echo "Error : '$1' is not recognized as an install option" - fi -elif [[ "$#" -eq 1 ]] ; then - if [[ $1 == "--debug" || $1 == "--release" || $1 == "--nobuild" ]] ; then - $DIR/build $1 - run_on_device_or_emulator - elif [[ $1 == "--device" ]] ; then - $DIR/build - $DIR/lib/install-device - elif [[ $1 == "--emulator" ]] ; then - $DIR/build - run_on_emulator - elif [[ $1 =~ "--target=" ]]; then - $DIR/build - $DIR/lib/install-device $1 - else - echo "Error : '$1' is not recognized as an install option" - fi -else - echo "Warning : [ --device | --emulate | --target= ] not specified, using defaults." - $DIR/build - run_on_device_or_emulator -fi +// Support basic help commands +if (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + run.help(); +} else if(reqs.run()) { + run.run(args); + process.exit(0); +} else { + process.exit(2); +} \ No newline at end of file diff --git a/bin/templates/cordova/run.bat b/bin/templates/cordova/run.bat index f191f675..0aad8535 100644 --- a/bin/templates/cordova/run.bat +++ b/bin/templates/cordova/run.bat @@ -14,5 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -%~dp0\cordova.bat run %* +SET script_path="%~dp0run" +IF EXIST %script_path% ( + node "%script_path%" %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'run' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/bin/templates/cordova/version b/bin/templates/cordova/version index 0ba14579..f280e13b 100755 --- a/bin/templates/cordova/version +++ b/bin/templates/cordova/version @@ -1,19 +1,31 @@ -#!/bin/bash -# 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. +#!/usr/bin/env node -echo "3.1.0-dev" +/* + 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 version = require('./lib/version'); +var args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + version.help(); +} else { + console.log(version.run()); + process.exit(0); +} \ No newline at end of file diff --git a/bin/templates/cordova/version.bat b/bin/templates/cordova/version.bat index e70769f7..d589002d 100644 --- a/bin/templates/cordova/version.bat +++ b/bin/templates/cordova/version.bat @@ -14,5 +14,13 @@ :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. + @ECHO OFF -%~dp0\cordova.bat version %* \ No newline at end of file +SET script_path="%~dp0version" +IF EXIST %script_path% ( + node "%script_path%" %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'version' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +)