Merge branch 'upgrade-progress-bar' into develop

v1.18.x
Julian Lam 8 years ago
commit 7a0db03d99

@ -21,6 +21,17 @@ exports.processSortedSet = function (setKey, process, options, callback) {
return callback(new Error('[[error:process-not-a-function]]'));
}
// Progress bar handling (upgrade scripts)
if (options.progress) {
db.sortedSetCard(setKey, function (err, total) {
if (err) {
// Unable to get total, do nothing.
} else {
options.progress.total = total;
}
});
}
// use the fast path if possible
if (db.processSortedSet && typeof options.doneIf !== 'function' && !utils.isNumber(options.alwaysStartAt)) {
return db.processSortedSet(setKey, process, options.batch || DEFAULT_BATCH_SIZE, callback);
@ -53,6 +64,7 @@ exports.processSortedSet = function (setKey, process, options, callback) {
}
start += utils.isNumber(options.alwaysStartAt) ? options.alwaysStartAt : batch + 1;
stop = start + batch;
next();
});
});

@ -7,7 +7,7 @@ var path = require('path');
var semver = require('semver');
var db = require('./database');
var utils = require('../public/src/utils');
var file = require('../src/file');
/*
* Need to write an upgrade script for NodeBB? Cool.
@ -23,7 +23,7 @@ var Upgrade = {};
Upgrade.getAll = function (callback) {
async.waterfall([
async.apply(utils.walk, path.join(__dirname, './upgrades')),
async.apply(file.walk, path.join(__dirname, './upgrades')),
function (files, next) {
// Sort the upgrade scripts based on version
var versionA;
@ -93,7 +93,7 @@ Upgrade.runSingle = function (query, callback) {
process.stdout.write('\nParsing upgrade scripts... ');
async.waterfall([
async.apply(utils.walk, path.join(__dirname, './upgrades')),
async.apply(file.walk, path.join(__dirname, './upgrades')),
function (files, next) {
next(null, files.filter(function (file) {
return path.basename(file, '.js') === query;
@ -123,6 +123,13 @@ Upgrade.process = function (files, skipCount, callback) {
var scriptExport = require(file);
var date = new Date(scriptExport.timestamp);
var version = path.dirname(file).split('/').pop();
var progress = {
current: 0,
total: 0,
incr: Upgrade.incrementProgress,
script: scriptExport,
date: date,
};
process.stdout.write(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '... ');
@ -134,11 +141,20 @@ Upgrade.process = function (files, skipCount, callback) {
}
// Do the upgrade...
scriptExport.method(function (err) {
scriptExport.method.bind({
progress: progress,
})(function (err) {
if (err) {
process.stdout.write('error\n'.red);
return next(err);
}
if (progress.total > 0) {
process.stdout.clearLine();
process.stdout.cursorTo(0);
process.stdout.write(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '... ');
}
process.stdout.write('OK\n'.green);
// Record success in schemaLog
db.sortedSetAdd('schemaLog', Date.now(), path.basename(file, '.js'), next);
@ -152,4 +168,23 @@ Upgrade.process = function (files, skipCount, callback) {
], callback);
};
Upgrade.incrementProgress = function () {
this.current += 1;
// Redraw the progress bar
var percentage = 0;
var filled = 0;
var unfilled = 15;
if (this.total) {
percentage = Math.floor((this.current / this.total) * 100) + '%';
filled = Math.floor((this.current / this.total) * 15);
unfilled = 15 - filled;
}
process.stdout.clearLine();
process.stdout.cursorTo(0);
process.stdout.write(' → '.white + String('[' + [this.date.getUTCFullYear(), this.date.getUTCMonth() + 1, this.date.getUTCDate()].join('/') + '] ').gray + String(this.script.name).reset + '... ');
process.stdout.write('[' + (filled ? new Array(filled).join('#') : '') + new Array(unfilled).join(' ') + '] (' + this.current + '/' + (this.total || '??') + ') ' + percentage);
};
module.exports = Upgrade;

@ -12,6 +12,7 @@ module.exports = {
timestamp: Date.UTC(2016, 0, 14),
method: function (callback) {
var batch = require('../../batch');
var progress = this.progress;
batch.processSortedSet('posts:pid', function (ids, next) {
async.eachSeries(ids, function (id, next) {
@ -24,8 +25,11 @@ module.exports = {
}
winston.verbose('processing pid: ' + postData.pid + ' uid: ' + postData.uid + ' votes: ' + postData.votes);
db.sortedSetAdd('uid:' + postData.uid + ':posts:votes', postData.votes, postData.pid, next);
progress.incr();
});
}, next);
}, {}, callback);
}, {
progress: progress,
}, callback);
},
};

@ -14,6 +14,8 @@ module.exports = {
var batch = require('../../batch');
var posts = require('../../posts');
var count = 0;
var progress = this.progress;
batch.processSortedSet('posts:pid', function (pids, next) {
winston.verbose('upgraded ' + count + ' posts');
count += pids.length;
@ -43,8 +45,12 @@ module.exports = {
} else {
next();
}
progress.incr();
}, next);
}, next);
}, {}, callback);
}, {
progress: progress,
}, callback);
},
};

@ -10,11 +10,15 @@ module.exports = {
name: 'Favourites to Bookmarks',
timestamp: Date.UTC(2016, 9, 8),
method: function (callback) {
var progress = this.progress;
function upgradePosts(next) {
var batch = require('../../batch');
batch.processSortedSet('posts:pid', function (ids, next) {
async.each(ids, function (id, next) {
progress.incr();
async.waterfall([
function (next) {
db.rename('pid:' + id + ':users_favourited', 'pid:' + id + ':users_bookmarked', next);
@ -34,7 +38,9 @@ module.exports = {
},
], next);
}, next);
}, {}, next);
}, {
progress: progress,
}, next);
}
function upgradeUsers(next) {

@ -13,12 +13,16 @@ module.exports = {
method: function (callback) {
var posts = require('../../posts');
var batch = require('../../batch');
var progress = this.progress;
batch.processSortedSet('posts:pid', function (ids, next) {
posts.getPostsFields(ids, ['pid', 'toPid', 'timestamp'], function (err, data) {
if (err) {
return next(err);
}
progress.incr();
async.eachSeries(data, function (postData, next) {
if (!parseInt(postData.toPid, 10)) {
return next(null);
@ -30,6 +34,8 @@ module.exports = {
], next);
}, next);
});
}, {
progress: progress,
}, callback);
},
};

@ -13,6 +13,7 @@ module.exports = {
var batch = require('../../batch');
var posts = require('../../posts');
var flags = require('../../flags');
var progress = this.progress;
batch.processSortedSet('posts:pid', function (ids, next) {
posts.getPostsByPids(ids, 1, function (err, posts) {
@ -80,10 +81,14 @@ module.exports = {
} else {
next(err);
}
progress.incr();
});
});
}, next);
});
}, {
progress: this.progress,
}, callback);
},
};

@ -11,6 +11,8 @@ module.exports = {
name: 'Update moderation notes to zset',
timestamp: Date.UTC(2017, 2, 22),
method: function (callback) {
var progress = this.progress;
batch.processSortedSet('users:joindate', function (ids, next) {
async.each(ids, function (uid, next) {
db.getObjectField('user:' + uid, 'moderationNote', function (err, moderationNote) {
@ -22,9 +24,13 @@ module.exports = {
note: moderationNote,
timestamp: Date.now(),
};
progress.incr();
db.sortedSetAdd('uid:' + uid + ':moderation:notes', note.timestamp, JSON.stringify(note), next);
});
}, next);
}, {
progress: this.progress,
}, callback);
},
};

@ -10,6 +10,8 @@ module.exports = {
name: 'New sorted set posts:votes',
timestamp: Date.UTC(2017, 1, 27),
method: function (callback) {
var progress = this.progress;
require('../../batch').processSortedSet('posts:pid', function (pids, next) {
async.each(pids, function (pid, next) {
db.getObjectFields('post:' + pid, ['upvotes', 'downvotes'], function (err, postData) {
@ -17,10 +19,13 @@ module.exports = {
return next(err);
}
progress.incr();
var votes = parseInt(postData.upvotes || 0, 10) - parseInt(postData.downvotes || 0, 10);
db.sortedSetAdd('posts:votes', votes, pid, next);
});
}, next);
}, {}, callback);
}, {
progress: this.progress,
}, callback);
},
};

Loading…
Cancel
Save