mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-04-25 09:56:15 -04:00
bin/rebuildPad.js: Asyncify
This commit is contained in:
parent
72c2abab8d
commit
5b519b9a9c
1 changed files with 68 additions and 92 deletions
|
@ -13,7 +13,6 @@ if (process.argv.length !== 4 && process.argv.length !== 5) {
|
|||
throw new Error('Use: node bin/repairPad.js $PADID $REV [$NEWPADID]');
|
||||
}
|
||||
|
||||
const async = require('ep_etherpad-lite/node_modules/async');
|
||||
const npm = require('ep_etherpad-lite/node_modules/npm');
|
||||
const util = require('util');
|
||||
|
||||
|
@ -21,19 +20,14 @@ const padId = process.argv[2];
|
|||
const newRevHead = process.argv[3];
|
||||
const newPadId = process.argv[4] || `${padId}-rebuilt`;
|
||||
|
||||
let db, oldPad, newPad;
|
||||
let Pad, PadManager;
|
||||
(async () => {
|
||||
await util.promisify(npm.load)({});
|
||||
|
||||
async.series([
|
||||
(callback) => npm.load({}, callback),
|
||||
(callback) => {
|
||||
// Get a handle into the database
|
||||
db = require('ep_etherpad-lite/node/db/DB');
|
||||
util.callbackify(db.init)(callback);
|
||||
},
|
||||
(callback) => {
|
||||
Pad = require('ep_etherpad-lite/node/db/Pad').Pad;
|
||||
PadManager = require('ep_etherpad-lite/node/db/PadManager');
|
||||
const db = require('ep_etherpad-lite/node/db/DB');
|
||||
await db.init();
|
||||
|
||||
const Pad = require('ep_etherpad-lite/node/db/Pad').Pad;
|
||||
const PadManager = require('ep_etherpad-lite/node/db/PadManager');
|
||||
// Get references to the original pad and to a newly created pad
|
||||
// HACK: This is a standalone script, so we want to write everything
|
||||
// out to the database immediately. The only problem with this is
|
||||
|
@ -44,32 +38,20 @@ async.series([
|
|||
if (!PadManager.isValidPadId(newPadId)) {
|
||||
throw new Error('Cannot create a pad with that id as it is invalid');
|
||||
}
|
||||
util.callbackify(PadManager.doesPadExist)(newPadId, (err, exists) => {
|
||||
if (err != null) return callback(err);
|
||||
const exists = await PadManager.doesPadExist(newPadId);
|
||||
if (exists) throw new Error('Cannot create a pad with that id as it already exists');
|
||||
callback();
|
||||
});
|
||||
},
|
||||
(callback) => {
|
||||
util.callbackify(PadManager.getPad)(padId, (err, pad) => {
|
||||
if (err) return callback(err);
|
||||
oldPad = pad;
|
||||
newPad = new Pad(newPadId);
|
||||
callback();
|
||||
});
|
||||
},
|
||||
(callback) => {
|
||||
|
||||
const oldPad = await PadManager.getPad(padId);
|
||||
const newPad = new Pad(newPadId);
|
||||
|
||||
// Clone all Chat revisions
|
||||
const chatHead = oldPad.chatHead;
|
||||
for (let i = 0, curHeadNum = 0; i <= chatHead; i++) {
|
||||
db.db.get(`pad:${padId}:chat:${i}`, (err, chat) => {
|
||||
db.db.set(`pad:${newPadId}:chat:${curHeadNum++}`, chat);
|
||||
console.log(`Created: Chat Revision: pad:${newPadId}:chat:${curHeadNum}`);
|
||||
});
|
||||
}
|
||||
callback();
|
||||
},
|
||||
(callback) => {
|
||||
await Promise.all([...Array(chatHead + 1).keys()].map(async (i) => {
|
||||
const chat = await db.get(`pad:${padId}:chat:${i}`);
|
||||
await db.set(`pad:${newPadId}:chat:${i}`, chat);
|
||||
console.log(`Created: Chat Revision: pad:${newPadId}:chat:${i}`);
|
||||
}));
|
||||
|
||||
// Rebuild Pad from revisions up to and including the new revision head
|
||||
const AuthorManager = require('ep_etherpad-lite/node/db/AuthorManager');
|
||||
const Changeset = require('ep_etherpad-lite/static/js/Changeset');
|
||||
|
@ -78,23 +60,20 @@ async.series([
|
|||
// and, AFAICT, cannot be recreated any other way
|
||||
newPad.pool.numToAttrib = oldPad.pool.numToAttrib;
|
||||
for (let curRevNum = 0; curRevNum <= newRevHead; curRevNum++) {
|
||||
db.db.get(`pad:${padId}:revs:${curRevNum}`, (err, rev) => {
|
||||
const rev = await db.get(`pad:${padId}:revs:${curRevNum}`);
|
||||
if (rev.meta) {
|
||||
throw new Error('The specified revision number could not be found.');
|
||||
}
|
||||
const newRevNum = ++newPad.head;
|
||||
const newRevId = `pad:${newPad.id}:revs:${newRevNum}`;
|
||||
db.db.set(newRevId, rev);
|
||||
AuthorManager.addPad(rev.meta.author, newPad.id);
|
||||
await Promise.all([
|
||||
db.set(newRevId, rev),
|
||||
AuthorManager.addPad(rev.meta.author, newPad.id),
|
||||
]);
|
||||
newPad.atext = Changeset.applyToAText(rev.changeset, newPad.atext, newPad.pool);
|
||||
console.log(`Created: Revision: pad:${newPad.id}:revs:${newRevNum}`);
|
||||
if (newRevNum === newRevHead) {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
(callback) => {
|
||||
|
||||
// Add saved revisions up to the new revision head
|
||||
console.log(newPad.head);
|
||||
const newSavedRevisions = [];
|
||||
|
@ -105,15 +84,12 @@ async.series([
|
|||
}
|
||||
}
|
||||
newPad.savedRevisions = newSavedRevisions;
|
||||
callback();
|
||||
},
|
||||
|
||||
// Save the source pad
|
||||
(callback) => db.db.set(`pad:${newPadId}`, newPad, callback),
|
||||
(callback) => {
|
||||
await db.set(`pad:${newPadId}`, newPad);
|
||||
|
||||
console.log(`Created: Source Pad: pad:${newPadId}`);
|
||||
util.callbackify(newPad.saveToDatabase.bind(newPad))(callback);
|
||||
},
|
||||
], (err) => {
|
||||
if (err) throw err;
|
||||
await newPad.saveToDatabase();
|
||||
|
||||
console.info('finished');
|
||||
});
|
||||
})();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue