diff options
author | kpdecker <kpdecker@gmail.com> | 2013-08-24 13:10:51 -0500 |
---|---|---|
committer | kpdecker <kpdecker@gmail.com> | 2013-08-24 13:28:39 -0500 |
commit | 7efa75684e471726101a5724cb5c48d5dc4e1eb0 (patch) | |
tree | 59c788181ca9d7e42b8348d7969874e9b24e2688 /tasks | |
parent | 08989cfcdda0408e21a774e60044ebce87695422 (diff) | |
download | handlebars.js-7efa75684e471726101a5724cb5c48d5dc4e1eb0.zip handlebars.js-7efa75684e471726101a5724cb5c48d5dc4e1eb0.tar.gz handlebars.js-7efa75684e471726101a5724cb5c48d5dc4e1eb0.tar.bz2 |
Version update task
Diffstat (limited to 'tasks')
-rw-r--r-- | tasks/release.js | 62 | ||||
-rw-r--r-- | tasks/util/git.js | 83 |
2 files changed, 145 insertions, 0 deletions
diff --git a/tasks/release.js b/tasks/release.js new file mode 100644 index 0000000..636670e --- /dev/null +++ b/tasks/release.js @@ -0,0 +1,62 @@ +var async = require('async'), + git = require('./util/git'), + semver = require('semver'); + +module.exports = function(grunt) { + grunt.registerTask('version', 'Updates the current release version', function() { + var done = this.async(), + pkg = grunt.config('pkg'), + version = grunt.option('ver'); + + if (version === 'major' || version === 'minor' || version === 'patch' || version === 'prerelease') { + version = semver.inc(pkg.version, version); + } + if (!semver.valid(version)) { + throw new Error('Must provide a version number (Ex: --ver=patch):\n\t' + version + '\n\n'); + } + + pkg.version = version; + grunt.config('pkg', pkg); + + git.clean(function(err, clean) { + if (err || !clean) { + throw new Error('The repository must be clean'); + } + + grunt.log.write('Updating to version ' + version); + + grunt.task.run(['build', 'tag']); + + async.each([ + ['lib/handlebars/base.js', /Handlebars.VERSION = "(.*)";/, 'Handlebars.VERSION = "' + version + '";'], + ['package.json', /"version":.*/, '"version": "' + version + '",'], + ['bower.json', /"version":.*/, '"version": "' + version + '",'], + ['handlebars.js.nuspec', /<version>.*<\/version>/, '<version>' + version + '</version>'] + ], + function(args, callback) { + replace.apply(undefined, args); + git.add(args[0], callback); + }, + done); + }); + }); + + grunt.registerTask('tag', 'Tags the current release version', function() { + var done = this.async(), + name = 'v' + grunt.config('pkg').version; + + async.series([ + function(callback) { git.add('dist/handlebars.js', callback); }, + function(callback) { git.add('dist/handlebars.runtime.js', callback); }, + function(callback) { git.commit(name, callback); }, + function(callback) { git.tag(name, callback); } + ], + done); + }); + + function replace(path, regex, replace) { + var content = grunt.file.read(path); + content = content.replace(regex, replace); + grunt.file.write(path, content); + } +}; diff --git a/tasks/util/git.js b/tasks/util/git.js new file mode 100644 index 0000000..53e0237 --- /dev/null +++ b/tasks/util/git.js @@ -0,0 +1,83 @@ +var childProcess = require('child_process'); + +module.exports = { + clean: function(callback) { + childProcess.exec('git diff-index --name-only HEAD --', {}, function(err, stdout) { + callback(undefined, !err && !stdout); + }); + }, + + commitInfo: function(callback) { + module.exports.head(function(err, headSha) { + module.exports.master(function(err, masterSha) { + module.exports.tagName(function(err, tagName) { + callback(undefined, { + head: headSha, + master: masterSha, + tagName: tagName, + isMaster: headSha === masterSha + }); + }); + }); + }); + }, + + head: function(callback) { + childProcess.exec('git rev-parse --short HEAD', {}, function(err, stdout) { + if (err) { + throw err; + } + + callback(undefined, stdout.trim()); + }); + }, + master: function(callback) { + childProcess.exec('git rev-parse --short origin/master', {}, function(err, stdout) { + if (err) { + throw err; + } + + callback(undefined, stdout.trim()); + }); + }, + + add: function(path, callback) { + childProcess.exec('git add -f ' + path, {}, function(err, stdout) { + if (err) { + throw err; + } + + callback(); + }); + }, + commit: function(name, callback) { + childProcess.exec('git commit --message=' + name, {}, function(err, stdout) { + if (err) { + throw err; + } + + callback(); + }); + }, + tag: function(name, callback) { + childProcess.exec('git tag -a --message=' + name + ' ' + name, {}, function(err, stdout, stderr) { + console.log(name, stdout, stderr); + if (err) { + throw err; + } + + callback(); + }); + }, + tagName: function(callback) { + childProcess.exec('git tag -l --points-at HEAD', {}, function(err, stdout) { + if (err) { + throw err; + } + + var tags = stdout.trim().split(/\n/), + versionTags = tags.filter(function(tag) { return /^v/.test(tag); }); + callback(undefined, versionTags[0] || tags[0]); + }); + } +}; |