You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/cli/upgrade.js

96 lines
2.6 KiB
JavaScript

'use strict';
const nconf = require('nconf');
const chalk = require('chalk');
const packageInstall = require('./package-install');
const { upgradePlugins } = require('./upgrade-plugins');
const steps = {
package: {
message: 'Updating package.json file with defaults...',
handler: function () {
packageInstall.updatePackageFile();
packageInstall.preserveExtraneousPlugins();
process.stdout.write(chalk.green(' OK\n'));
},
},
install: {
message: 'Bringing base dependencies up to date...',
handler: function () {
process.stdout.write(chalk.green(' started\n'));
packageInstall.installAll();
},
},
plugins: {
message: 'Checking installed plugins for updates...',
handler: async function () {
await require('../database').init();
await upgradePlugins();
},
},
schema: {
message: 'Updating NodeBB data store schema...',
handler: async function () {
await require('../database').init();
await require('../meta').configs.init();
await require('../upgrade').run();
},
},
build: {
message: 'Rebuilding assets...',
handler: async function () {
await require('../meta/build').buildAll();
},
},
};
async function runSteps(tasks) {
try {
for (let i = 0; i < tasks.length; i++) {
const step = steps[tasks[i]];
if (step && step.message && step.handler) {
process.stdout.write(`\n${chalk.bold(`${i + 1}. `)}${chalk.yellow(step.message)}`);
/* eslint-disable-next-line */
await step.handler();
}
}
const message = 'NodeBB Upgrade Complete!';
// some consoles will return undefined/zero columns,
// so just use 2 spaces in upgrade script if we can't get our column count
const { columns } = process.stdout;
const spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' ';
console.log(`\n\n${spaces}${chalk.green.bold(message)}\n`);
process.exit();
} catch (err) {
console.error(`Error occurred during upgrade: ${err.stack}`);
throw err;
}
}
async function runUpgrade(upgrades, options) {
console.log(chalk.cyan('\nUpdating NodeBB...'));
options = options || {};
// disable mongo timeouts during upgrade
nconf.set('mongo:options:socketTimeoutMS', 0);
if (upgrades === true) {
let tasks = Object.keys(steps);
if (options.package || options.install ||
options.plugins || options.schema || options.build) {
tasks = tasks.filter(key => options[key]);
}
await runSteps(tasks);
return;
}
await require('../database').init();
await require('../meta').configs.init();
await require('../upgrade').runParticular(upgrades);
process.exit(0);
}
exports.upgrade = runUpgrade;