123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- 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];
- }
- var match = stdout.match(/Relative URL: \^\/([^\n]+)/);
- if (match) {
- var relativeUrl = match[1];
- if (relativeUrl.match(/^trunk/)) {
- data.branch = 'trunk';
- } else if (relativeUrl.match(/^branch/)) {
- match = relativeUrl.match(/^branch(?:es)?\/([^/]+)(?:\/|$)/);
- if (match) {
- data.branch = match[1];
- }
- }
- }
- match = stdout.match(/Last Changed Rev: ([^\n]+)/);
- if (match) {
- data.revision = match[1];
- }
- match = stdout.match(/Last Changed Date: ([^\n]+)/);
- if (match) {
- var date = new Date(match[1]);
- data.update_time = date;
- }
- return cb(null, data);
- });
- }
- var getRevComment = function(data, cb) {
- var rev = data.revision || "BASE";
- exec(cliCommand(folder, "svn log -r " + rev), function(err, stdout, stderr) {
- if(err !== null)
- return cb(err);
- if (rev === "BASE") {
- data.revision = stdout.match(/^(r[0-9]+)\s\|/m);
- if (data.revision) data.revision = data.revision[1];
- }
- data.comment = stdout.match(/lines?\s*\n((.|\n)*)\n-{72}\n$/);
- if (data.comment) data.comment = data.comment[1].replace(/\n/g, '');
- if (!data.update_time) {
- data.update_time = stdout.match(/-+\n(.*?)\n/);
- if (data.update_time) data.update_time = new Date(
- data.update_time[1].split(" | ")[2]
- );
- }
- cb(null, data);
- });
- }
- var getDate = function(data, cb) {
- if (data.update_time)
- return cb(null, data);
- 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;
|