forked from enviPath/enviPy
109 lines
2.8 KiB
JavaScript
109 lines
2.8 KiB
JavaScript
var exec = require('child_process').exec;
|
|
var logger = require('./logger')();
|
|
|
|
function fetchGitData(git, cb) {
|
|
if (!cb){
|
|
throw new Error("fetchGitData requires a callback");
|
|
}
|
|
|
|
//-- Malformed/undefined git object
|
|
if ('undefined' === typeof git) {
|
|
return cb(new Error('No options passed'));
|
|
}
|
|
if (!git.hasOwnProperty('head')) {
|
|
return cb(new Error('You must provide the head'));
|
|
}
|
|
if (!git.head.hasOwnProperty('id')) {
|
|
return cb(new Error('You must provide the head.id'));
|
|
}
|
|
|
|
//-- Set required properties of git if they weren"t provided
|
|
if (!git.hasOwnProperty("branch")) {
|
|
git.branch = "";
|
|
}
|
|
if (!git.hasOwnProperty("remotes")) {
|
|
git.remotes = [];
|
|
}
|
|
|
|
//-- Assert the property types
|
|
if ("string" !== typeof git.branch) {
|
|
git.branch = "";
|
|
}
|
|
if (!(git.remotes instanceof Array)) {
|
|
git.remotes = [];
|
|
}
|
|
|
|
//-- Use git?
|
|
exec("git rev-parse --verify " + git.head.id, function(err, response){
|
|
if (err){
|
|
// git is not available...
|
|
git.head.author_name = git.head.author_name || "Unknown Author";
|
|
git.head.author_email = git.head.author_email || "";
|
|
git.head.committer_name = git.head.committer_name || "Unknown Committer";
|
|
git.head.committer_email = git.head.committer_email || "";
|
|
git.head.message = git.head.message || "Unknown Commit Message";
|
|
return cb(null, git);
|
|
}
|
|
|
|
fetchHeadDetails(git, cb);
|
|
});
|
|
}
|
|
|
|
function fetchBranch(git, cb) {
|
|
exec("git branch", function(err, branches){
|
|
if (err)
|
|
return cb(err);
|
|
|
|
git.branch = (branches.match(/^\* (\w+)/) || [])[1];
|
|
fetchRemotes(git, cb);
|
|
});
|
|
}
|
|
|
|
var REGEX_COMMIT_DETAILS = /\nauthor (.+?) <([^>]*)>.+\ncommitter (.+?) <([^>]*)>.+[\S\s]*?\n\n(.*)/m;
|
|
|
|
function fetchHeadDetails(git, cb) {
|
|
exec('git cat-file -p ' + git.head.id, function(err, response) {
|
|
if (err)
|
|
return cb(err);
|
|
|
|
var items = response.match(REGEX_COMMIT_DETAILS).slice(1);
|
|
var fields = ['author_name', 'author_email', 'committer_name', 'committer_email', 'message'];
|
|
fields.forEach(function(field, index) {
|
|
git.head[field] = items[index];
|
|
});
|
|
|
|
if (git.branch) {
|
|
fetchRemotes(git, cb);
|
|
} else {
|
|
fetchBranch(git, cb);
|
|
}
|
|
});
|
|
}
|
|
|
|
function fetchRemotes(git, cb) {
|
|
exec("git remote -v", function(err, remotes){
|
|
if (err)
|
|
return cb(err);
|
|
|
|
var processed = {};
|
|
remotes.split("\n").forEach(function(remote) {
|
|
if (!/\s\(push\)$/.test(remote))
|
|
return;
|
|
remote = remote.split(/\s+/);
|
|
saveRemote(processed, git, remote[0], remote[1]);
|
|
});
|
|
cb(null, git);
|
|
});
|
|
}
|
|
|
|
function saveRemote(processed, git, name, url) {
|
|
var key = name + "-" + url;
|
|
if (processed.hasOwnProperty(key))
|
|
return;
|
|
|
|
processed[key] = true;
|
|
git.remotes.push({ name: name, url: url });
|
|
}
|
|
|
|
module.exports = fetchGitData;
|