svn.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. var fs = require('fs');
  2. var waterfall = require('async/waterfall');
  3. var exec = require('child_process').exec;
  4. var cliCommand = require('../cliCommand.js');
  5. var svn = {};
  6. svn.parse = function(folder, cb) {
  7. var getMeta = function(cb) {
  8. exec(cliCommand(folder, "svn info"), function(err, stdout, stderr) {
  9. if(err !== null)
  10. return cb(err);
  11. var data = {};
  12. data.type = 'svn';
  13. data.url = stdout.match(/Repository Root: ([^\n]+)/);
  14. if (data.url && typeof(data.url) === 'object') {
  15. data.url = data.url[1];
  16. }
  17. var match = stdout.match(/Relative URL: \^\/([^\n]+)/);
  18. if (match) {
  19. var relativeUrl = match[1];
  20. if (relativeUrl.match(/^trunk/)) {
  21. data.branch = 'trunk';
  22. } else if (relativeUrl.match(/^branch/)) {
  23. match = relativeUrl.match(/^branch(?:es)?\/([^/]+)(?:\/|$)/);
  24. if (match) {
  25. data.branch = match[1];
  26. }
  27. }
  28. }
  29. match = stdout.match(/Last Changed Rev: ([^\n]+)/);
  30. if (match) {
  31. data.revision = match[1];
  32. }
  33. match = stdout.match(/Last Changed Date: ([^\n]+)/);
  34. if (match) {
  35. var date = new Date(match[1]);
  36. data.update_time = date;
  37. }
  38. return cb(null, data);
  39. });
  40. }
  41. var getRevComment = function(data, cb) {
  42. var rev = data.revision || "BASE";
  43. exec(cliCommand(folder, "svn log -r " + rev), function(err, stdout, stderr) {
  44. if(err !== null)
  45. return cb(err);
  46. if (rev === "BASE") {
  47. data.revision = stdout.match(/^(r[0-9]+)\s\|/m);
  48. if (data.revision) data.revision = data.revision[1];
  49. }
  50. data.comment = stdout.match(/lines?\s*\n((.|\n)*)\n-{72}\n$/);
  51. if (data.comment) data.comment = data.comment[1].replace(/\n/g, '');
  52. if (!data.update_time) {
  53. data.update_time = stdout.match(/-+\n(.*?)\n/);
  54. if (data.update_time) data.update_time = new Date(
  55. data.update_time[1].split(" | ")[2]
  56. );
  57. }
  58. cb(null, data);
  59. });
  60. }
  61. var getDate = function(data, cb) {
  62. if (data.update_time)
  63. return cb(null, data);
  64. fs.stat(folder+".svn", function(err, stats) {
  65. if(err !== null)
  66. return cb(err);
  67. data.update_time = stats.mtime;
  68. return cb(null, data);
  69. });
  70. }
  71. waterfall([getMeta, getRevComment, getDate],
  72. function(err, data) {
  73. if (err !== null)
  74. return cb(err);
  75. return cb(null, data);
  76. });
  77. }
  78. svn.isUpdated = function(folder, cb) {
  79. var res = {};
  80. var getRev = function(str) {
  81. var matches = str.match(/Changed Rev: ([^\n]+)/);
  82. if (matches) matches = matches[1];
  83. return matches;
  84. }
  85. exec(cliCommand(folder, "svn info"), function(err, stdout, stderr) {
  86. if(err !== null)
  87. return cb(err);
  88. var current_rev = getRev(stdout);
  89. exec(cliCommand(folder, "svn info -r HEAD"), function(err, stdout, stderr) {
  90. if(err !== null)
  91. return cb(err);
  92. var recent_rev = getRev(stdout);
  93. res.is_up_to_date = (recent_rev === current_rev);
  94. res.new_revision = recent_rev;
  95. res.current_revision = current_rev;
  96. return cb(null, res);
  97. });
  98. });
  99. }
  100. svn.update = function(folder, cb) {
  101. var res = {};
  102. exec(cliCommand(folder, "svn update"), function(err, stdout, stderr) {
  103. if(err !== null)
  104. return cb(err);
  105. var new_rev = stdout.match(/Updated to revision ([^\.]+)/);
  106. if (new_rev === null)
  107. {
  108. res.success = false;
  109. var old_rev = stdout.match(/At revision ([^\.]+)/);
  110. res.current_revision = (old_rev) ? old_rev[1] : null;
  111. }
  112. else {
  113. res.success = true;
  114. res.current_revision = new_rev[1];
  115. }
  116. return cb(null, res);
  117. });
  118. }
  119. module.exports = svn;