mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-04-24 09:26:14 -04:00
bugfix, lint and refactor all bin scripts (#4617)
* bugfix, lint and refactor all bin scripts * for squash: throw Error(message) rather than log(message); throw Error() * for squash: Exit non-0 on unhandled Promise rejection Many of the recent lint changes have converted normal functions to async functions, and an error thrown in an async function does not cause Node.js to exit by default. * for squash: fix `require()` paths * for squash: remove erroneous `Object.keys()` call * for squash: fix missing `continue` statements * for squash: Fix HTTP method for deleteSession * for squash: delete erroneous throw Throw is only for errors, not successful completion. * for squash: redo migrateDirtyDBtoRealDB.js to fix async bugs * for squash: fix erroneous use of `for..of` * for squash: Add line break between statements * for squash: put closing paren on same line as last arg * for squash: Move `log()` back up where it was to minimize the diff to develop * for squash: indentation fixes * for squash: typo fix * for squash: wrap long lines * for squash: use `util.callbackify` to silence promise/no-callback-in-promise warning * for squash: use double quotes to improve readability Co-authored-by: Richard Hansen <rhansen@rhansen.org>
This commit is contained in:
parent
c0d9881a62
commit
2fdc737355
13 changed files with 458 additions and 466 deletions
108
bin/repairPad.js
108
bin/repairPad.js
|
@ -1,77 +1,59 @@
|
|||
'use strict';
|
||||
|
||||
/*
|
||||
* This is a repair tool. It extracts all datas of a pad, removes and inserts them again.
|
||||
*/
|
||||
|
||||
// As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an
|
||||
// unhandled rejection into an uncaught exception, which does cause Node.js to exit.
|
||||
process.on('unhandledRejection', (err) => { throw err; });
|
||||
|
||||
console.warn('WARNING: This script must not be used while etherpad is running!');
|
||||
|
||||
if (process.argv.length != 3) {
|
||||
console.error('Use: node bin/repairPad.js $PADID');
|
||||
process.exit(1);
|
||||
}
|
||||
if (process.argv.length !== 3) throw new Error('Use: node bin/repairPad.js $PADID');
|
||||
|
||||
// get the padID
|
||||
const padId = process.argv[2];
|
||||
|
||||
const npm = require('../src/node_modules/npm');
|
||||
npm.load({}, async (er) => {
|
||||
if (er) {
|
||||
console.error(`Could not load NPM: ${er}`);
|
||||
process.exit(1);
|
||||
let valueCount = 0;
|
||||
|
||||
const npm = require('ep_etherpad-lite/node_modules/npm');
|
||||
npm.load({}, async (err) => {
|
||||
if (err) throw err;
|
||||
|
||||
// intialize database
|
||||
require('ep_etherpad-lite/node/utils/Settings');
|
||||
const db = require('ep_etherpad-lite/node/db/DB');
|
||||
await db.init();
|
||||
|
||||
// get the pad
|
||||
const padManager = require('ep_etherpad-lite/node/db/PadManager');
|
||||
const pad = await padManager.getPad(padId);
|
||||
|
||||
// accumulate the required keys
|
||||
const neededDBValues = [`pad:${padId}`];
|
||||
|
||||
// add all authors
|
||||
neededDBValues.push(...pad.getAllAuthors().map((author) => `globalAuthor:${author}`));
|
||||
|
||||
// add all revisions
|
||||
for (let rev = 0; rev <= pad.head; ++rev) {
|
||||
neededDBValues.push(`pad:${padId}:revs:${rev}`);
|
||||
}
|
||||
|
||||
try {
|
||||
// intialize database
|
||||
const settings = require('../src/node/utils/Settings');
|
||||
const db = require('../src/node/db/DB');
|
||||
await db.init();
|
||||
|
||||
// get the pad
|
||||
const padManager = require('../src/node/db/PadManager');
|
||||
const pad = await padManager.getPad(padId);
|
||||
|
||||
// accumulate the required keys
|
||||
const neededDBValues = [`pad:${padId}`];
|
||||
|
||||
// add all authors
|
||||
neededDBValues.push(...pad.getAllAuthors().map((author) => 'globalAuthor:'));
|
||||
|
||||
// add all revisions
|
||||
for (let rev = 0; rev <= pad.head; ++rev) {
|
||||
neededDBValues.push(`pad:${padId}:revs:${rev}`);
|
||||
}
|
||||
|
||||
// add all chat values
|
||||
for (let chat = 0; chat <= pad.chatHead; ++chat) {
|
||||
neededDBValues.push(`pad:${padId}:chat:${chat}`);
|
||||
}
|
||||
|
||||
//
|
||||
// NB: this script doesn't actually does what's documented
|
||||
// since the `value` fields in the following `.forEach`
|
||||
// block are just the array index numbers
|
||||
//
|
||||
// the script therefore craps out now before it can do
|
||||
// any damage.
|
||||
//
|
||||
// See gitlab issue #3545
|
||||
//
|
||||
console.info('aborting [gitlab #3545]');
|
||||
process.exit(1);
|
||||
|
||||
// now fetch and reinsert every key
|
||||
neededDBValues.forEach((key, value) => {
|
||||
console.log(`Key: ${key}, value: ${value}`);
|
||||
db.remove(key);
|
||||
db.set(key, value);
|
||||
});
|
||||
|
||||
console.info('finished');
|
||||
process.exit(0);
|
||||
} catch (er) {
|
||||
if (er.name === 'apierror') {
|
||||
console.error(er);
|
||||
} else {
|
||||
console.trace(er);
|
||||
}
|
||||
// add all chat values
|
||||
for (let chat = 0; chat <= pad.chatHead; ++chat) {
|
||||
neededDBValues.push(`pad:${padId}:chat:${chat}`);
|
||||
}
|
||||
// now fetch and reinsert every key
|
||||
for (const key of neededDBValues) {
|
||||
const value = await db.get(key);
|
||||
// if it isn't a globalAuthor value which we want to ignore..
|
||||
// console.log(`Key: ${key}, value: ${JSON.stringify(value)}`);
|
||||
await db.remove(key);
|
||||
await db.set(key, value);
|
||||
valueCount++;
|
||||
}
|
||||
|
||||
console.info(`Finished: Replaced ${valueCount} values in the database`);
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue