From 73f375252f3e9f36d16e9f675290aa8e24a98a39 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 9 May 2017 22:04:59 -0600 Subject: [PATCH 1/5] Automatically install dependencies --- nodebb | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/nodebb b/nodebb index 22051bb810..50bcc65fee 100755 --- a/nodebb +++ b/nodebb @@ -2,36 +2,34 @@ 'use strict'; -var cproc; -var args; -var fs; -var path; -var request; -var semver; -var prompt; -var async; +var fs = require('fs'); +var path = require('path'); +var cproc = require('child_process'); +// check to make sure dependencies are installed try { - require('colors'); - cproc = require('child_process'); - args = require('minimist')(process.argv.slice(2)); - fs = require('fs'); - path = require('path'); - request = require('request'); - semver = require('semver'); - prompt = require('prompt'); - async = require('async'); + fs.readFileSync(path.join(__dirname, 'node_modules/async/package.json')); } catch (e) { - if (e.code === 'MODULE_NOT_FOUND') { - process.stdout.write('NodeBB could not be started because it\'s dependencies have not been installed.\n'); - process.stdout.write('Please ensure that you have executed "npm install --production" prior to running NodeBB.\n\n'); - process.stdout.write('For more information, please see: https://docs.nodebb.org/en/latest/installing/os.html\n\n'); - process.stdout.write('Could not start: ' + e.code + '\n'); + if (e.code === 'ENOENT') { + process.stdout.write('Dependencies not yet installed.\n'); + process.stdout.write('Installing them now...\n\n'); - process.exit(1); + cproc.execSync('npm i --production', { + cwd: __dirname, + stdio: [0, 1, 2], + }); + } else { + throw e; } } +require('colors'); +var args = require('minimist')(process.argv.slice(2)); +var request = require('request'); +var semver = require('semver'); +var prompt = require('prompt'); +var async = require('async'); + var loaderPath = path.join(__dirname, 'loader.js'); var appPath = path.join(__dirname, 'app.js'); From eedc0889fc1b4b3a42c49aae996a770b3ab6f7e4 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 9 May 2017 22:08:28 -0600 Subject: [PATCH 2/5] Fix failed lint --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 0e5b8ff69b..edb8565559 100644 --- a/app.js +++ b/app.js @@ -203,7 +203,7 @@ function upgrade() { // Skip build tasks.pop(); } - //disable mongo timeouts during upgrade + // disable mongo timeouts during upgrade nconf.set('mongo:options:socketTimeoutMS', 0); async.series(tasks, function (err) { if (err) { From 970c7a8caa7a91a3ee7895b85b54de7f6ed11b9f Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 9 May 2017 22:20:40 -0600 Subject: [PATCH 3/5] Defer winston logging until after tests --- test/defer-logger.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 test/defer-logger.js diff --git a/test/defer-logger.js b/test/defer-logger.js new file mode 100644 index 0000000000..3ddb9de45c --- /dev/null +++ b/test/defer-logger.js @@ -0,0 +1,40 @@ +'use strict'; + +var util = require('util'); +var winston = require('winston'); + +function DeferLogger(options) { + options = options || {}; + + this.name = 'DeferLogger'; + this.level = options.level || 'info'; + + this.logged = options.logged; +} + +util.inherits(DeferLogger, winston.Transport); + +DeferLogger.prototype.log = function log(level, msg, meta, callback) { + this.logged.push([level, msg, meta]); + callback(null, true); +}; + +var winstonLogged = []; + +before(function () { + // defer winston logs until the end + winston.remove(winston.transports.Console); + + winston.add(DeferLogger, { + logged: winstonLogged, + }); +}); + +after(function () { + console.log('\n\n'); + + var con = new winston.transports.Console(); + winstonLogged.forEach(function (args) { + con.log(args[0], args[1], args[2], function () {}); + }); +}); From 759c3f5584efdaace97ae6795f48ec1755facad4 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 9 May 2017 22:39:04 -0600 Subject: [PATCH 4/5] Fix soundpacks not working --- src/plugins/load.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/load.js b/src/plugins/load.js index f4ba868eea..04b65e9163 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -263,12 +263,12 @@ module.exports = function (Plugins) { soundpack.id = pluginData.id; soundpack.dir = path.join(pluginData.path, soundpack.dir); async.each(Object.keys(soundpack.sounds), function (key, next) { - file.exists(path.join(soundpack.dir, soundpack.sounds[key]), function (exists) { + file.exists(path.join(soundpack.dir, soundpack.sounds[key]), function (err, exists) { if (!exists) { delete soundpack.sounds[key]; } - next(); + next(err); }); }, function (err) { if (err) { From bd6aca7d9473f37adeadc7df0fd5be6b5358e872 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Wed, 10 May 2017 15:05:54 -0600 Subject: [PATCH 5/5] More friendly error message if module loading fails --- nodebb | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/nodebb b/nodebb index 50bcc65fee..2b71185d4e 100755 --- a/nodebb +++ b/nodebb @@ -23,12 +23,30 @@ try { } } -require('colors'); -var args = require('minimist')(process.argv.slice(2)); -var request = require('request'); -var semver = require('semver'); -var prompt = require('prompt'); -var async = require('async'); +var minimist; +var request; +var semver; +var prompt; +var async; + +try { + require('colors'); + minimist = require('minimist'); + request = require('request'); + semver = require('semver'); + prompt = require('prompt'); + async = require('async'); +} catch (e) { + process.stdout.write( + '\x1b[31mNodeBB could not be initialised because there was an error while loading dependencies.\n' + + 'Please run "\x1b[33mnpm install --production\x1b[31m" and try again.\x1b[0m\n\n' + + 'For more information, please see: https://docs.nodebb.org/en/latest/installing/os.html\n\n' + ); + + throw e; +} + +var args = minimist(process.argv.slice(2)); var loaderPath = path.join(__dirname, 'loader.js'); var appPath = path.join(__dirname, 'app.js');