Return-Path: X-Original-To: apmail-cordova-commits-archive@www.apache.org Delivered-To: apmail-cordova-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 56CFB11B77 for ; Wed, 18 Jun 2014 17:07:37 +0000 (UTC) Received: (qmail 18548 invoked by uid 500); 18 Jun 2014 17:07:37 -0000 Delivered-To: apmail-cordova-commits-archive@cordova.apache.org Received: (qmail 18513 invoked by uid 500); 18 Jun 2014 17:07:37 -0000 Mailing-List: contact commits-help@cordova.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cordova.apache.org Delivered-To: mailing list commits@cordova.apache.org Received: (qmail 18421 invoked by uid 99); 18 Jun 2014 17:07:37 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Jun 2014 17:07:37 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id E703583BEFB; Wed, 18 Jun 2014 17:07:36 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: kamrik@apache.org To: commits@cordova.apache.org Date: Wed, 18 Jun 2014 17:07:37 -0000 Message-Id: In-Reply-To: <51c871c7748243349bceeaac02747b68@git.apache.org> References: <51c871c7748243349bceeaac02747b68@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] git commit: CB-6973: Fix JSHint errors in src/cordova/*.js CB-6973: Fix JSHint errors in src/cordova/*.js Add JSHint config comment in all the files (sometimes with tweaks) /* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, indent:4, unused:vars, latedef:nofunc */ JSHint is now happy for all of src/cordova/*.js (not including metadata/*.js). Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/6748b0a6 Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/6748b0a6 Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/6748b0a6 Branch: refs/heads/master Commit: 6748b0a65ada025debcd881cc2cc30dc74d1383f Parents: fb41e64 Author: Mark Koudritsky Authored: Wed Jun 18 10:57:54 2014 -0400 Committer: Mark Koudritsky Committed: Wed Jun 18 13:07:07 2014 -0400 ---------------------------------------------------------------------- cordova-lib/src/cordova/build.js | 6 +- cordova-lib/src/cordova/compile.js | 5 +- cordova-lib/src/cordova/config.js | 6 +- cordova-lib/src/cordova/cordova.js | 7 +- cordova-lib/src/cordova/create.js | 9 +- cordova-lib/src/cordova/emulate.js | 5 +- cordova-lib/src/cordova/hooker.js | 39 +++++--- cordova-lib/src/cordova/info.js | 23 +++-- cordova-lib/src/cordova/platforms.js | 6 +- cordova-lib/src/cordova/plugin.js | 20 ++-- cordova-lib/src/cordova/plugin_parser.js | 8 +- cordova-lib/src/cordova/prepare.js | 126 +++++++++++++------------- cordova-lib/src/cordova/restore.js | 71 ++++++++------- cordova-lib/src/cordova/run.js | 9 +- cordova-lib/src/cordova/save.js | 88 +++++++++--------- cordova-lib/src/cordova/serve.js | 88 ++++++++++-------- cordova-lib/src/cordova/superspawn.js | 6 +- 17 files changed, 291 insertions(+), 231 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/build.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/build.js b/cordova-lib/src/cordova/build.js index 16b31ac..384d9e2 100644 --- a/cordova-lib/src/cordova/build.js +++ b/cordova-lib/src/cordova/build.js @@ -16,8 +16,12 @@ specific language governing permissions and limitations under the License. */ + +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var cordova_util = require('./util'), - Q = require('q'), hooker = require('./hooker'); // Returns a promise. http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/compile.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/compile.js b/cordova-lib/src/cordova/compile.js index 857c3a5..814d3eb 100644 --- a/cordova-lib/src/cordova/compile.js +++ b/cordova-lib/src/cordova/compile.js @@ -17,8 +17,9 @@ under the License. */ -/*global require: true, module: true, process: true*/ -/*jslint sloppy: true, white: true, newcap: true */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ var path = require('path'), cordova_util = require('./util'), http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/config.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/config.js b/cordova-lib/src/cordova/config.js index d0c8d9a..a92b10a 100644 --- a/cordova-lib/src/cordova/config.js +++ b/cordova-lib/src/cordova/config.js @@ -17,6 +17,10 @@ under the License. */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var path = require('path'), fs = require('fs'), url = require('url'), @@ -37,7 +41,7 @@ function config(project_root, opts) { configCache[project_root] = JSON.stringify(json); } return json; -}; +} config.setAutoPersist = function(value) { autoPersist = value; http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/cordova.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/cordova.js b/cordova-lib/src/cordova/cordova.js index b8a494c..95110c9 100644 --- a/cordova-lib/src/cordova/cordova.js +++ b/cordova-lib/src/cordova/cordova.js @@ -16,6 +16,11 @@ specific language governing permissions and limitations under the License. */ + +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var cordova_events = require('../events'); var cordova_util = require('./util'); @@ -45,7 +50,7 @@ exports = module.exports = { exports.findProjectRoot = function(opt_startDir) { return cordova_util.isCordova(opt_startDir); -} +}; // Each of these APIs takes a final parameter that is a callback function. // The callback is passed the error object upon failure, or undefined upon success. http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/create.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/create.js b/cordova-lib/src/cordova/create.js index e5187a4..a5dee41 100644 --- a/cordova-lib/src/cordova/create.js +++ b/cordova-lib/src/cordova/create.js @@ -17,10 +17,13 @@ under the License. */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var path = require('path'), fs = require('fs'), shell = require('shelljs'), - platforms = require('./platforms'), events = require('../events'), config = require('./config'), lazy_load = require('./lazy_load'), @@ -29,8 +32,8 @@ var path = require('path'), ConfigParser = require('../configparser/ConfigParser'), cordova_util = require('./util'); -var DEFAULT_NAME = "HelloCordova", - DEFAULT_ID = "io.cordova.hellocordova"; +var DEFAULT_NAME = 'HelloCordova', + DEFAULT_ID = 'io.cordova.hellocordova'; /** * Usage: http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/emulate.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/emulate.js b/cordova-lib/src/cordova/emulate.js index e45607e..2f23197 100644 --- a/cordova-lib/src/cordova/emulate.js +++ b/cordova-lib/src/cordova/emulate.js @@ -17,8 +17,9 @@ under the License. */ -/*global require: true, module: true, process: true*/ -/*jslint sloppy: true, white: true, newcap: true */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ var cordova_util = require('./util'), path = require('path'), http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/hooker.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/hooker.js b/cordova-lib/src/cordova/hooker.js index 62dde30..1e6fbe4 100644 --- a/cordova-lib/src/cordova/hooker.js +++ b/cordova-lib/src/cordova/hooker.js @@ -16,6 +16,11 @@ specific language governing permissions and limitations under the License. */ + +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var util = require('./util'), fs = require('fs'), os = require('os'), @@ -23,8 +28,7 @@ var util = require('./util'), superspawn = require('./superspawn'), CordovaError = require('../CordovaError'), Q = require('q'), - path = require('path'), - _ = require('underscore'); + path = require('path'); module.exports = function hooker(root) { var r = util.isCordova(root); @@ -33,16 +37,22 @@ module.exports = function hooker(root) { }; // Returns a promise. -module.exports.fire = function global_fire(hook, opts) { +module.exports.fire = global_fire; +function global_fire(hook, opts) { opts = opts || {}; var handlers = events.listeners(hook); return execute_handlers_serially(handlers, opts); -}; +} function compareNumbers(a, b) { - return isNaN (parseInt(a)) - ? a.toLowerCase().localeCompare(b.toLowerCase ? b.toLowerCase(): b) - : parseInt(a) > parseInt(b) ? 1 : parseInt(a) < parseInt(b) ? -1 : 0; + var intA = parseInt(a); + var intB = parseInt(b); + if ( isNaN(intA) ) { + a = a.toLowerCase(); + b = b.toLowerCase ? b.toLowerCase() : b; + return a.localeCompare(b); + } + return intA == intB ? 0 : intA > intB ? 1 : -1; } module.exports.prototype = { @@ -75,12 +85,13 @@ module.exports.prototype = { }; function extractSheBangInterpreter(fullpath) { - var hookFd = fs.openSync(fullpath, "r"); + var hookFd = fs.openSync(fullpath, 'r'); + var fileData, octetsRead, fileChunk; try { // this is a modern cluster size. no need to read less - var fileData = new Buffer (4096); - var octetsRead = fs.readSync(hookFd, fileData, 0, 4096, 0); - var fileChunk = fileData.toString(); + fileData = new Buffer (4096); + octetsRead = fs.readSync(hookFd, fileData, 0, 4096, 0); + fileChunk = fileData.toString(); } finally { fs.closeSync(hookFd); } @@ -94,9 +105,9 @@ function extractSheBangInterpreter(fullpath) { hookCmd = shebangMatch[1]; // Likewise, make /usr/bin/bash work like "bash". if (hookCmd) - shMatch = hookCmd.match(/bin\/((?:ba)?sh)$/) + shMatch = hookCmd.match(/bin\/((?:ba)?sh)$/); if (shMatch) - hookCmd = shMatch[1] + hookCmd = shMatch[1]; return hookCmd; } @@ -153,7 +164,7 @@ function execute_handlers_serially(handlers, opts) { if (handlers.length) { // Chain the handlers in series. return handlers.reduce(function(soFar, f) { - return soFar.then(function() { return f(opts) }); + return soFar.then(function() { return f(opts); }); }, Q()); } else { return Q(); // Nothing to do. http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/info.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/info.js b/cordova-lib/src/cordova/info.js index 48011de..8736a1c 100644 --- a/cordova-lib/src/cordova/info.js +++ b/cordova-lib/src/cordova/info.js @@ -15,7 +15,11 @@ software distributed under the License is distributed on an KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - */ +*/ + +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ /* A utility funciton to help output the information needed @@ -70,15 +74,14 @@ module.exports = function info() { //Get Platforms information getPlatforms(projectRoot) ]).then(function(promises) { - promises.forEach(function(p) { - output += p.state === 'fulfilled' ? p.value + '\n\n' : p.reason + '\n\n'; + promises.forEach(function(p) { + output += p.state === 'fulfilled' ? p.value + '\n\n' : p.reason + '\n\n'; + }); + console.info(output); + fs.writeFile(path.join(projectRoot, 'info.txt'), output, 'utf-8', function (err) { + if (err) throw err; + }); }); - console.info(output); - fs.writeFile(path.join(projectRoot, 'info.txt'), output, 'utf-8', function (err) { - if (err) - throw err; - }); - }); }; function getPlatforms(projectRoot) { @@ -87,7 +90,7 @@ function getPlatforms(projectRoot) { return Q.all(platforms.map(function(p) { return getPlatformInfo(p, projectRoot); })).then(function(outs) { - return outs.join('\n\n'); + return outs.join('\n\n'); }); } return Q.reject('No Platforms Currently Installed'); http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/platforms.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/platforms.js b/cordova-lib/src/cordova/platforms.js index d9a1514..5ada624 100644 --- a/cordova-lib/src/cordova/platforms.js +++ b/cordova-lib/src/cordova/platforms.js @@ -17,6 +17,10 @@ under the License. */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + module.exports = { 'ios' : { hostos : ['darwin'], @@ -35,7 +39,7 @@ module.exports = { url : 'https://git-wip-us.apache.org/repos/asf?p=cordova-ubuntu.git', version: '3.5.0' }, - 'amazon-fireos' : { + 'amazon-fireos' : { parser : './metadata/amazon_fireos_parser', url : 'https://git-wip-us.apache.org/repos/asf?p=cordova-amazon-fireos.git', version: '3.5.0' http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/plugin.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/plugin.js b/cordova-lib/src/cordova/plugin.js index 8541b21..8a792b9 100644 --- a/cordova-lib/src/cordova/plugin.js +++ b/cordova-lib/src/cordova/plugin.js @@ -17,7 +17,9 @@ under the License. */ -/* jshint node: true */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ var cordova_util = require('./util'), path = require('path'), @@ -29,12 +31,12 @@ var cordova_util = require('./util'), ConfigParser = require('../configparser/ConfigParser'), fs = require('fs'), PluginInfo = require('../PluginInfo'), + plugman = require('../plugman/plugman'), events = require('../events'); // Returns a promise. module.exports = function plugin(command, targets, opts) { - var projectRoot = cordova_util.cdProjectRoot(), - err; + var projectRoot = cordova_util.cdProjectRoot(); // Dance with all the possible call signatures we've come up over the time. They can be: // 1. plugin() -> list the plugins @@ -113,16 +115,13 @@ module.exports = function plugin(command, targets, opts) { // Fetch the plugin first. events.emit('verbose', 'Calling plugman.fetch on plugin "' + target + '"'); - var plugman = require('../plugman/plugman'); return plugman.raw.fetch(target, pluginsDir, { searchpath: searchPath, noregistry: opts.noregistry}); }) .then(function(dir) { // Iterate (in serial!) over all platforms in the project and install the plugin. return platformList.reduce(function(soFar, platform) { return soFar.then(function() { - var platforms = require('./platforms'); var platformRoot = path.join(projectRoot, 'platforms', platform), - parser = new platforms[platform].parser(platformRoot), options = { cli_variables: opts.cli_variables || {}, searchpath: searchPath, @@ -136,7 +135,7 @@ module.exports = function plugin(command, targets, opts) { // Keeping for now for compatibility for API users. //parse variables into cli_variables for (i=0; i< opts.options.length; i++) { - if (opts.options[i] === "--variable" && typeof opts.options[++i] === "string") { + if (opts.options[i] === '--variable' && typeof opts.options[++i] === 'string') { tokens = opts.options[i].split('='); key = tokens.shift().toUpperCase(); if (/^[\w-_]+$/.test(key)) { @@ -154,7 +153,6 @@ module.exports = function plugin(command, targets, opts) { }).then(function() { return hooks.fire('after_plugin_add', opts); }); - break; case 'rm': case 'remove': if (!targets || !targets.length) { @@ -168,7 +166,6 @@ module.exports = function plugin(command, targets, opts) { return Q.reject(new CordovaError('Plugin "' + target + '" is not present in the project. See `'+cordova_util.binname+' plugin list`.')); } - var targetPath = path.join(pluginPath, target); // Iterate over all installed platforms and uninstall. // If this is a web-only or dependency-only plugin, then // there may be nothing to do here except remove the @@ -177,8 +174,6 @@ module.exports = function plugin(command, targets, opts) { return platformList.reduce(function(soFar, platform) { return soFar.then(function() { var platformRoot = path.join(projectRoot, 'platforms', platform); - var platforms = require('./platforms'); - var parser = new platforms[platform].parser(platformRoot); //check if plugin is restorable and warn var configPath = cordova_util.projectConfig(projectRoot); if(fs.existsSync(configPath)){//should not happen with real life but needed for tests @@ -199,7 +194,6 @@ module.exports = function plugin(command, targets, opts) { }).then(function() { return hooks.fire('after_plugin_rm', opts); }); - break; case 'search': return hooks.fire('before_plugin_search') .then(function() { @@ -212,8 +206,6 @@ module.exports = function plugin(command, targets, opts) { }).then(function() { return hooks.fire('after_plugin_search'); }); - case 'ls': - case 'list': default: return list(projectRoot, hooks); } http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/plugin_parser.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/plugin_parser.js b/cordova-lib/src/cordova/plugin_parser.js index d86536b..38eaebc 100644 --- a/cordova-lib/src/cordova/plugin_parser.js +++ b/cordova-lib/src/cordova/plugin_parser.js @@ -16,8 +16,12 @@ specific language governing permissions and limitations under the License. */ -var xml = require('../util/xml-helpers'), - fs = require('fs'); + +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + +var xml = require('../util/xml-helpers'); function plugin_parser(xmlPath) { this.path = xmlPath; http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/prepare.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/prepare.js b/cordova-lib/src/cordova/prepare.js index fadb39c..be48c51 100644 --- a/cordova-lib/src/cordova/prepare.js +++ b/cordova-lib/src/cordova/prepare.js @@ -16,11 +16,15 @@ specific language governing permissions and limitations under the License. */ + +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var cordova_util = require('./util'), ConfigParser = require('../configparser/ConfigParser'), path = require('path'), platforms = require('./platforms'), - platform = require('./platform'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), @@ -28,8 +32,7 @@ var cordova_util = require('./util'), lazy_load = require('./lazy_load'), events = require('../events'), Q = require('q'), - plugman = require('../plugman/plugman'), - util = require('util'); + plugman = require('../plugman/plugman'); // Returns a promise. exports = module.exports = function prepare(options) { @@ -64,18 +67,18 @@ exports = module.exports = function prepare(options) { return lazy_load.based_on_config(projectRoot, platform) .then(function(libDir) { var parser = new platforms[platform].parser(platformPath), - defaults_xml_path = path.join(platformPath, "cordova", "defaults.xml"); + defaults_xml_path = path.join(platformPath, 'cordova', 'defaults.xml'); //If defaults.xml is present, overwrite platform config.xml with it //Otherwise save whatever is there as defaults so it can be restored //or copy project config into platform if none exists if (fs.existsSync(defaults_xml_path)) { - shell.cp("-f", defaults_xml_path, parser.config_xml()); + shell.cp('-f', defaults_xml_path, parser.config_xml()); events.emit('verbose', 'Generating config.xml from defaults for platform "' + platform + '"'); } else { if(fs.existsSync(parser.config_xml())){ - shell.cp("-f", parser.config_xml(), defaults_xml_path); + shell.cp('-f', parser.config_xml(), defaults_xml_path); }else{ - shell.cp("-f",xml,parser.config_xml()); + shell.cp('-f',xml,parser.config_xml()); } } @@ -118,66 +121,61 @@ exports = module.exports = function prepare(options) { }); }; -var BLACKLIST = ["platform"]; -var SINGLETONS = ["content", "author"]; +var BLACKLIST = ['platform']; +var SINGLETONS = ['content', 'author']; function mergeXml(src, dest, platform, clobber) { - if (BLACKLIST.indexOf(src.tag) === -1) { - //Handle attributes - Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) { - if (clobber || !dest.attrib[attribute]) { - dest.attrib[attribute] = src.attrib[attribute]; - } - }); - //Handle text - if (src.text && (clobber || !dest.text)) { - dest.text = src.text; - } - //Handle platform - if (platform) { - src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) { - platformElement.getchildren().forEach(mergeChild); - }); + // Do nothing for blacklisted tags. + if (BLACKLIST.indexOf(src.tag) != -1) return; + + //Handle attributes + Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) { + if (clobber || !dest.attrib[attribute]) { + dest.attrib[attribute] = src.attrib[attribute]; } + }); + //Handle text + if (src.text && (clobber || !dest.text)) { + dest.text = src.text; + } + //Handle platform + if (platform) { + src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) { + platformElement.getchildren().forEach(mergeChild); + }); + } - //Handle children - src.getchildren().forEach(mergeChild); - - function mergeChild (srcChild) { - var srcTag = srcChild.tag, - destChild = new et.Element(srcTag), - foundChild, - query = srcTag + "", - shouldMerge = true; - - if (BLACKLIST.indexOf(srcTag) === -1) { - if (SINGLETONS.indexOf(srcTag) !== -1) { - foundChild = dest.find(query); - if (foundChild) { - destChild = foundChild; - dest.remove(0, destChild); - } - } else { - //Check for an exact match and if you find one don't add - Object.getOwnPropertyNames(srcChild.attrib).forEach(function (attribute) { - query += "[@" + attribute + '="' + srcChild.attrib[attribute] + '"]'; - }); - foundChild = dest.find(query); - if (foundChild && textMatch(srcChild, foundChild)) { - destChild = foundChild; - dest.remove(0, destChild); - shouldMerge = false; - } + //Handle children + src.getchildren().forEach(mergeChild); + + function mergeChild (srcChild) { + var srcTag = srcChild.tag, + destChild = new et.Element(srcTag), + foundChild, + query = srcTag + '', + shouldMerge = true; + + if (BLACKLIST.indexOf(srcTag) === -1) { + if (SINGLETONS.indexOf(srcTag) !== -1) { + foundChild = dest.find(query); + if (foundChild) { + destChild = foundChild; + dest.remove(0, destChild); + } + } else { + //Check for an exact match and if you find one don't add + Object.getOwnPropertyNames(srcChild.attrib).forEach(function (attribute) { + query += '[@' + attribute + '="' + srcChild.attrib[attribute] + '"]'; + }); + foundChild = dest.find(query); + if (foundChild && textMatch(srcChild, foundChild)) { + destChild = foundChild; + dest.remove(0, destChild); + shouldMerge = false; } - - mergeXml(srcChild, destChild, platform, clobber && shouldMerge); - dest.append(destChild); } - } - function textMatch(elm1, elm2) { - var text1 = elm1.text ? elm1.text.replace(/\s+/, "") : "", - text2 = elm2.text ? elm2.text.replace(/\s+/, "") : ""; - return (text1 === "" || text1 === text2); + mergeXml(srcChild, destChild, platform, clobber && shouldMerge); + dest.append(destChild); } } } @@ -185,3 +183,9 @@ function mergeXml(src, dest, platform, clobber) { // Expose for testing. exports._mergeXml = mergeXml; + +function textMatch(elm1, elm2) { + var text1 = elm1.text ? elm1.text.replace(/\s+/, '') : '', + text2 = elm2.text ? elm2.text.replace(/\s+/, '') : ''; + return (text1 === '' || text1 === text2); +} http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/restore.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/restore.js b/cordova-lib/src/cordova/restore.js index 0d56b4a..2ef3f66 100644 --- a/cordova-lib/src/cordova/restore.js +++ b/cordova-lib/src/cordova/restore.js @@ -17,16 +17,20 @@ under the License. */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var cordova_util = require('./util'), ConfigParser = require('../configparser/ConfigParser'), path = require('path'), - xml = require('../util/xml-helpers') Q = require('q'), fs = require('fs'), plugin = require('./plugin'), events = require('../events'); -module.exports = function restore(target){ +module.exports = restore; +function restore(target){ var projectHome = cordova_util.cdProjectRoot(); var configPath = cordova_util.projectConfig(projectHome); var configXml = new ConfigParser(configPath); @@ -35,42 +39,41 @@ module.exports = function restore(target){ //returns a Promise -function installPluginsFromConfigXML(cfg){ - //Install plugins that are listed on config.xml - var pluginsFromConfig = new Array(); - var projectRoot = cordova_util.cdProjectRoot(); - var plugins_dir = path.join(projectRoot, 'plugins'); +function installPluginsFromConfigXML(cfg) { + //Install plugins that are listed on config.xml + var pluginsFromConfig = []; + var projectRoot = cordova_util.cdProjectRoot(); + var plugins_dir = path.join(projectRoot, 'plugins'); - var features = cfg.doc.findall('feature'); - features.forEach(function(feature){ - var params = feature.findall('param'); - var pluginId = ""; - var pluginVersion = ""; - for( var i =0; i < params.length; i++){ - if(params[i].attrib.name === 'id'){ - pluginId = params[i].attrib.value; + var features = cfg.doc.findall('feature'); + features.forEach(function(feature){ + var params = feature.findall('param'); + var pluginId = ''; + var pluginVersion = ''; + for (var i = 0; i < params.length; i++) { + if (params[i].attrib.name === 'id') { + pluginId = params[i].attrib.value; } - if(params[i].attrib.name === 'version'){ - pluginVersion = params[i].attrib.value; + if (params[i].attrib.name === 'version') { + pluginVersion = params[i].attrib.value; } - } - var pluginPath = path.join(plugins_dir,pluginId); - // contents of the plugins folder takes precedence hence - // we ignore if the correct version is installed or not. - if(pluginId !== "" && !fs.existsSync(pluginPath)){ - if( pluginVersion !== ""){ - pluginId = pluginId +"@"+pluginVersion; + } + var pluginPath = path.join(plugins_dir,pluginId); + // contents of the plugins folder takes precedence hence + // we ignore if the correct version is installed or not. + if (pluginId !== '' && !fs.existsSync(pluginPath)) { + if ( pluginVersion !== '') { + pluginId = pluginId + '@' + pluginVersion; } - events.emit('log', "Discovered "+ pluginId + " in config.xml. Installing to the project") + events.emit('log', 'Discovered ' + pluginId + ' in config.xml. Installing to the project'); pluginsFromConfig.push(pluginId); - } - - }) - - //Use cli instead of plugman directly ensuring all the hooks - // to get fired. - if(pluginsFromConfig.length >0){ - return plugin("add",pluginsFromConfig); } - return Q.all("No config.xml plugins to install"); + }); + + //Use cli instead of plugman directly ensuring all the hooks + // to get fired. + if (pluginsFromConfig.length >0) { + return plugin('add', pluginsFromConfig); + } + return Q.all('No config.xml plugins to install'); } http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/run.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/run.js b/cordova-lib/src/cordova/run.js index 424fa58..f1debb6 100644 --- a/cordova-lib/src/cordova/run.js +++ b/cordova-lib/src/cordova/run.js @@ -17,8 +17,9 @@ under the License. */ -/*global require: true, module: true, process: true*/ -/*jslint sloppy: true, white: true, newcap: true */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ var cordova_util = require('./util'), path = require('path'), @@ -28,14 +29,14 @@ var cordova_util = require('./util'), // Returns a promise. module.exports = function run(options) { - var projectRoot = cordova_util.cdProjectRoot(), + var projectRoot = cordova_util.cdProjectRoot(); options = cordova_util.preProcessOptions(options); var hooks = new hooker(projectRoot); return hooks.fire('before_run', options) .then(function() { // Run a prepare first, then shell out to run - return require('./cordova').raw.prepare(options.platforms) + return require('./cordova').raw.prepare(options.platforms); }).then(function() { // Deploy in parallel (output gets intermixed though...) return Q.all(options.platforms.map(function(platform) { http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/save.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/save.js b/cordova-lib/src/cordova/save.js index 8165058..af0460b 100644 --- a/cordova-lib/src/cordova/save.js +++ b/cordova-lib/src/cordova/save.js @@ -17,52 +17,58 @@ under the License. */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + + var cordova_util = require('./util'), ConfigParser = require('../configparser/ConfigParser'), path = require('path'), - xml = require('../util/xml-helpers') + xml = require('../util/xml-helpers'), Q = require('q'), events = require('../events'); -module.exports = function save(target, opts){ - opts = opts || {}; - var projectHome = cordova_util.cdProjectRoot(); - var configPath = cordova_util.projectConfig(projectHome); - var configXml = new ConfigParser(configPath); - var pluginsPath = path.join(projectHome, 'plugins'); - var plugins = cordova_util.findPlugins(pluginsPath); - var features = configXml.doc.findall('./feature/param[@name="id"]/..'); - //clear obsolete features with id params. - for(var i=0; i -1){ - childs.splice(idx,1); - } - } - // persist the removed features here if there are no plugins - // to be added to config.xml otherwise we can delay the - // persist to add feature - if((!plugins || plugins.length<1) && - (features && features.length)){ - configXml.write(); - } - - return Q.all(plugins.map(function(plugin){ - var currentPluginPath = path.join(pluginsPath,plugin); - var name = readPluginName(currentPluginPath); - var id = plugin; - var version = readPluginVersion(currentPluginPath); - var params = [{name:"id", value:id}]; - if(opts.shrinkwrap){ - params.push({name:"version", value: version}); +module.exports = save; +function save(target, opts){ + opts = opts || {}; + var projectHome = cordova_util.cdProjectRoot(); + var configPath = cordova_util.projectConfig(projectHome); + var configXml = new ConfigParser(configPath); + var pluginsPath = path.join(projectHome, 'plugins'); + var plugins = cordova_util.findPlugins(pluginsPath); + var features = configXml.doc.findall('./feature/param[@name="id"]/..'); + //clear obsolete features with id params. + for(var i=0; i -1){ + childs.splice(idx,1); + } + } + // persist the removed features here if there are no plugins + // to be added to config.xml otherwise we can delay the + // persist to add feature + if((!plugins || plugins.length<1) && + (features && features.length)){ + configXml.write(); } - configXml.addFeature(name,params); - configXml.write(); - events.emit('results', 'Saved plugin info for "'+plugin+'" to config.xml'); - return Q(); - })); + + return Q.all(plugins.map(function(plugin){ + var currentPluginPath = path.join(pluginsPath,plugin); + var name = readPluginName(currentPluginPath); + var id = plugin; + var version = readPluginVersion(currentPluginPath); + var params = [{name:'id', value:id}]; + if(opts.shrinkwrap){ + params.push({ name: 'version', value: version }); + } + configXml.addFeature(name,params); + configXml.write(); + events.emit('results', 'Saved plugin info for "'+plugin+'" to config.xml'); + return Q(); + })); } function readPluginName(pluginPath){ @@ -70,9 +76,9 @@ function readPluginName(pluginPath){ var et = xml.parseElementtreeSync(xml_path); var el = et.getroot().find('name'); if(el && el.text){ - return el.text.trim(); + return el.text.trim(); } - return ""; + return ''; } function readPluginVersion(pluginPath){ http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/serve.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/serve.js b/cordova-lib/src/cordova/serve.js index 8a4eb5c..60522d1 100644 --- a/cordova-lib/src/cordova/serve.js +++ b/cordova-lib/src/cordova/serve.js @@ -16,6 +16,11 @@ specific language governing permissions and limitations under the License. */ + +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var cordova_util = require('./util'), crypto = require('crypto'), path = require('path'), @@ -24,56 +29,60 @@ var cordova_util = require('./util'), ConfigParser = require('../configserver/ConfigParser'), hooker = require('./hooker'), fs = require('fs'), - http = require("http"), - url = require("url"), - mime = require("mime"), - zlib = require("zlib"); + http = require('http'), + url = require('url'), + mime = require('mime'), + zlib = require('zlib'); function launchServer(projectRoot, port) { var server = http.createServer(function(request, response) { function do404() { console.log('404 ' + request.url); - response.writeHead(404, {"Content-Type": "text/plain"}); - response.write("404 Not Found\n"); + response.writeHead(404, {'Content-Type': 'text/plain'}); + response.write('404 Not Found\n'); response.end(); } function do302(where) { console.log('302 ' + request.url); - response.setHeader("Location", where); - response.writeHead(302, {"Content-Type": "text/plain"}); + response.setHeader('Location', where); + response.writeHead(302, {'Content-Type': 'text/plain'}); response.end(); } function doRoot() { - response.writeHead(200, {"Content-Type": "text/html"}); + var p; + response.writeHead(200, {'Content-Type': 'text/html'}); var config = new ConfigParser(cordova_util.projectConfig(projectRoot)); - response.write(""+config.name()+""); - response.write(""); - for (var c in {"name": true, "packageName": true, "version": true}) { - response.write(""); + response.write(''+config.name()+''); + response.write('

Package Metadata

"+c+""+config[c]()+"
'); + for (var c in {'name': true, 'packageName': true, 'version': true}) { + response.write(''); } - response.write("

Package Metadata

' + c + '' + config[c]() + '
"); - response.write("

Platforms

    "); + response.write(''); + response.write('

    Platforms

      '); var installed_platforms = cordova_util.listPlatforms(projectRoot); - for (var p in platforms) { + for (p in platforms) { if (installed_platforms.indexOf(p) >= 0) { - response.write("
    • "+p+"
    • \n"); + response.write('
    • ' + p + '
    • \n'); } else { - response.write("
    • "+p+"
    • \n"); + response.write('
    • ' + p + '
    • \n'); } } - response.write("
    "); - response.write("

    Plugins

      "); + response.write('
    '); + response.write('

    Plugins

      '); var pluginPath = path.join(projectRoot, 'plugins'); var plugins = cordova_util.findPlugins(pluginPath); - for (var p in plugins) { - response.write("
    • "+plugins[p]+"
    • \n"); + for (p in plugins) { + response.write('
    • '+plugins[p]+'
    • \n'); } - response.write("
    "); - response.write(""); + response.write('
'); + response.write(''); response.end(); } + var urlPath = url.parse(request.url).pathname; var firstSegment = /\/(.*?)\//.exec(urlPath); + var parser; + if (!firstSegment) { return doRoot(); } @@ -85,7 +94,7 @@ function launchServer(projectRoot, port) { urlPath = urlPath.slice(platformId.length + 1); try { - var parser = new platforms[platformId].parser(path.join(projectRoot, 'platforms', platformId)); + parser = new platforms[platformId].parser(path.join(projectRoot, 'platforms', platformId)); } catch (e) { return do404(); } @@ -99,7 +108,7 @@ function launchServer(projectRoot, port) { } else if (/^\/www\//.test(urlPath)) { filePath = path.join(parser.www_dir(), urlPath.slice(5)); } else if (/^\/+[^\/]*$/.test(urlPath)) { - return do302("/" + platformId + "/www/"); + return do302('/' + platformId + '/www/'); } else { return do404(); } @@ -107,7 +116,7 @@ function launchServer(projectRoot, port) { fs.exists(filePath, function(exists) { if (exists) { if (fs.statSync(filePath).isDirectory()) { - index = path.join(filePath, "index.html"); + var index = path.join(filePath, 'index.html'); try { if (fs.statSync(index)) { filePath = index; @@ -116,26 +125,26 @@ function launchServer(projectRoot, port) { } if (fs.statSync(filePath).isDirectory()) { if (!/\/$/.test(urlPath)) { - return do302("/" + platformId + urlPath + "/"); + return do302('/' + platformId + urlPath + '/'); } console.log('200 ' + request.url); - response.writeHead(200, {"Content-Type": "text/html"}); - response.write("Directory listing of "+ urlPath + ""); - response.write("

Items in this directory

"); + response.writeHead(200, {'Content-Type': 'text/html'}); + response.write('Directory listing of '+ urlPath + ''); + response.write('

Items in this directory

'); var items = fs.readdirSync(filePath); - response.write("
    "); + response.write('
      '); for (var i in items) { var file = items[i]; if (file) { response.write('
    • '+file+'
    • \n'); } } - response.write("
    "); + response.write('
'); response.end(); } else { var mimeType = mime.lookup(filePath); var respHeaders = { - 'Content-Type': mimeType + 'Content-Type': mimeType }; var readStream = fs.createReadStream(filePath); @@ -156,27 +165,28 @@ function launchServer(projectRoot, port) { } }); }).on('listening', function () { - console.log("Static file server running on port " + port + " (i.e. http://localhost:" + port + ")\nCTRL + C to shut down"); + console.log('Static file server running on port ' + port + ' (i.e. http://localhost:' + port + ')\nCTRL + C to shut down'); }).on('error', function (e) { if (e && e.toString().indexOf('EADDRINUSE') !== -1) { port++; server.listen(port); } else { - console.log("An error occured starting static file server: " + e); + console.log('An error occured starting static file server: ' + e); } }).listen(port); return server; } function calculateMd5(fileName) { - var BUF_LENGTH = 64*1024, + var md5sum, + BUF_LENGTH = 64*1024, buf = new Buffer(BUF_LENGTH), bytesRead = BUF_LENGTH, pos = 0, fdr = fs.openSync(fileName, 'r'); try { - var md5sum = crypto.createHash('md5'); + md5sum = crypto.createHash('md5'); while (bytesRead === BUF_LENGTH) { bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); pos += bytesRead; @@ -195,7 +205,7 @@ function processAddRequest(request, response, platformId, projectRoot) { 'configPath': '/' + platformId + '/config.xml', 'wwwPath': '/' + platformId + '/www', 'wwwFileList': shell.find(wwwDir) - .filter(function(a) { return !fs.statSync(a).isDirectory() && !/(^\.)|(\/\.)/.test(a) }) + .filter(function(a) { return !fs.statSync(a).isDirectory() && !/(^\.)|(\/\.)/.test(a); }) .map(function(a) { return {'path': a.slice(wwwDir.length), 'etag': '' + calculateMd5(a)}; }) }; console.log('200 ' + request.url); http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/6748b0a6/cordova-lib/src/cordova/superspawn.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/superspawn.js b/cordova-lib/src/cordova/superspawn.js index 3b14e4b..b35e311 100644 --- a/cordova-lib/src/cordova/superspawn.js +++ b/cordova-lib/src/cordova/superspawn.js @@ -17,6 +17,10 @@ under the License. */ +/* jshint node:true, bitwise:true, undef:true, trailing:true, quotmark:true, + indent:4, unused:vars, latedef:nofunc +*/ + var child_process = require('child_process'); var fs = require('fs'); var path = require('path'); @@ -74,7 +78,7 @@ exports.spawn = function(cmd, args, opts) { // but for things like "del", cmd will do the trick. if (path.extname(cmd) != '.exe' && cmd.indexOf(' ') != -1) { // We need to use /s to ensure that spaces are parsed properly with cmd spawned content - args = [['/s', '/c', '"'+[cmd].concat(args).map(function(a){if (/^[^"].* .*[^"]/.test(a)) return '"'+a+'"'; return a;}).join(" ")+'"'].join(" ")]; + args = [['/s', '/c', '"' + [cmd].concat(args).map(function(a){if (/^[^"].* .*[^"]/.test(a)) return '"' + a + '"'; return a;}).join(' ')+'"'].join(' ')]; cmd = 'cmd'; spawnOpts.windowsVerbatimArguments = true; } else if (!fs.existsSync(cmd)) {