revision-string-replacer.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. var cli = require('cli')
  2. , mongo = require('mongoose')
  3. , async = require('async')
  4. ;
  5. cli.setUsage('MONGO_URI=mongodb://user:password@host/dbnae node bin/revision-string-replacer.js --from=\'aaa\' --to=\'bbb\'\n\n This means that replace string "aaa" to "bbb" from all revisions.');
  6. cli.parse({
  7. from: [false, 'Specified string is a target to replace.', 'string'],
  8. to: [false, 'Replace string which specified by "from" to this string.', 'string'],
  9. dry: [false, 'Dry run', 'boolean'],
  10. });
  11. cli.main(function(args, options)
  12. {
  13. var app = {set: function(v) { }}
  14. , c = this
  15. , from = options.from
  16. , to = options.to
  17. , dry = options.dry
  18. ;
  19. if (!to || !from) {
  20. cli.error('"to" and "from" options are required.\n');
  21. cli.output(cli.getUsage());
  22. cli.exit(1);
  23. return ;
  24. }
  25. var mongoUri = process.env.MONGOLAB_URI || process.env.MONGOHQ_URL || process.env.MONGO_URI || false;
  26. if (!mongoUri) {
  27. cli.error('Please set MONGO_URI env.\n');
  28. cli.output(cli.getUsage());
  29. cli.exit(1);
  30. return;
  31. }
  32. mongo.connect(mongoUri);
  33. // あー config 読み込み&model読み込み周りを app.js から切り離さないといけないにゃぁ
  34. configModel = require('../lib/models/config')(app);
  35. async.series([
  36. function (next) {
  37. configModel.loadAllConfig(function(err, doc) {
  38. return next();
  39. });
  40. }, function (next) {
  41. var config = app.set('config');
  42. models = require('../lib/models')(app);
  43. models.Config = configModel;
  44. return next();
  45. }, function (next) {
  46. var limit = 100000;
  47. c.spinner('Load revisions..');
  48. models.Revision.find().limit(limit).exec(function(err, revs) {
  49. c.spinner('Load revisions.. done!\n', true);
  50. var count = Object.keys(revs).length
  51. , i = 0
  52. , matched = 0
  53. , matchedWords = 0
  54. ;
  55. c.output('Found ' + count + ' revisions.\n');
  56. c.output('Start replacing.\n');
  57. async.each(revs, function(rev, cb) {
  58. var regexp = new RegExp(from, 'g');
  59. c.progress(++i/count);
  60. var m = rev.body.match(regexp);
  61. if (!m) {
  62. return cb();
  63. }
  64. matched++;
  65. matchedWords += m.length;
  66. if (dry) {
  67. return cb();
  68. } else {
  69. rev.body = rev.body.replace(regexp, to);
  70. rev.save(function(err, s) {
  71. if (err) {
  72. c.error('Error on:' + rev.path);
  73. } else {
  74. }
  75. return cb();
  76. });
  77. }
  78. }, function(err) {
  79. if (dry) {
  80. cli.info(matchedWords + ' words in (' + matched + ' of ' + count + ') revisions will be replaced!');
  81. } else {
  82. cli.ok(matchedWords + ' words in (' + matched + ' of ' + count + ') revisions replaced!');
  83. }
  84. return next();
  85. });
  86. });
  87. }
  88. , function (next) {
  89. cli.ok('Finished!');
  90. mongo.disconnect();
  91. return next();
  92. }
  93. ]);
  94. });