Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id D92E32009A8 for ; Tue, 17 May 2016 22:36:40 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id D7B9A1609F5; Tue, 17 May 2016 20:36:40 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 894E41607A8 for ; Tue, 17 May 2016 22:36:39 +0200 (CEST) Received: (qmail 79042 invoked by uid 500); 17 May 2016 20:36:38 -0000 Mailing-List: contact commits-help@cordova.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list commits@cordova.apache.org Received: (qmail 79033 invoked by uid 99); 17 May 2016 20:36:38 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 17 May 2016 20:36:38 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8493BDFABB; Tue, 17 May 2016 20:36:38 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: rknoll@apache.org To: commits@cordova.apache.org Message-Id: <6a8fa29671844550a89e5ac83271919c@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: android commit: CB-11259: Improving build output Date: Tue, 17 May 2016 20:36:38 +0000 (UTC) archived-at: Tue, 17 May 2016 20:36:41 -0000 Repository: cordova-android Updated Branches: refs/heads/master e9e27ca47 -> 9738079c4 CB-11259: Improving build output This closes #305 Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/9738079c Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/9738079c Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/9738079c Branch: refs/heads/master Commit: 9738079c42994666655b1b251febdd5b16c07c86 Parents: e9e27ca Author: Richard Knoll Authored: Tue May 3 16:25:48 2016 -0700 Committer: Richard Knoll Committed: Tue May 17 13:31:12 2016 -0700 ---------------------------------------------------------------------- bin/lib/create.js | 2 +- bin/templates/cordova/lib/Adb.js | 8 +++---- bin/templates/cordova/lib/AndroidManifest.js | 2 +- bin/templates/cordova/lib/build.js | 6 +++--- .../cordova/lib/builders/AntBuilder.js | 2 +- bin/templates/cordova/lib/emulator.js | 14 ++++++------- bin/templates/cordova/lib/pluginHandlers.js | 22 ++++++++++++-------- bin/templates/cordova/lib/prepare.js | 21 +++++++++++-------- bin/templates/cordova/lib/run.js | 2 +- framework/cordova.gradle | 2 +- spec/unit/pluginHandlers/common.spec.js | 9 ++++---- 11 files changed, 49 insertions(+), 41 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/lib/create.js ---------------------------------------------------------------------- diff --git a/bin/lib/create.js b/bin/lib/create.js index d8def89..251bfe8 100755 --- a/bin/lib/create.js +++ b/bin/lib/create.js @@ -246,7 +246,7 @@ exports.create = function(project_path, config, options, events) { events.emit('log', '\tActivity: ' + safe_activity_name); events.emit('log', '\tAndroid target: ' + target_api); - events.emit('verbose', 'Copying template files...'); + events.emit('verbose', 'Copying android template project to ' + project_path); setShellFatal(true, function() { var project_template_dir = options.customTemplate || path.join(ROOT, 'bin', 'templates', 'project'); http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/Adb.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/Adb.js b/bin/templates/cordova/lib/Adb.js index e28c4d9..84ae707 100644 --- a/bin/templates/cordova/lib/Adb.js +++ b/bin/templates/cordova/lib/Adb.js @@ -56,7 +56,7 @@ Adb.devices = function (opts) { }; Adb.install = function (target, packagePath, opts) { - events.emit('verbose', 'Installing apk ' + packagePath + ' on ' + target + '...'); + events.emit('verbose', 'Installing apk ' + packagePath + ' on target ' + target + '...'); var args = ['-s', target, 'install']; if (opts && opts.replace) args.push('-r'); return spawn('adb', args.concat(packagePath), {cwd: os.tmpdir()}) @@ -78,12 +78,12 @@ Adb.install = function (target, packagePath, opts) { }; Adb.uninstall = function (target, packageId) { - events.emit('verbose', 'Uninstalling ' + packageId + ' from ' + target + '...'); + events.emit('verbose', 'Uninstalling package ' + packageId + ' from target ' + target + '...'); return spawn('adb', ['-s', target, 'uninstall', packageId], {cwd: os.tmpdir()}); }; Adb.shell = function (target, shellCommand) { - events.emit('verbose', 'Running command "' + shellCommand + '" on ' + target + '...'); + events.emit('verbose', 'Running adb shell command "' + shellCommand + '" on target ' + target + '...'); var args = ['-s', target, 'shell']; shellCommand = shellCommand.split(/\s+/); return spawn('adb', args.concat(shellCommand), {cwd: os.tmpdir()}) @@ -94,7 +94,7 @@ Adb.shell = function (target, shellCommand) { }; Adb.start = function (target, activityName) { - events.emit('verbose', 'Starting application "' + activityName + '" on ' + target + '...'); + events.emit('verbose', 'Starting application "' + activityName + '" on target ' + target + '...'); return Adb.shell(target, 'am start -W -a android.intent.action.MAIN -n' + activityName) .catch(function (output) { return Q.reject(new CordovaError('Failed to start application "' + http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/AndroidManifest.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/AndroidManifest.js b/bin/templates/cordova/lib/AndroidManifest.js index 3654ada..8248f59 100644 --- a/bin/templates/cordova/lib/AndroidManifest.js +++ b/bin/templates/cordova/lib/AndroidManifest.js @@ -28,7 +28,7 @@ function AndroidManifest(path) { this.path = path; this.doc = xml.parseElementtreeSync(path); if (this.doc.getroot().tag !== 'manifest') { - throw new Error(path + ' has incorrect root node name (expected "manifest")'); + throw new Error('AndroidManifest at ' + path + ' has incorrect root node name (expected "manifest")'); } } http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/build.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/build.js b/bin/templates/cordova/lib/build.js index 004656c..bd613da 100644 --- a/bin/templates/cordova/lib/build.js +++ b/bin/templates/cordova/lib/build.js @@ -188,18 +188,18 @@ module.exports.detectArchitecture = function(target) { // adb kill-server doesn't seem to do the trick. // Could probably find a x-platform version of killall, but I'm not actually // sure that this scenario even happens on non-OSX machines. + events.emit('verbose', 'adb timed out while detecting device/emulator architecture. Killing adb and trying again.'); return spawn('killall', ['adb']) .then(function() { - events.emit('verbose', 'adb seems hung. retrying.'); return helper() .then(null, function() { // The double kill is sadly often necessary, at least on mac. - events.emit('warn', 'Now device not found... restarting adb again.'); + events.emit('warn', 'adb timed out a second time while detecting device/emulator architecture. Killing adb and trying again.'); return spawn('killall', ['adb']) .then(function() { return helper() .then(null, function() { - return Q.reject(new CordovaError('USB is flakey. Try unplugging & replugging the device.')); + return Q.reject(new CordovaError('adb timed out a third time while detecting device/emulator architecture. Try unplugging & replugging the device.')); }); }); }); http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/builders/AntBuilder.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/builders/AntBuilder.js b/bin/templates/cordova/lib/builders/AntBuilder.js index 5b2b104..4e0f71a 100644 --- a/bin/templates/cordova/lib/builders/AntBuilder.js +++ b/bin/templates/cordova/lib/builders/AntBuilder.js @@ -79,7 +79,7 @@ AntBuilder.prototype.prepEnv = function(opts) { writeBuildXml(path.join(self.root, subProjects[i])); } if (propertiesObj.systemLibs.length > 0) { - throw new CordovaError('Project contains at least one plugin that requires a system library. This is not supported with ANT. Please build using gradle.'); + throw new CordovaError('Project contains at least one plugin that requires a system library. This is not supported with ANT. Use gradle instead.'); } var propertiesFile = opts.buildType + SIGNING_PROPERTIES; http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/emulator.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/emulator.js b/bin/templates/cordova/lib/emulator.js index bd85dcd..56247dd 100644 --- a/bin/templates/cordova/lib/emulator.js +++ b/bin/templates/cordova/lib/emulator.js @@ -187,14 +187,14 @@ module.exports.start = function(emulator_ID, boot_timeout) { .unref(); // wait for emulator to start - events.emit('log', 'Waiting for emulator...'); + events.emit('log', 'Waiting for emulator to start...'); return self.wait_for_emulator(uuid); }).then(function(emulatorId) { if (!emulatorId) return Q.reject(new CordovaError('Failed to start emulator')); //wait for emulator to boot up - process.stdout.write('Booting up emulator (this may take a while)...'); + process.stdout.write('Waiting for emulator to boot (this may take a while)...'); return self.wait_for_boot(emulatorId, boot_timeout) .then(function(success) { if (success) { @@ -272,7 +272,7 @@ module.exports.wait_for_boot = function(emulator_id, time_remaining) { * Returns a promise. */ module.exports.create_image = function(name, target) { - console.log('Creating avd named ' + name); + console.log('Creating new avd named ' + name); if (target) { return spawn('android', ['create', 'avd', '--name', name, '--target', target]) .then(null, function(error) { @@ -286,7 +286,7 @@ module.exports.create_image = function(name, target) { .then(function() { // TODO: This seems like another error case, even though it always happens. console.error('ERROR : Unable to create an avd emulator, no targets found.'); - console.error('Please insure you have targets available by running the "android" command'); + console.error('Ensure you have targets available by running the "android" command'); return Q.reject(); }, function(error) { console.error('ERROR : Failed to create emulator image : '); @@ -299,7 +299,7 @@ module.exports.resolveTarget = function(target) { return this.list_started() .then(function(emulator_list) { if (emulator_list.length < 1) { - return Q.reject('No started emulators found, please start an emultor before deploying your project.'); + return Q.reject('No running Android emulators found, please start an emulator before deploying your project.'); } // default emulator @@ -392,8 +392,8 @@ module.exports.install = function(givenTarget, buildResults) { if (!/INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES/.test(error.toString())) throw error; - events.emit('warn', 'Uninstalling app from device and reinstalling it again because the ' + - 'installed app already signed with different key'); + events.emit('warn', 'Uninstalling app from device and reinstalling it because the ' + + 'currently installed app was signed with different key'); // This promise is always resolved, even if 'adb uninstall' fails to uninstall app // or the app doesn't installed at all, so no error catching needed. http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/pluginHandlers.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/pluginHandlers.js b/bin/templates/cordova/lib/pluginHandlers.js index 6a315e9..24cda4d 100644 --- a/bin/templates/cordova/lib/pluginHandlers.js +++ b/bin/templates/cordova/lib/pluginHandlers.js @@ -28,8 +28,8 @@ var CordovaError = require('cordova-common').CordovaError; var handlers = { 'source-file':{ install:function(obj, plugin, project, options) { - if (!obj.src) throw new CordovaError(' element is missing "src" attribute for plugin: ' + plugin.id); - if (!obj.targetDir) throw new CordovaError(' element is missing "target-dir" attribute for plugin: ' + plugin.id); + if (!obj.src) throw new CordovaError(generateAttributeError('src', 'source-file', plugin.id)); + if (!obj.targetDir) throw new CordovaError(generateAttributeError('target-dir', 'source-file', plugin.id)); var dest = path.join(obj.targetDir, path.basename(obj.src)); if (options && options.force) { copyFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); @@ -63,7 +63,7 @@ var handlers = { 'framework': { install:function(obj, plugin, project, options) { var src = obj.src; - if (!src) throw new CordovaError('src not specified in for plugin: ' + plugin.id); + if (!src) throw new CordovaError(generateAttributeError('src', 'framework', plugin.id)); events.emit('verbose', 'Installing Android library: ' + src); var parentDir = obj.parent ? path.resolve(project.projectDir, obj.parent) : project.projectDir; @@ -88,7 +88,7 @@ var handlers = { }, uninstall:function(obj, plugin, project, options) { var src = obj.src; - if (!src) throw new CordovaError('src not specified in for plugin: ' + plugin.id); + if (!src) throw new CordovaError(generateAttributeError('src', 'framework', plugin.id)); events.emit('verbose', 'Uninstalling Android library: ' + src); var parentDir = obj.parent ? path.resolve(project.projectDir, obj.parent) : project.projectDir; @@ -120,10 +120,10 @@ var handlers = { asset:{ install:function(obj, plugin, project, options) { if (!obj.src) { - throw new CordovaError(' tag without required "src" attribute. plugin=' + plugin.dir); + throw new CordovaError(generateAttributeError('src', 'asset', plugin.id)); } if (!obj.target) { - throw new CordovaError(' tag without required "target" attribute'); + throw new CordovaError(generateAttributeError('target', 'asset', plugin.id)); } copyFile(plugin.dir, obj.src, project.www, obj.target); @@ -135,7 +135,7 @@ var handlers = { uninstall:function(obj, plugin, project, options) { var target = obj.target || obj.src; - if (!target) throw new CordovaError(' tag without required "target" attribute'); + if (!target) throw new CordovaError(generateAttributeError('target', 'asset', plugin.id)); removeFileF(path.resolve(project.www, target)); removeFileF(path.resolve(project.www, 'plugins', plugin.id)); @@ -205,13 +205,13 @@ function copyFile (plugin_dir, src, project_dir, dest, link) { var real_path = fs.realpathSync(src); var real_plugin_path = fs.realpathSync(plugin_dir); if (real_path.indexOf(real_plugin_path) !== 0) - throw new CordovaError('"' + src + '" not located within plugin!'); + throw new CordovaError('File "' + src + '" is located outside the plugin directory "' + plugin_dir + '"'); dest = path.resolve(project_dir, dest); // check that dest path is located in project directory if (dest.indexOf(project_dir) !== 0) - throw new CordovaError('"' + dest + '" not located within project!'); + throw new CordovaError('Destination "' + dest + '" for source file "' + src + '" is located outside the project'); shell.mkdir('-p', path.dirname(dest)); @@ -270,3 +270,7 @@ function removeFileAndParents (baseDir, destFile, stopper) { } } } + +function generateAttributeError(attribute, element, id) { + return 'Required attribute "' + attribute + '" not specified in <' + element + '> element from plugin: ' + id; +} http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/prepare.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/prepare.js b/bin/templates/cordova/lib/prepare.js index 7ad1c06..52138a5 100644 --- a/bin/templates/cordova/lib/prepare.js +++ b/bin/templates/cordova/lib/prepare.js @@ -50,7 +50,7 @@ module.exports.prepare = function (cordovaProject) { handleSplashes(cordovaProject.projectConfig, self.root); }) .then(function () { - events.emit('verbose', 'updated project successfully'); + events.emit('verbose', 'Prepared android project successfully'); }); }; @@ -69,7 +69,7 @@ module.exports.prepare = function (cordovaProject) { * configuration is already dumped to appropriate config.xml file. */ function updateConfigFilesFrom(sourceConfig, configMunger, locations) { - events.emit('verbose', 'Generating config.xml from defaults for platform "android"'); + events.emit('verbose', 'Generating platform-specific config.xml from defaults for android at ' + locations.configXml); // First cleanup current config and merge project's one into own // Overwrite platform config.xml with defaults.xml. @@ -79,6 +79,7 @@ function updateConfigFilesFrom(sourceConfig, configMunger, locations) { // in project (including project's config) configMunger.reapply_global_munge().save_all(); + events.emit('verbose', 'Merging project\'s config.xml into platform-specific android config.xml'); // Merge changes from app's config.xml into platform's one var config = new ConfigParser(locations.configXml); xmlHelpers.mergeXml(sourceConfig.doc.getroot(), @@ -108,7 +109,7 @@ function updateWwwFrom(cordovaProject, destinations) { // If project contains 'merges' for our platform, use them as another overrides var merges_path = path.join(cordovaProject.root, 'merges', 'android'); if (fs.existsSync(merges_path)) { - events.emit('verbose', 'Found "merges" for android platform. Copying over existing "www" files.'); + events.emit('verbose', 'Found "merges/android" folder. Copying its contents into the android project.'); var overrides = path.join(merges_path, '*'); shell.cp('-rf', overrides, destinations.www); } @@ -127,7 +128,7 @@ function updateProjectAccordingTo(platformConfig, locations) { var strings = xmlHelpers.parseElementtreeSync(locations.strings); strings.find('string[@name="app_name"]').text = name; fs.writeFileSync(locations.strings, strings.write({indent: 4}), 'utf-8'); - events.emit('verbose', 'Wrote out Android application name to "' + name + '"'); + events.emit('verbose', 'Wrote out android application name "' + name + '" to ' + locations.strings); // Java packages cannot support dashes var pkg = (platformConfig.android_packageName() || platformConfig.packageName()).replace(/-/g, '_'); @@ -153,15 +154,15 @@ function updateProjectAccordingTo(platformConfig, locations) { }); if (java_files.length === 0) { - throw new CordovaError('No Java files found which extend CordovaActivity.'); + throw new CordovaError('No Java files found that extend CordovaActivity.'); } else if(java_files.length > 1) { - events.emit('log', 'Multiple candidate Java files (.java files which extend CordovaActivity) found. Guessing at the first one, ' + java_files[0]); + events.emit('log', 'Multiple candidate Java files that extend CordovaActivity found. Guessing at the first one, ' + java_files[0]); } var destFile = path.join(locations.root, 'src', pkg.replace(/\./g, '/'), path.basename(java_files[0])); shell.mkdir('-p', path.dirname(destFile)); shell.sed(/package [\w\.]*;/, 'package ' + pkg + ';', java_files[0]).to(destFile); - events.emit('verbose', 'Wrote out Android package name to "' + pkg + '"'); + events.emit('verbose', 'Wrote out Android package name "' + pkg + '" to ' + destFile); if (orig_pkg !== pkg) { // If package was name changed we need to remove old java with main activity @@ -195,6 +196,8 @@ function default_versionCode(version) { if (+nums[2]) { versionCode += +nums[2]; } + + events.emit('verbose', 'android-versionCode not found in config.xml. Generating a code based on version in config.xml (' + version + '): ' + versionCode); return versionCode; } @@ -209,7 +212,7 @@ function copyImage(src, resourcesDir, density, name) { } var destFilePath = path.join(destFolder, isNinePatch ? ninePatchName : name); - events.emit('verbose', 'copying image from ' + src + ' to ' + destFilePath); + events.emit('verbose', 'Copying image from ' + src + ' to ' + destFilePath); shell.cp('-f', src, destFilePath); } @@ -289,7 +292,7 @@ function handleIcons(projectConfig, platformRoot) { } if (!size && !icon.density) { if (default_icon) { - events.emit('verbose', 'more than one default icon: ' + JSON.stringify(icon)); + events.emit('verbose', 'Found extra default icon: ' + icon.src + ' (ignoring in favor of ' + default_icon.src + ')'); } else { default_icon = icon; } http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/bin/templates/cordova/lib/run.js ---------------------------------------------------------------------- diff --git a/bin/templates/cordova/lib/run.js b/bin/templates/cordova/lib/run.js index 027a482..214a1e1 100644 --- a/bin/templates/cordova/lib/run.js +++ b/bin/templates/cordova/lib/run.js @@ -66,7 +66,7 @@ function getInstallTarget(runOptions) { events.emit('warn', 'No target specified, deploying to device \'' + device_list[0] + '\'.'); install_target = device_list[0]; } else { - events.emit('warn', 'No target specified, deploying to emulator'); + events.emit('warn', 'No target specified and no devices found, deploying to emulator'); install_target = '--emulator'; } }); http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/framework/cordova.gradle ---------------------------------------------------------------------- diff --git a/framework/cordova.gradle b/framework/cordova.gradle index 7465266..746b63a 100644 --- a/framework/cordova.gradle +++ b/framework/cordova.gradle @@ -61,7 +61,7 @@ String doFindLatestInstalledBuildTools(String minBuildToolsVersion) { highestBuildToolsVersion } else { throw new RuntimeException( - "No installed build tools found. Please install the Android build tools version " + + "No installed build tools found. Install the Android build tools version " + minBuildToolsVersion + " or higher.") } } http://git-wip-us.apache.org/repos/asf/cordova-android/blob/9738079c/spec/unit/pluginHandlers/common.spec.js ---------------------------------------------------------------------- diff --git a/spec/unit/pluginHandlers/common.spec.js b/spec/unit/pluginHandlers/common.spec.js index 7280ffb..485f33b 100644 --- a/spec/unit/pluginHandlers/common.spec.js +++ b/spec/unit/pluginHandlers/common.spec.js @@ -47,8 +47,9 @@ describe('common platform handler', function() { it('should throw if src not in plugin directory', function(){ shell.mkdir('-p', project_dir); fs.writeFileSync(non_plugin_file, 'contents', 'utf-8'); - expect(function(){copyFile(test_dir, '../non_plugin_file', project_dir, dest);}). - toThrow(new Error('"' + non_plugin_file + '" not located within plugin!')); + var outside_file = '../non_plugin_file'; + expect(function(){copyFile(test_dir, outside_file, project_dir, dest);}). + toThrow(new Error('File "' + path.resolve(test_dir, outside_file) + '" is located outside the plugin directory "' + test_dir + '"')); shell.rm('-rf', test_dir); }); @@ -75,7 +76,7 @@ describe('common platform handler', function() { } expect(function(){copyFile(test_dir, symlink_file, project_dir, dest);}). - toThrow(new Error('"' + symlink_file + '" not located within plugin!')); + toThrow(new Error('File "' + path.resolve(test_dir, symlink_file) + '" is located outside the plugin directory "' + test_dir + '"')); shell.rm('-rf', project_dir); }); @@ -83,7 +84,7 @@ describe('common platform handler', function() { shell.mkdir('-p', java_dir); fs.writeFileSync(java_file, 'contents', 'utf-8'); expect(function(){copyFile(test_dir, java_file, project_dir, non_plugin_file);}). - toThrow(new Error('"' + non_plugin_file + '" not located within project!')); + toThrow(new Error('Destination "' + path.resolve(project_dir, non_plugin_file) + '" for source file "' + path.resolve(test_dir, java_file) + '" is located outside the project')); shell.rm('-rf', project_dir); }); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org For additional commands, e-mail: commits-help@cordova.apache.org