diff options
-rw-r--r-- | Gruntfile.js | 3 | ||||
-rw-r--r-- | Rakefile | 32 | ||||
-rw-r--r-- | package.json | 5 | ||||
-rw-r--r-- | tasks/release.js | 62 | ||||
-rw-r--r-- | tasks/util/git.js | 83 |
5 files changed, 151 insertions, 34 deletions
diff --git a/Gruntfile.js b/Gruntfile.js index 8fed742..a347600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -88,5 +88,6 @@ module.exports = function(grunt) { }); }); - grunt.registerTask('default', ['jshint', 'parser', 'dist-dir', 'concat', 'uglify', 'test']); + grunt.registerTask('build', ['jshint', 'parser', 'dist-dir', 'concat', 'uglify', 'test']); + grunt.registerTask('default', 'build'); }; @@ -7,38 +7,6 @@ task :build do |task| system "grunt" end -# Updates the various version numbers. -desc "Updates the current release version" -task :version, [:version] => [] do |task, args| - version = args.version - fail "Must provide a version number" unless version - - changed = %x{git diff-index --name-only HEAD --} - fail "The repository must be clean" unless $?.success? && changed.empty? - - puts "Updating to version #{version}" - - content = File.read("lib/handlebars/base.js") - File.open("lib/handlebars/base.js", "w") do | file| - file.puts content.gsub(/Handlebars.VERSION = "(.*)";/, "Handlebars.VERSION = \"#{version}\";") - end - - content = File.read("bower.json") - File.open("bower.json", "w") do |file| - file.puts content.gsub(/"version":.*/, "\"version\": \"#{version}\",") - end - - content = File.read("handlebars.js.nuspec") - File.open("handlebars.js.nuspec", "w") do |file| - file.puts content.gsub(/<version>.*<\/version>/, "<version>#{version}</version>") - end - - Rake::Task[:build].invoke - - # TODO : Make sure that all of these files are updated properly in git then run npm version -end - - directory "vendor" desc "benchmark against dust.js and mustache.js" diff --git a/package.json b/package.json index 78691e4..d67f68e 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "uglify-js": "~2.3" }, "devDependencies": { + "async": "~0.2.9", "benchmark": "~1.0", "dust": "~0.3", "grunt": "~0.4.1", @@ -30,7 +31,9 @@ "jison": "~0.3", "mocha": "*", "mustache": "~0.7.2", - "should": "~1.2.2" + "semver": "~2.1.0", + "should": "~1.2.2", + "underscore": "~1.5.1" }, "main": "lib/handlebars.js", "bin": { 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]); + }); + } +}; |