You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2016/05/19 08:27:29 UTC

cordova-coho git commit: CB-11279 Support arbitrary repositories for 'coho nightly'

Repository: cordova-coho
Updated Branches:
  refs/heads/master 2fb8df07d -> 94bf9d8bf


CB-11279 Support arbitrary repositories for 'coho nightly'

- Use `updateRepoVersion` from versionutil to update repo's version properly
- Reduce amount of changes written to repos
  - Append new line to every package.json written
  - Use 2 spaces indent in 'package.json' as npm does
- Fix unpublish running multiple times for every repo

This closes #122


Project: http://git-wip-us.apache.org/repos/asf/cordova-coho/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-coho/commit/94bf9d8b
Tree: http://git-wip-us.apache.org/repos/asf/cordova-coho/tree/94bf9d8b
Diff: http://git-wip-us.apache.org/repos/asf/cordova-coho/diff/94bf9d8b

Branch: refs/heads/master
Commit: 94bf9d8bf8e76a7856bbf45a8b19c47a1e20d9d2
Parents: 2fb8df0
Author: Vladimir Kotikov <ko...@gmail.com>
Authored: Tue May 17 13:11:36 2016 +0300
Committer: Vladimir Kotikov <ko...@gmail.com>
Committed: Thu May 19 11:25:32 2016 +0300

----------------------------------------------------------------------
 src/main.js             |   6 +-
 src/nightly.js          | 140 +++++++++++++++++++++++++++++--------------
 src/npm-publish.js      |  27 +++------
 src/platform-release.js |  58 +-----------------
 src/repoutil.js         |  11 +++-
 src/versionutil.js      |  89 ++++++++++++++++++++++++---
 6 files changed, 201 insertions(+), 130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/94bf9d8b/src/main.js
----------------------------------------------------------------------
diff --git a/src/main.js b/src/main.js
index ec7a9c3..a599ef0 100644
--- a/src/main.js
+++ b/src/main.js
@@ -120,8 +120,8 @@ module.exports = function() {
             entryPoint: lazyRequire('./update-release-notes')
         },  {
             name: 'npm-unpublish-nightly',
-            desc: 'Unpublishes last nightly versions for cli and lib',
-            entryPoint: lazyRequire('./npm-publish', 'unpublish')
+            desc: 'Unpublishes last nightly versions for all specified repositories',
+            entryPoint: lazyRequire('./npm-publish', 'unpublishNightly')
         }];
     var otherCommands = [{
             name: 'list-pulls',
@@ -137,7 +137,7 @@ module.exports = function() {
             desc: 'Launches github PR UI for the specified topic branch',
             entryPoint: lazyRequire('./create-pr'),
             noChdir : true
-        }, 
+        },
         {
             name: 'last-week',
             desc: 'Prints out git logs of things that happened last week.',

http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/94bf9d8b/src/nightly.js
----------------------------------------------------------------------
diff --git a/src/nightly.js b/src/nightly.js
index bcec1d4..28dbdd0 100644
--- a/src/nightly.js
+++ b/src/nightly.js
@@ -33,10 +33,11 @@ var npmlink = require('./npm-link');
 var repoclone = require('./repo-clone');
 
 module.exports = function*(argv) {
-    var repos = flagutil.computeReposFromFlag('tools');
-    var cli = repoutil.getRepoById('cli');
-    var cordovaLib = repoutil.getRepoById('lib');
+    /** Specifies the default repos to build nightlies for */
+    var DEFAULT_NIGHTLY_REPOS = ['cli', 'lib'];
+
     var opt = flagutil.registerHelpFlag(optimist);
+    opt = flagutil.registerRepoFlag(opt);
 
     argv = opt
         .usage('Publish CLI & LIB to NPM under nightly tag. \n' +
@@ -52,6 +53,7 @@ module.exports = function*(argv) {
             type:'boolean',
             alias : 'ignoreTestFailures'
         })
+        .default({ r: DEFAULT_NIGHTLY_REPOS})
         .argv;
 
     if(argv.h) {
@@ -60,36 +62,26 @@ module.exports = function*(argv) {
     }
 
     // Clone and update Repos
-    yield repoclone.cloneRepos(repos, /*silent=*/true);
-    yield repoupdate.updateRepos(repos);
+    yield prepareRepos(argv.r);
 
-    //remove local changes and sync up with remote master
-    yield repoutil.forEachRepo(repos, function*() {
-        yield gitutil.gitClean();
-        yield gitutil.resetFromOrigin();
-    });
+    var reposToBuild = flagutil.computeReposFromFlag(argv.r, { includeModules: true });
+    // Get updated nightly versions for all repos
+    /** @type {Object} A map of repo.id and a short SHA for every repo to build */
+    var VERSIONS = yield retrieveVersions(reposToBuild);
 
-    // Get SHAS from repos
-    var SHAJSON = yield retrieveSha(repos);
+    // Update version in package.json and other respective files for every repo
+    // and update dependencies to use nightly versions of packages to be released
+    yield repoutil.forEachRepo(reposToBuild, function*(repo) {
+        apputil.print('Updating ' + repo.id + ' version to ' + VERSIONS[repo.id]);
+        yield versionutil.updateRepoVersion(repo, VERSIONS[repo.id], { commitChanges: false });
 
-    var currentDate = new Date();
-    var nightlyVersion = '-nightly.' + currentDate.getFullYear() + '.' +
-        (currentDate.getMonth() + 1) + '.' + currentDate.getDate();
-    var cordovaLibVersion;
-    //update package.json version for cli + lib, update lib reference for cli
-    yield repoutil.forEachRepo([cordovaLib, cli], function*(repo) {
-        var dir = process.cwd();
-        var packageJSON = require(dir+'/package.json');
-        packageJSON.version = versionutil.removeDev(packageJSON.version) + nightlyVersion +
-            '+' + SHAJSON[repo.id];
-
-        if(repo.id === 'lib'){
-            cordovaLibVersion = packageJSON.version;
-        } else {
-            packageJSON.dependencies['cordova-lib'] = cordovaLibVersion;
-        }
+        var packageJSONPath = path.join(process.cwd(), 'package.json');
+        var packageJSON = JSON.parse(fs.readFileSync(packageJSONPath));
 
-        fs.writeFileSync(dir+'/package.json', JSON.stringify(packageJSON, null, 4), 'utf8', function(err) {
+        // If there is a dependencies listed, iterate through and update cordova-* dependencies
+        packageJSON.dependencies = mapDependenciesVersions(packageJSON.dependencies, VERSIONS);
+
+        fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON, null, 2) + '\n', 'utf8', function(err) {
             if (err) return console.log (err);
         });
     });
@@ -98,36 +90,64 @@ module.exports = function*(argv) {
     yield npmlink();
 
     // npm install cli
+    var cli = repoutil.getRepoById('cli');
     yield repoutil.forEachRepo([cli], function*(repo) {
         yield executil.execHelper(executil.ARGS('npm install'), /*silent=*/true, false);
     });
 
     //run CLI + cordova-lib tests
-    yield runTests(cli, cordovaLib, argv.ignoreTestFailures);
+    yield runTests(reposToBuild, argv.ignoreTestFailures);
 
     var options = {};
     options.tag = 'nightly';
     options.pretend = argv.pretend;
+    options.r = reposToBuild.map(function (repo) { return repo.id; });
 
     //unpublish old nightly
-    yield repoutil.forEachRepo([cordovaLib, cli], function*(repo) {
-        var packageName = repo.packageName || repo.repoName;
-        var oldNightlyVersion = yield executil.execHelper(executil.ARGS('npm view ' + packageName + ' dist-tags.nightly'));
-        apputil.print('Latest ' + packageName + '@nightly version is ' + oldNightlyVersion);
-
-        options.r = [repo.id];
-        options.version = oldNightlyVersion;
-
-        yield npmpublish.unpublish(options);
-    });
-
-    options.r = ['lib', 'cli'];
+    yield npmpublish.unpublishNightly(options);
     //publish to npm under nightly tag
     yield npmpublish.publishTag(options);
+};
+
+function* prepareRepos(repoNames) {
+    // Clone and update required repos
+    apputil.print('Cloning and updating required repositories...');
+    var reposToClone = flagutil.computeReposFromFlag(['tools'].concat(repoNames));
+    yield repoclone.cloneRepos(reposToClone, /*silent=*/true);
+    yield repoupdate.updateRepos(reposToClone, /*silent=*/true);
+
+    // Remove local changes and sync up with remote master
+    apputil.print('Resetting repositories to "master" branches...');
+    var reposToUpdate = flagutil.computeReposFromFlag(repoNames);
+    yield repoutil.forEachRepo(reposToUpdate, function*() {
+        yield gitutil.gitClean();
+        yield gitutil.resetFromOrigin();
+    });
 }
 
-function *runTests(cli, lib, ignoreTestFailures) {
-    yield repoutil.forEachRepo([cli, lib], function *(repo) {
+/**
+ * Updates provided dependencies object with versions, supplied in packageVersions object
+ * @param {Object<String, String>} packageDependencies A map of current package's dependencies to versions
+ * @param {Object<String, String>} packageVersions Map of package's id's to nightly versions
+ * @returns {Object<String, String>} A mapped object
+ */
+function mapDependenciesVersions(packageDependencies, packageVersions) {
+    return Object.keys(packageDependencies)
+    .reduce(function (result, dependency) {
+        var dep = repoutil.getRepoById(dependency);
+        // If this is a cordova-* dependency, and we're going to build nightly for it
+        if (dependency.match(/cordova\-.*/) && dep && packageVersions[dep.id]) {
+            // Update its version in package's dependencies to nightly version
+            apputil.print('Updating ' + dependency + ' dependency version to ' + packageVersions[dep.id]);
+            result[dependency] = packageVersions[dep.id];
+        }
+
+        return result;
+    }, packageDependencies);
+}
+
+function *runTests(repos, ignoreTestFailures) {
+    yield repoutil.forEachRepo(repos, function *(repo) {
         try {
             yield executil.execHelper(executil.ARGS('npm test'), false, ignoreTestFailures);
         } catch (e) {
@@ -136,3 +156,35 @@ function *runTests(cli, lib, ignoreTestFailures) {
         }
     });
 }
+
+/**
+ * Generates suffix for appending to nightly package version
+ *   based on current date and SHA string.
+ * @param SHA {String} String to use to generate nightly version
+ * @returns {String} A newly generated nightly suffix
+ */
+function getNightlySuffix (SHA) {
+    var currentDate = new Date();
+    var nightlySuffix = '-nightly.' + currentDate.getFullYear() + '.' +
+        (currentDate.getMonth() + 1) + '.' + currentDate.getDate() +
+        '+' + SHA;
+
+    return nightlySuffix;
+}
+
+/**
+ * Generates map of repo.id -> nightly version based on current
+ *   date and SHA of current revision of repository
+ * @param {Object[]} repos An array of cordova repos
+ * @returns {Object} Mapped object
+ */
+function* retrieveVersions(repos) {
+    var SHAJSON = yield retrieveSha(repos);
+
+    return Object.keys(SHAJSON).reduce(function (result, repoId) {
+        var repoPath = repoutil.getRepoDir(repoutil.getRepoById(repoId));
+        var oldVersion = require(path.join(repoPath, 'package.json')).version;
+        result[repoId] = versionutil.removeDev(oldVersion) + getNightlySuffix(SHAJSON[repoId]);
+        return result;
+    }, {});
+}

http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/94bf9d8b/src/npm-publish.js
----------------------------------------------------------------------
diff --git a/src/npm-publish.js b/src/npm-publish.js
index 5433d41..9fe34cf 100644
--- a/src/npm-publish.js
+++ b/src/npm-publish.js
@@ -74,14 +74,8 @@ function *publishTag(options) {
 
 module.exports.publishTag = publishTag;
 
-//TODO: Does npm tag cordova-js*.tgz latest
-exports.setLatest = function*(argv) {
-
-
-}
-
 //Gets last nightly tag and unpublishes it
-function *unpublish(options) {
+function *unpublishNightly(options) {
     var opt = flagutil.registerHelpFlag(optimist);
 
     if(options) {
@@ -92,12 +86,9 @@ function *unpublish(options) {
             .options('r', {
                 default:options.r
             })
-            .options('version', {
-                default:options.version
-            })
     }
 
-    argv = opt
+    var argv = opt
         .usage("Unpublishes the nightly version for the cli & lib from npm \n" +
                 "Usage: $0 npm-unpublish-nightly")
         .options("pretend", {
@@ -105,11 +96,7 @@ function *unpublish(options) {
             type: "boolean"
         })
         .options('r', {
-            desc: "Which repo(s) to publish",
-            demand: true
-        })
-        .options('version', {
-            desc: "Which version to unpublish",
+            desc: "Which repo(s) to unpublish",
             demand: true
         })
         .argv;
@@ -123,8 +110,12 @@ function *unpublish(options) {
 
     yield repoutil.forEachRepo(repos, function*(repo) {
         var packageId = repo.packageName || repo.repoName;
-        yield executil.execOrPretend(executil.ARGS('npm unpublish '+ packageId + '@' + argv.version), argv.pretend);
+        var oldNightlyVersion = yield executil.execHelper(executil.ARGS('npm view ' + packageId + ' dist-tags.nightly'));
+
+        if (oldNightlyVersion && oldNightlyVersion !== 'undefined') {
+            yield executil.execOrPretend(executil.ARGS('npm unpublish '+ packageId + '@' + oldNightlyVersion), argv.pretend);
+        }
     });
 }
 
-module.exports.unpublish = unpublish;
+module.exports.unpublishNightly = unpublishNightly;

http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/94bf9d8b/src/platform-release.js
----------------------------------------------------------------------
diff --git a/src/platform-release.js b/src/platform-release.js
index dd0df7f..a9ebce1 100644
--- a/src/platform-release.js
+++ b/src/platform-release.js
@@ -17,7 +17,6 @@ specific language governing permissions and limitations
 under the License.
 */
 
-var fs = require('fs');
 var path = require('path');
 var optimist = require('optimist');
 var shelljs = require('shelljs');
@@ -27,6 +26,7 @@ var flagutil = require('./flagutil');
 var gitutil = require('./gitutil');
 var repoutil = require('./repoutil');
 var repoupdate = require('./repo-update');
+var versionutil = require('./versionutil');
 var print = apputil.print;
 
 function createPlatformDevVersion(version) {
@@ -114,58 +114,6 @@ function *updateJsSnapshot(repo, version) {
     }
 }
 
-function *updateRepoVersion(repo, version) {
-    // Update the VERSION files.
-    var versionFilePaths = repo.versionFilePaths || ['VERSION'];
-    if (fs.existsSync(versionFilePaths[0])) {
-        versionFilePaths.forEach(function(versionFilePath) {
-            fs.writeFileSync(versionFilePath, version + '\n');
-        });
-        shelljs.config.fatal = true;
-        if (repo.id == 'android' || repo.id == 'amazon-fireos') {
-            shelljs.sed('-i', /CORDOVA_VERSION.*=.*;/, 'CORDOVA_VERSION = "' + version + '";', path.join('framework', 'src', 'org', 'apache', 'cordova', 'CordovaWebView.java'));
-            shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'cordova', 'version'));
-        } else if (repo.id == 'ios' || repo.id == 'osx') {
-            shelljs.sed('-i', /VERSION.*=.*/, 'VERSION="' + version + '";', path.join('bin', 'templates', 'scripts', 'cordova', 'version'));
-        } else if (repo.id == 'blackberry') {
-            shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'project','cordova', 'lib', 'version.js'));
-        } else if (repo.id == 'firefoxos' || repo.id == 'browser' || repo.id == 'ubuntu') {
-            shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'project','cordova', 'version'));
-        } else if (repo.id == 'windows') {
-            if(fs.existsSync(path.join('template', 'cordova', 'version'))) {
-                console.log('version exists');
-                shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('template', 'cordova', 'version'));
-            }
-        }
-        shelljs.config.fatal = false;
-        if (!(yield gitutil.pendingChangesExist())) {
-            print('VERSION file was already up-to-date.');
-        }
-    } else {
-        console.warn('No VERSION file exists in repo ' + repo.repoName);
-    }
-
-    // Update the package.json VERSION.
-    var packageFilePaths = repo.packageFilePaths || ['package.json'];
-    if (fs.existsSync(packageFilePaths[0])) {
-        fs.readFile(packageFilePaths[0], {encoding: 'utf-8'},function (err, data) {
-            if (err) throw err;
-            var packageJSON = JSON.parse(data);
-            packageJSON.version = version;
-            fs.writeFileSync(packageFilePaths[0], JSON.stringify(packageJSON, null, "    "));
-        });
-        if (!(yield gitutil.pendingChangesExist())) {
-            print('package.json file was already up-to-date.');
-        }
-    } else {
-        console.warn('No package.json file exists in repo ' + repo.repoName);
-    }
-
-    if (yield gitutil.pendingChangesExist()) {
-        yield executil.execHelper(executil.ARGS('git commit -am', 'Set VERSION to ' + version + ' (via coho)'));
-    }
-}
-
 exports.prepareReleaseBranchCommand = function*() {
     var argv = configureReleaseCommandFlags(optimist
         .usage('Prepares release branches but does not create tags. This includes:\n' +
@@ -206,12 +154,12 @@ exports.prepareReleaseBranchCommand = function*() {
             }
             yield updateJsSnapshot(repo, version);
             print(repo.repoName + ': ' + 'Setting VERSION to "' + version + '" on branch + "' + branchName + '".');
-            yield updateRepoVersion(repo, version);
+            yield versionutil.updateRepoVersion(repo, version);
 
             yield gitutil.gitCheckout('master');
             var devVersion = createPlatformDevVersion(version);
             print(repo.repoName + ': ' + 'Setting VERSION to "' + devVersion + '" on branch + "master".');
-            yield updateRepoVersion(repo, devVersion);
+            yield versionutil.updateRepoVersion(repo, devVersion);
             yield updateJsSnapshot(repo, devVersion);
             yield gitutil.gitCheckout(branchName);
         });

http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/94bf9d8b/src/repoutil.js
----------------------------------------------------------------------
diff --git a/src/repoutil.js b/src/repoutil.js
index 59ab1fe..e4bf09f 100644
--- a/src/repoutil.js
+++ b/src/repoutil.js
@@ -439,11 +439,20 @@ repoGroups.__defineGetter__('auto', function() {
 
 exports.repoGroups = repoGroups;
 
+function isInRepoGroup(repoToCheck, groupName) {
+    var repos = repoGroups[groupName];
+    if (!repos) return false;
+    return repos.some(function (repo) {
+        return repo.id === repoToCheck.id;
+    });
+}
+exports.isInRepoGroup = isInRepoGroup;
+
 function getRepoById(id, opt_repos) {
     // Strip cordova- prefix if it exists.
     var repos = opt_repos || allRepos;
     for (var i = 0; i < repos.length; ++i) {
-        if (repos[i].id == id || repos[i].repoName == id) {
+        if (repos[i].id == id || repos[i].packageName == id || repos[i].repoName == id) {
             return repos[i];
         }
     }

http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/94bf9d8b/src/versionutil.js
----------------------------------------------------------------------
diff --git a/src/versionutil.js b/src/versionutil.js
index 1dbe06b..2458b13 100644
--- a/src/versionutil.js
+++ b/src/versionutil.js
@@ -16,9 +16,15 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-var repoutil = require('./repoutil');
-var flagutil = require('./flagutil');
+
+var fs = require('fs');
 var path = require('path');
+var shelljs = require('shelljs');
+var apputil = require('./apputil');
+var executil = require('./executil');
+var flagutil = require('./flagutil');
+var gitutil = require('./gitutil');
+var repoutil = require('./repoutil');
 
 function removeDev(version) {
     var newVersion = version.replace('-dev', '');
@@ -27,12 +33,12 @@ function removeDev(version) {
 exports.removeDev = removeDev;
 
 //updates platformsConfig.json
-//Needs to be passed a object which includes repo.id as key 
+//Needs to be passed a object which includes repo.id as key
 //and the new version as value
 //ex {android:4.0.0}
 function *updatePlatformsConfig(newValues) {
-    
-    var platformsConfig = path.join(repoutil.getRepoDir('cordova-lib'), 
+
+    var platformsConfig = path.join(repoutil.getRepoDir('cordova-lib'),
         'src/cordova/platformsConfig.json');
     console.log(platformsConfig);
     var platformsJS = require(platformsConfig);
@@ -42,16 +48,81 @@ function *updatePlatformsConfig(newValues) {
     yield repoutil.forEachRepo(repos, function*(repo) {
         if(repo.id === 'windows') {
             platformsJS[repo.id].version = newValues[repo.id];
-            platformsJS['windows8'].version = newValues[repo.id]; 
+            platformsJS['windows8'].version = newValues[repo.id];
         } else if(repo.id === 'blackberry') {
-            platformsJS['blackberry10'].version = newValues[repo.id]; 
+            platformsJS['blackberry10'].version = newValues[repo.id];
         } else {
-            platformsJS[repo.id].version = newValues[repo.id]; 
+            platformsJS[repo.id].version = newValues[repo.id];
         }
     });
 
-    fs.writeFileSync(platformsConfig, JSON.stringify(platformsJS, null, 4), 'utf8', function(err) {
+    fs.writeFileSync(platformsConfig, JSON.stringify(platformsJS, null, 4) + '\n', 'utf8', function(err) {
         if (err) return console.log (err);
     });
 }
 exports.updatePlatformsConfig = updatePlatformsConfig;
+
+/**
+ * Updates VERSION file, version executable script and package.json using specified
+ *   version. Also commits change made to the repo if opposite is not specified.
+ *
+ * @param {Object}  repo    Repo to update version for
+ * @param {String}  version A semver-compatible version to write to repo's files
+ * @param {Object}  [opts]  An options object
+ * @param {Boolean} [opts.commitChanges=true] Specifies whether to commit changes
+ *   to the repo after update is done.
+ */
+exports.updateRepoVersion = function *updateRepoVersion(repo, version, opts) {
+    // Update the VERSION files.
+    var versionFilePaths = repo.versionFilePaths || ['VERSION'];
+    var isPlatformRepo = !!repoutil.isInRepoGroup(repo, 'platform');
+    if (isPlatformRepo && fs.existsSync(versionFilePaths[0])) {
+        versionFilePaths.forEach(function(versionFilePath) {
+            fs.writeFileSync(versionFilePath, version + '\n');
+        });
+        shelljs.config.fatal = true;
+        if (repo.id == 'android' || repo.id == 'amazon-fireos') {
+            shelljs.sed('-i', /CORDOVA_VERSION.*=.*;/, 'CORDOVA_VERSION = "' + version + '";', path.join('framework', 'src', 'org', 'apache', 'cordova', 'CordovaWebView.java'));
+            shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'cordova', 'version'));
+        } else if (repo.id == 'ios' || repo.id == 'osx') {
+            shelljs.sed('-i', /VERSION.*=.*/, 'VERSION="' + version + '";', path.join('bin', 'templates', 'scripts', 'cordova', 'version'));
+        } else if (repo.id == 'blackberry') {
+            shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'project','cordova', 'lib', 'version.js'));
+        } else if (repo.id == 'firefoxos' || repo.id == 'browser' || repo.id == 'ubuntu') {
+            shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'project','cordova', 'version'));
+        } else if (repo.id == 'windows') {
+            if(fs.existsSync(path.join('template', 'cordova', 'version'))) {
+                console.log('version exists');
+                shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('template', 'cordova', 'version'));
+            }
+        }
+        shelljs.config.fatal = false;
+        if (!(yield gitutil.pendingChangesExist())) {
+            apputil.print('VERSION file was already up-to-date.');
+        }
+    } else {
+        if (isPlatformRepo) console.warn('No VERSION file exists in repo ' + repo.repoName);
+    }
+
+    // Update the package.json VERSION.
+    var packageFilePaths = repo.packageFilePaths || ['package.json'];
+    if (fs.existsSync(packageFilePaths[0])) {
+        fs.readFile(packageFilePaths[0], {encoding: 'utf-8'}, function (err, data) {
+            if (err) throw err;
+            var packageJSON = JSON.parse(data);
+            packageJSON.version = version;
+            // use 2 spaces indent similar to npm
+            fs.writeFileSync(packageFilePaths[0], JSON.stringify(packageJSON, null, 2) + '\n');
+        });
+        if (!(yield gitutil.pendingChangesExist())) {
+            apputil.print('package.json file was already up-to-date.');
+        }
+    } else {
+        console.warn('No package.json file exists in repo ' + repo.repoName);
+    }
+
+    var commitChanges = !!(opts ? opts.commitChanges : true);
+    if (commitChanges && (yield gitutil.pendingChangesExist())) {
+        yield executil.execHelper(executil.ARGS('git commit -am', 'Set VERSION to ' + version + ' (via coho)'));
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org