Current File : //lib/node_modules/pm2/node_modules/vizion/lib/svn/svn.js |
var fs = require('fs');
var waterfall = require('async/waterfall');
var exec = require('child_process').exec;
var cliCommand = require('../cliCommand.js');
var svn = {};
svn.parse = function(folder, cb) {
var getMeta = function(cb) {
exec(cliCommand(folder, "svn info"), function(err, stdout, stderr) {
if(err !== null)
return cb(err);
var data = {};
data.type = 'svn';
data.url = stdout.match(/Repository Root: ([^\n]+)/);
if (data.url && typeof(data.url) === 'object') {
data.url = data.url[1];
data.branch = typeof(data.url) === 'string' ? data.url.match(/[^/]+$/) : null;
}
if (data.branch) data.branch = data.branch[0];
return cb(null, data);
});
}
var getRevComment = function(data, cb) {
exec(cliCommand(folder, "svn log -r BASE"), function(err, stdout, stderr) {
if(err !== null)
return cb(err);
data.revision = stdout.match(/^(r[0-9]+)\s\|/m);
data.comment = stdout.match(/lines?\s*\n((.|\n)*)\n-{72}\n$/);
if (data.revision) data.revision = data.revision[1];
if (data.comment) data.comment = data.comment[1].replace(/\n/g, '');
cb(null, data);
});
}
var getDate = function(data, cb) {
fs.stat(folder+".svn", function(err, stats) {
if(err !== null)
return cb(err);
data.update_time = stats.mtime;
return cb(null, data);
});
}
waterfall([getMeta, getRevComment, getDate],
function(err, data) {
if (err !== null)
return cb(err);
return cb(null, data);
});
}
svn.isUpdated = function(folder, cb) {
var res = {};
var getRev = function(str) {
var matches = str.match(/Changed Rev: ([^\n]+)/);
if (matches) matches = matches[1];
return matches;
}
exec(cliCommand(folder, "svn info"), function(err, stdout, stderr) {
if(err !== null)
return cb(err);
var current_rev = getRev(stdout);
exec(cliCommand(folder, "svn info -r HEAD"), function(err, stdout, stderr) {
if(err !== null)
return cb(err);
var recent_rev = getRev(stdout);
res.is_up_to_date = (recent_rev === current_rev);
res.new_revision = recent_rev;
res.current_revision = current_rev;
return cb(null, res);
});
});
}
svn.update = function(folder, cb) {
var res = {};
exec(cliCommand(folder, "svn update"), function(err, stdout, stderr) {
if(err !== null)
return cb(err);
var new_rev = stdout.match(/Updated to revision ([^\.]+)/);
if (new_rev === null)
{
res.success = false;
var old_rev = stdout.match(/At revision ([^\.]+)/);
res.current_revision = (old_rev) ? old_rev[1] : null;
}
else {
res.success = true;
res.current_revision = new_rev[1];
}
return cb(null, res);
});
}
module.exports = svn;