chamber
Version:
Javascript modules for the node and the browser
161 lines (147 loc) • 4.82 kB
JavaScript
var _ = module.exports = require('underscore');
_.Q = require('q');
_.path = require('path');
_.fs = require('fs');
_.semver = require('semver');
_.str = require('underscore.string');
var spawn = require('child_process').spawn;
var fsReadFile = _.Q.denodeify(_.fs.readFile);
var fsWriteFile = _.Q.denodeify(_.fs.writeFile);
var fsReaddir = _.Q.denodeify(_.fs.readdir);
var fsReadFileUtf8 = function(fileName) {
return fsReadFile(fileName, { encoding: 'utf8' });
}
var fsWriteFileUtf8 = function(fileName, fileDataString) {
return fsWriteFile(fileName, fileDataString, { encoding: 'utf8' });
}
var fsReadJson = function(fileName) {
return fsReadFileUtf8(fileName).then(function(fileString) {
return JSON.parse(fileString);
});
}
var fsWriteJson = function(fileName, data) {
return fsWriteFileUtf8(fileName, JSON.stringify(data, null, 2));
}
function exec(command, args, opts) {
console.log('STARTING EXEC ', command, args);
var doExec = _.Q.defer();
var process = spawn(command, args, opts);
var output = {
stdout: '',
stderr: ''
}
process.stdout.on('data', function (data) {
output.stdout += data;
});
process.stderr.on('data', function (data) {
output.stderr += data;
});
process.on('close', function (code) {
output.code = code;
console.log('EXEC RESPONSE ', command, args, output);
if (code == 0) doExec.resolve(output);
else doExec.reject(output);
});
return doExec.promise;
}
_.packageJsonGet = function packageJsonGet(projectPath) {
var packageJsonFileLocation = _.path.join(projectPath, 'package.json');
return fsReadJson(packageJsonFileLocation).then(function(packageJson) {
return packageJson;
});
}
_.packageJsonSave = function packageJsonSave(projectPath, packageJson) {
var packageJsonFileLocation = _.path.join(projectPath, 'package.json');
return fsWriteJson(packageJsonFileLocation, packageJson);
}
_.versionGet = function versionGet() {
return _.packageJsonGet().then(function(packageJson) {
return packageJson.version;
});
}
_.versionSet = function versionSet(version) {
return _.packageJsonGet().then(function(packageJson) {
packageJson.version = version;
return _.packageJsonSave(packageJson);
});
}
_.versionIncr = function versionIncr(type) {
// type can be major, minor, patch, or prerelase (from semver)
return _.packageJsonGet().then(function(packageJson) {
var version = packageJson.version;
packageJson.version = _.semver.inc(version, type);
return _.packageJsonSave(packageJson);
});
}
_.tagsGet = function getTags() {
return exec('git', ['tag'], {
cwd: mainRepoFolder
}).then(function(results) {
var out = results.stdout;
var tags = out.split('\n');
tags = _.filter(tags, function(tag) {
if (_.isString(tag) && tag != '') return true;
});
return tags;
});
}
_.tagsMake = function tagsMake(repoPath, tagName) {
function tagsMakeDone(out) {
if (out.code == 0) return;
else if (_.str.include(out.stderr, 'already exists')) throw new Error(out.stderr);
else throw new Error('unexpected!');
}
return exec('git', ['tag', tagName], {
cwd: repoPath
}).then(tagsMakeDone, tagsMakeDone);
}
_.tagsRemove = function tagsRemove(repoPath, tagName) {
function tagsRemoveDone(out) {
if (out.code == 0) return;
else if (_.str.include(out.stderr, 'not found')) throw new Error(out.stderr);
else throw new Error('unexpected!');
}
return exec('git', ['tag', '-d', tagName], {
cwd: repoPath
}).then(tagsRemoveDone, tagsRemoveDone);
}
_.checkIfGitRepo = function checkIfGitRepo(path) {
return fsReaddir(path).then(function(files) {
return _.include(files, '.git');
});
}
_.getRepo = function getRepo(path) {
if(!path) path = process.cwd();
return _.checkIfGitRepo(path).then(function(isRepo) {
if (isRepo) return path;
else {
if (path == '/') return false;
var parentPath = _.path.join(path, '..');
return _.getRepo(parentPath);
}
});
}
_.getRepoName = function getRepoName(path) {
return _.getRepo(path).then(function(repoPath) {
if (repoPath) return _.path.basename(repoPath);
});
}
_.getBranchName = function getBranchName(path) {
function tagsRemoveDone(out) {
if (out.code == 0) return out.stdout.trim();
else if (_.str.include(out.stderr, 'not found')) throw new Error(out.stderr);
else throw new Error('unexpected!');
}
return exec('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
cwd: path
}).then(tagsRemoveDone, tagsRemoveDone);
}
_.checkPush = function checkPush(repoPath, remote, branch) {
function checkPushDone(out) {
if (out.code == 0) return;
else throw new Error(out.stderr);
}
return exec('git', ['push', '-n', remote, branch], {
cwd: repoPath
}).then(checkPushDone, checkPushDone);
}