diff --git a/script/railcar b/script/railcar new file mode 100755 index 000000000..fa3fca2cb --- /dev/null +++ b/script/railcar @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +var fs = require('fs') +var exec = require('child_process').exec +var series = require('async').series +var semver = require('semver') + +series([ + section('Preparing to roll the railcars'), + checkCleanWorkingTree, + run('git fetch origin master:master beta:beta stable:stable'), + run('git fetch origin --tags'), + + section('Updating stable branch'), + run('git checkout stable'), + run('git merge --ff-only origin/stable'), + run('git merge --ff-only origin/beta'), + bumpStableVersion, + + section('Updating beta branch'), + run('git checkout beta'), + run('git merge --ff-only origin/beta'), + run('git merge --ff-only origin/master'), + run('git merge --strategy ours origin/stable'), + bumpBetaVersion, + + section('Updating master branch'), + run('git checkout master'), + run('git merge --ff-only origin/master'), + run('git merge --strategy ours origin/beta'), + bumpDevVersion, + + section('Pushing changes upstream'), + run('git push origin master:master beta:beta stable:stable'), + run('git push origin --tags') +], finish) + +function checkCleanWorkingTree (next) { + run('git status --porcelain')(function (error, output) { + if (error) return next(error) + if (output.trim().length > 0) return next(new Error('Cannot run the railcars with a dirty working tree')) + next() + }) +} + +function bumpStableVersion (next) { + run('npm version patch')(next) +} + +function bumpBetaVersion (next) { + var newVersion = semver.inc(getCurrentVersion(), 'prerelease', 'beta') + run('npm version ' + newVersion)(next) +} + +function bumpDevVersion (next) { + var newVersion = semver.inc(getCurrentVersion(), 'preminor', 'dev') + series([ + run('npm --no-git-tag-version version ' + newVersion), + run('git commit -am "' + newVersion + '"') + ], next) +} + +function finish (error) { + if (error) { + console.log('Error: ' + error.message) + process.exit(1) + } + + console.log('OK, now just wait for all CI builds to pass on beta and stable') +} + +function getCurrentVersion () { + return JSON.parse(fs.readFileSync(require.resolve('../package.json'))).version +} + +function run (command) { + return function (next) { + console.log('>', command) + exec(command, next) + } +} + +function section (message) { + return function (next) { + console.log() + console.log(message) + next() + } +}