blob: d4f029bffdb760b21ff9e9b7353b408d66c71402 [file] [log] [blame]
/*
* Jake JavaScript build tool
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
var fs = require('fs')
, exec = require('child_process').exec
, utils = require('utilities')
, currDir = process.cwd();
var NpmPublishTask = function (name, packageFiles) {
this.name = name;
this.packageFiles = packageFiles;
this.define();
};
NpmPublishTask.prototype = new (function () {
var _currentBranch = null;
var getPackage = function () {
var pkg = JSON.parse(fs.readFileSync(process.cwd() + '/package.json').toString());
return pkg;
}
, getPackageVersionNumber = function () {
return getPackage().version;
};
this.define = function () {
var self = this;
namespace('npm', function () {
task('fetchTags', {async: true}, function () {
// Make sure local tags are up to date
cmds = [
'git fetch --tags'
];
jake.exec(cmds, function () {
console.log('Fetched remote tags.');
complete();
});
});
task('getCurrentBranch', {async: true}, function () {
// Figure out what branch to push to
exec('git symbolic-ref --short HEAD',
function (err, stdout, stderr) {
if (err) {
fail(err);
}
if (stderr) {
fail(new Error(stderr));
}
if (!stdout) {
fail(new Error('No current Git branch found'));
}
_currentBranch = utils.string.trim(stdout);
console.log('On branch ' + _currentBranch);
complete();
});
});
task('version', {async: true}, function () {
// Only bump, push, and tag if the Git repo is clean
exec('git status --porcelain --untracked-files=no',
function (err, stdout, stderr) {
var cmds
, path
, pkg
, version
, arr
, patch
, message;
if (err) {
fail(err);
}
if (stderr) {
fail(new Error(stderr));
}
if (stdout.length) {
fail(new Error('Git repository is not clean.'));
}
// Grab the current version-string
path = process.cwd() + '/package.json';
pkg = getPackage();
version = pkg.version;
// Increment the patch-number for the version
arr = version.split('.');
patch = parseInt(arr.pop(), 10) + 1;
arr.push(patch);
version = arr.join('.');
// New package-version
pkg.version = version;
// Commit-message
message = 'Version ' + version
// Update package.json with the new version-info
fs.writeFileSync(path, JSON.stringify(pkg, true, 2));
cmds = [
'git commit package.json -m "' + message + '"'
, 'git push origin ' + _currentBranch
, 'git tag -a v' + version + ' -m "' + message + '"'
, 'git push --tags'
];
jake.exec(cmds, function () {
var version = getPackageVersionNumber();
console.log('Bumped version number to v' + version + '.');
complete();
});
});
});
task('definePackage', function () {
var version = getPackageVersionNumber()
, t;
t = new jake.PackageTask(self.name, 'v' + version, function () {
this.packageFiles.include(self.packageFiles);
this.needTarGz = true;
});
});
task('package', {async: true}, function () {
var definePack = jake.Task['npm:definePackage']
, pack = jake.Task['package']
, version = getPackageVersionNumber();
// May have already been run
definePack.reenable(true);
definePack.addListener('complete', function () {
pack.addListener('complete', function () {
console.log('Created package for ' + self.name + ' v' + version);
complete();
});
pack.invoke();
});
definePack.invoke();
});
task('publish', {async: true}, function () {
var version = getPackageVersionNumber();
console.log('Publishing ' + self.name + ' v' + version);
cmds = [
'npm publish pkg/' + self.name + '-v' + version + '.tar.gz'
];
// Hackity hack -- NPM publish sometimes returns errror like:
// Error sending version data\nnpm ERR!
// Error: forbidden 0.2.4 is modified, should match modified time
setTimeout(function () {
jake.exec(cmds, function () {
console.log('Published to NPM');
complete();
}, {stdout: true});
}, 5000);
});
task('cleanup', function () {
var clobber = jake.Task['clobber'];
clobber.reenable(true);
clobber.invoke();
console.log('Cleaned up package');
});
});
desc('Bump version-number, package, and publish to NPM.');
task('publish', ['npm:fetchTags', 'npm:getCurrentBranch', 'npm:version',
'npm:package', 'npm:publish', 'npm:cleanup'], function () {});
jake.Task['npm:definePackage'].invoke();
};
})();
jake.NpmPublishTask = NpmPublishTask;
exports.NpmPublishTask = NpmPublishTask;