diff --git a/package.json b/package.json index 83b5cbb6..b50a3ba0 100644 --- a/package.json +++ b/package.json @@ -29,12 +29,18 @@ "url": "https://github.com/amsul/pickadate.js.git" }, "scripts": { + "prebump": "npm test", + "bump": "node ./version-bump.js", + "postbump": "grunt package && node ./version-commit.js", + "push": "git push && git push origin --tags && npm publish", "test": "grunt test --verbose" }, "dependencies": { "jquery": ">=1.7" }, "devDependencies": { + "commander": "^2.8.0", + "glob": "^5.0.5", "grunt": "^0.4.5", "grunt-autoprefixer": "^3.0.0", "grunt-contrib-copy": "^0.8.0", @@ -45,6 +51,8 @@ "grunt-contrib-uglify": "^0.9.1", "grunt-contrib-watch": "^0.6.1", "phantomjs": "^1.9.16", + "semver": "^4.3.3", + "shelljs": "^0.4.0", "zlib-browserify": "0.0.3" } -} +} \ No newline at end of file diff --git a/version-bump.js b/version-bump.js new file mode 100644 index 00000000..807a3d9f --- /dev/null +++ b/version-bump.js @@ -0,0 +1,78 @@ +/*jshint node: true*/ + +var program = require('commander') +var semver = require('semver') +var grunt = require('grunt') +var glob = require('glob').sync + + +program + .option('-p, --patch', 'set the version as the next patch') + .option('-m, --minor', 'set the version as the next minor') + .option('-M, --major', 'set the version as the next major') + .parse(process.argv) + + +if (program.patch) { + bumpVersion('patch') + return +} + +if (program.minor) { + bumpVersion('minor') + return +} + +if (program.major) { + bumpVersion('major') + return +} + +grunt.fail.fatal('No release type specified') +return + + +function bumpVersion(release) { + grunt.log.writeln('Bumping package version by a ' + release) + var version = readPackageVersion() + grunt.log.writeln('Current package version: ' + version) + version = semver.inc(version, release) + grunt.log.writeln('Updated package version: ' + version) + writePackageVersion(version) + grunt.log.writeln('Done updating the package version') + updateLibraryFiles(version) + grunt.log.writeln('Done updating the library files') +} + + +function readPackageVersion() { + var pkg = require('./package') + return pkg.version +} + + +function writePackageVersion(version) { + var pkg = require('./package') + pkg.version = version + grunt.file.write('./package.json', JSON.stringify(pkg, null, ' ')) +} + + +function updateLibraryFiles(version) { + + var versionRegex = /^(\s*\/\*![^\/]+?v)(\d+\.\d+\.\d+)(([^\n]+?)(\d+\/\d+\/\d+))?/ + var today = grunt.template.today('yyyy/mm/dd') + var files = glob('lib/*.js') + + files.forEach(updateLibraryFile) + + function updateLibraryFile(filePath) { + var content = grunt.file.read(filePath) + if (versionRegex.test(content)) { + content = content.split(versionRegex) + content = content[1] + version + (content[4] || '') + (content[5] ? today : '') + (content[6] || '') + } + grunt.file.write(filePath, content) + } + +} \ No newline at end of file diff --git a/version-commit.js b/version-commit.js new file mode 100644 index 00000000..eefe3b91 --- /dev/null +++ b/version-commit.js @@ -0,0 +1,24 @@ +/*jshint node: true*/ + +var grunt = require('grunt') +var exec = require('shelljs').exec + +var pkg = require('./package') + + +var isSuccessful = commitAndTag(pkg.version) +if (!isSuccessful) { + grunt.fail.fatal('Unable to commit and tag version') +} + +return + + +function commitAndTag(version) { + var code = exec([ + 'git add .', + 'git commit -m "Release v' + version + '"', + 'git tag ' + version, + ].join(' && ')).code + return !code +} \ No newline at end of file