From 153c8e381207b4aefeedc96d2459890bbbfc3701 Mon Sep 17 00:00:00 2001 From: Spencer Alger Date: Fri, 18 Jul 2014 04:41:09 -0700 Subject: [PATCH] added version upgrade task --- .jshintrc | 2 +- grunt/tasks.js | 37 ++++++++++++++++++++++++++++++++ grunt/utils.js | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) diff --git a/.jshintrc b/.jshintrc index d6a7bd3b3..f81a2de43 100644 --- a/.jshintrc +++ b/.jshintrc @@ -3,7 +3,7 @@ "node": true, "white": true, "bitwise": false, - "curly": true, + "curly": false, "eqnull": true, "eqeqeq": true, "forin": true, diff --git a/grunt/tasks.js b/grunt/tasks.js index c231dd461..10ae320a8 100644 --- a/grunt/tasks.js +++ b/grunt/tasks.js @@ -1,5 +1,9 @@ module.exports = function (grunt) { + var Promise = require('bluebird'); var utils = require('./utils'); + var readFile = Promise.promisify(require('fs').readFile); + var writeFile = Promise.promisify(require('fs').writeFile); + // Default task runs the build process. grunt.registerTask('default', [ @@ -37,4 +41,37 @@ module.exports = function (grunt) { 'mochacov:make_coverage_html', 'open:coverage' ]); + + grunt.registerTask('version', function (type) { + var root = require('path').join.bind(null, __dirname, '..'); + var readmePath = root('README.md'); + var packagePath = root('package.json'); + var browserBuildsPath = root('docs/browser_builds.asciidoc'); + + Promise.all([ + require(packagePath), + readFile(readmePath, 'utf8'), + readFile(browserBuildsPath, 'utf8') + ]) + .spread(function (pkg, readme, browserBuilds) { + var current = pkg.version; + var next = utils.increaseVersion(current, type); + + pkg.version = next; + browserBuilds = utils.replaceAll(browserBuilds, current, next); + readme = utils.replaceAll(readme, current, next); + readme = utils.replaceAll( + readme, + 'branch=' + utils.minorVersion(current), + 'branch=' + utils.minorVersion(next) + ); + + // write all files to disk + return Promise.all([ + writeFile(readmePath, readme), + writeFile(browserBuildsPath, browserBuilds), + writeFile(packagePath, JSON.stringify(pkg, null, ' ')) + ]); + }).nodeify(this.async()); + }); }; \ No newline at end of file diff --git a/grunt/utils.js b/grunt/utils.js index b58133f23..c71b88857 100644 --- a/grunt/utils.js +++ b/grunt/utils.js @@ -16,4 +16,61 @@ var utils = { utils.branches._default = pkg.config.default_api_branch; +/* + * trim down a version id to the minor version number ('1.5.1' => '1.5') + */ +utils.minorVersion = function (version) { + return version.split('.').slice(0, 2).join('.'); +}; + +/* + * increment the version based on the release "type" + */ +utils.increaseVersion = function (version, type) { + var i; + switch (type) { + case 'major': + i = 0; + break; + case 'minor': + i = 1; + break; + case 'bug': + case 'patch': + case 'bugfix': + i = 2; + break; + default: + throw new TypeError('unexpected version bump type'); + } + + // breakout the current version + var next = version.split('.').map(function (n) { + return parseInt(n, 10); + }); + + // increment the version type + next[i] += 1; + // clear out all following numbers + for (i ++; i < next.length; i++) next[i] = 0; + // join back together with '.' + return next.join('.'); +}; + +/* + * replace all instances of `replace` with `replacement` without creating a regexp object + */ +utils.replaceAll = function (str, replace, replacement) { + var out = ''; + var remaining = str; + var i = 0; + + while (~(i = remaining.indexOf(replace))) { + out += remaining.substring(0, i) + replacement; + remaining = remaining.substr(i + replace.length); + } + + return out + remaining; +}; + module.exports = utils; \ No newline at end of file