Compare commits

...

14 Commits

Author SHA1 Message Date
barisusakli
1943f8fdfa closes #2370 2014-11-08 17:53:03 -05:00
barisusakli
6ae0ca17d7 closes #2354 2014-11-08 15:29:40 -05:00
Julian Lam
727010822d 0.5.4 2014-11-07 15:06:34 -05:00
Julian Lam
a1bf407cd4 fixed client-side so semver doesn't explode when nbbpm returns 'latest', fixed tests so they pass again, #2363 2014-11-07 15:04:15 -05:00
Julian Lam
a96eb0c2a4 updating shrinkwrap file 2014-11-07 14:58:21 -05:00
Julian Lam
5ddbffb083 plugin installation takes a version now, and queries nbbpm, #2363
better error handling for #2363

upgrades now also call the suggestion route from nbbpm

upgrade button will show alert now if you try to upgrade past the suggested version, #2363
2014-11-07 14:45:54 -05:00
barisusakli
f740a2d958 dont display email/fullname if they are private 2014-11-05 23:59:20 -05:00
Julian Lam
7c77c8cfc6 why does this file keep disappearing... :@ 2014-11-05 20:16:48 -05:00
Julian Lam
f19871f311 closed #2349, removed use of deprecated -d flag in executable 2014-11-04 18:32:59 -05:00
barisusakli
50191a38b3 forkWorker function, pipe new worker output to log 2014-11-04 18:32:47 -05:00
barisusakli
37f1f94bed added stderr piping to output 2014-11-04 18:32:42 -05:00
barisusakli
4cdb3a34d2 log signal as well 2014-11-04 18:32:34 -05:00
barisusakli
cce076fc83 closes #2323 2014-10-30 14:30:10 -04:00
Julian Lam
0a73fade08 updated version for 0.5.3 2014-10-27 17:36:26 -04:00
13 changed files with 2569 additions and 80 deletions

View File

@@ -161,14 +161,12 @@ Loader.addClusterEvents = function(callback) {
} }
} }
console.log('[cluster] Child Process (' + worker.process.pid + ') has exited (code: ' + code + ')'); console.log('[cluster] Child Process (' + worker.process.pid + ') has exited (code: ' + code + ', signal: ' + signal +')');
if (!worker.suicide) { if (!worker.suicide) {
console.log('[cluster] Spinning up another process...'); console.log('[cluster] Spinning up another process...');
var wasPrimary = parseInt(worker.id, 10) === Loader.primaryWorker; var wasPrimary = parseInt(worker.id, 10) === Loader.primaryWorker;
cluster.fork({ forkWorker(wasPrimary);
handle_jobs: wasPrimary
});
} }
}); });
@@ -177,29 +175,32 @@ Loader.addClusterEvents = function(callback) {
}); });
callback(); callback();
} };
Loader.start = function(callback) { Loader.start = function(callback) {
var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }),
worker;
console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n'); console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n');
for(var x=0;x<numProcs;x++) { for(var x=0; x<numProcs; ++x) {
// Only the first worker sets up templates/sounds/jobs/etc forkWorker(x === 0);
worker = cluster.fork({ }
cluster_setup: x === 0,
handle_jobs: x === 0 if (callback) {
}); callback();
}
};
function forkWorker(isPrimary) {
var worker = cluster.fork({
cluster_setup: isPrimary,
handle_jobs: isPrimary
}),
output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true });
// Logging
if (silent) { if (silent) {
worker.process.stdout.pipe(output); worker.process.stdout.pipe(output);
worker.process.stderr.pipe(output);
} }
} }
if (callback) callback();
};
Loader.restart = function(callback) { Loader.restart = function(callback) {
// Slate existing workers for termination -- welcome to death row. // Slate existing workers for termination -- welcome to death row.
@@ -219,7 +220,7 @@ Loader.notifyWorkers = function (msg) {
Object.keys(cluster.workers).forEach(function(id) { Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].send(msg); cluster.workers[id].send(msg);
}); });
} };
nconf.argv().file({ nconf.argv().file({

2
nodebb
View File

@@ -29,7 +29,7 @@ case "$1" in
echo " \"./nodebb log\" to view server output"; echo " \"./nodebb log\" to view server output";
# Start the loader daemon # Start the loader daemon
"$node" loader -d "$@" "$node" loader "$@"
;; ;;
stop) stop)

2430
npm-shrinkwrap.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
"name": "nodebb", "name": "nodebb",
"license": "GPLv3 or later", "license": "GPLv3 or later",
"description": "NodeBB Forum", "description": "NodeBB Forum",
"version": "0.5.3-dev", "version": "0.5.4",
"homepage": "http://www.nodebb.org", "homepage": "http://www.nodebb.org",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@@ -33,13 +33,75 @@ define('admin/extend/plugins', function() {
pluginsList.on('click', 'button[data-action="toggleInstall"]', function() { pluginsList.on('click', 'button[data-action="toggleInstall"]', function() {
pluginID = $(this).parents('li').attr('data-plugin-id'); pluginID = $(this).parents('li').attr('data-plugin-id');
Plugins.suggest(pluginID, function(err, payload) {
if (!err) {
Plugins.toggleInstall(pluginID, payload.version);
} else {
bootbox.confirm('<p>NodeBB could not reach the package manager, proceed with installation of latest version?</p><div class="alert alert-danger"><strong>Server returned (' + err.status + ')</strong>: ' + err.responseText + '</div>', function(confirm) {
if (confirm) {
Plugins.toggleInstall(pluginID, 'latest');
}
});
}
});
});
pluginsList.on('click', 'button[data-action="upgrade"]', function() {
var btn = $(this); var btn = $(this);
var parent = btn.parents('li');
pluginID = parent.attr('data-plugin-id');
Plugins.suggest(pluginID, function(err, payload) {
if (!err) {
require(['semver'], function(semver) {
if (payload.version === 'latest' || semver.gt(payload.version, parent.find('.currentVersion').text())) {
btn.attr('disabled', true).find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.upgrade', {
id: pluginID,
version: payload.version
}, function(err) {
if (err) {
return app.alertError(err.message);
}
parent.find('.fa-exclamation-triangle').remove();
parent.find('.currentVersion').text(payload.version);
btn.remove();
});
} else {
bootbox.alert('<p>Your version of NodeBB (v' + app.config.version + ') is only cleared to upgrade to v' + payload.version + ' of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.');
}
});
} else {
bootbox.alert('<p>NodeBB could not reach the package manager, an upgrade is not suggested at this time.</p>');
}
});
});
$('#plugin-search').on('input propertychange', function() {
var term = $(this).val();
$('.plugins li').each(function() {
var pluginId = $(this).attr('data-plugin-id');
$(this).toggleClass('hide', pluginId && pluginId.indexOf(term) === -1);
});
});
} else {
pluginsList.append('<li><p><i>No plugins found.</i></p></li>');
}
},
toggleInstall: function(pluginID, version, callback) {
var btn = $('li[data-plugin-id="' + pluginID + '"] button[data-action="toggleInstall"]');
var activateBtn = btn.siblings('[data-action="toggleActive"]'); var activateBtn = btn.siblings('[data-action="toggleActive"]');
btn.html(btn.html() + 'ing') btn.html(btn.html() + 'ing')
.attr('disabled', true) .attr('disabled', true)
.find('i').attr('class', 'fa fa-refresh fa-spin'); .find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.toggleInstall', pluginID, function(err, status) { socket.emit('admin.plugins.toggleInstall', {
id: pluginID,
version: version
}, function(err, status) {
if (err) { if (err) {
return app.alertError(err.message); return app.alertError(err.message);
} }
@@ -62,38 +124,24 @@ define('admin/extend/plugins', function() {
type: 'info', type: 'info',
timeout: 5000 timeout: 5000
}); });
});
});
pluginsList.on('click', 'button[data-action="upgrade"]', function() { if (typeof callback === 'function') {
var btn = $(this); callback.apply(this, arguments);
var parent = btn.parents('li');
pluginID = parent.attr('data-plugin-id');
btn.attr('disabled', true).find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.upgrade', pluginID, function(err) {
if (err) {
return app.alertError(err.message);
} }
parent.find('.fa-exclamation-triangle').remove();
parent.find('.currentVersion').text(parent.find('.latestVersion').text());
btn.remove();
}); });
}); },
suggest: function(pluginId, callback) {
var nbbVersion = app.config.version;
$('#plugin-search').on('input propertychange', function() { $.ajax('https://packages.nodebb.org/api/v1/suggest', {
var term = $(this).val(); type: 'GET',
$('.plugins li').each(function() { data: {
var pluginId = $(this).attr('data-plugin-id'); package: pluginId,
$(this).toggleClass('hide', pluginId && pluginId.indexOf(term) === -1); version: nbbVersion
}); },
}); dataType: 'json'
}).done(function(payload) {
} else { callback(undefined, payload);
pluginsList.append('<li><p><i>No plugins found.</i></p></li>'); }).fail(callback);
}
} }
}; };

View File

@@ -136,11 +136,18 @@ function getUserDataByUserSlug(userslug, callerUID, callback) {
accountsController.getUserByUID = function(req, res, next) { accountsController.getUserByUID = function(req, res, next) {
var uid = req.params.uid ? req.params.uid : 0; var uid = req.params.uid ? req.params.uid : 0;
user.getUserData(uid, function(err, userData) { async.parallel({
settings: async.apply(user.getSettings, uid),
userData: async.apply(user.getUserData, uid)
}, function(err, results) {
if (err) { if (err) {
return next(err); return next(err);
} }
res.json(userData);
results.userData.email = results.settings.showemail ? results.userData.email : undefined;
results.userData.fullname = results.settings.showfullname ? results.userData.fullname : undefined;
res.json(results.userData);
}); });
}; };

View File

@@ -380,7 +380,7 @@ var async = require('async'),
db.rename('group:' + oldName, 'group:' + newName, next); db.rename('group:' + oldName, 'group:' + newName, next);
}, },
function(next) { function(next) {
Groups.exists('group:' + oldName + ':members', function(err, exists) { db.exists('group:' + oldName + ':members', function(err, exists) {
if (err) { if (err) {
return next(err); return next(err);
} }

View File

@@ -2,7 +2,8 @@
'use strict'; 'use strict';
var winston = require('winston'), var winston = require('winston'),
db = require('../database'); db = require('../database'),
pkg = require('../../package.json');
module.exports = function(Meta) { module.exports = function(Meta) {
@@ -25,7 +26,9 @@ module.exports = function(Meta) {
Meta.configs.list = function (callback) { Meta.configs.list = function (callback) {
db.getObject('config', function (err, config) { db.getObject('config', function (err, config) {
callback(err, config || {}); config = config || {};
config.version = pkg.version;
callback(err, config);
}); });
}; };

View File

@@ -550,7 +550,7 @@ var fs = require('fs'),
}); });
}; };
Plugins.toggleInstall = function(id, callback) { Plugins.toggleInstall = function(id, version, callback) {
Plugins.isInstalled(id, function(err, installed) { Plugins.isInstalled(id, function(err, installed) {
if (err) { if (err) {
return callback(err); return callback(err);
@@ -573,7 +573,7 @@ var fs = require('fs'),
npm.load({}, next); npm.load({}, next);
}, },
function(res, next) { function(res, next) {
npm.commands[installed ? 'uninstall' : 'install'](installed ? id : [id], next); npm.commands[installed ? 'uninstall' : 'install'](installed ? id : [id + '@' + (version || 'latest')], next);
} }
], function(err) { ], function(err) {
callback(err, { callback(err, {
@@ -584,13 +584,13 @@ var fs = require('fs'),
}); });
}; };
Plugins.upgrade = function(id, callback) { Plugins.upgrade = function(id, version, callback) {
async.waterfall([ async.waterfall([
function(next) { function(next) {
npm.load({}, next); npm.load({}, next);
}, },
function(res, next) { function(res, next) {
npm.commands.install([id], next); npm.commands.install([id + '@' + (version || 'latest')], next);
} }
], callback); ], callback);
}; };

View File

@@ -94,12 +94,12 @@ SocketAdmin.plugins.toggleActive = function(socket, plugin_id, callback) {
plugins.toggleActive(plugin_id, callback); plugins.toggleActive(plugin_id, callback);
}; };
SocketAdmin.plugins.toggleInstall = function(socket, plugin_id, callback) { SocketAdmin.plugins.toggleInstall = function(socket, data, callback) {
plugins.toggleInstall(plugin_id, callback); plugins.toggleInstall(data.id, data.version, callback);
}; };
SocketAdmin.plugins.upgrade = function(socket, plugin_id, callback) { SocketAdmin.plugins.upgrade = function(socket, data, callback) {
plugins.upgrade(plugin_id, callback); plugins.upgrade(data.id, data.version, callback);
}; };
SocketAdmin.widgets.set = function(socket, data, callback) { SocketAdmin.widgets.set = function(socket, data, callback) {

View File

@@ -104,7 +104,7 @@ var async = require('async'),
} }
if (user.password) { if (user.password) {
user.password = null; user.password = undefined;
} }
if (!parseInt(user.uid, 10)) { if (!parseInt(user.uid, 10)) {

View File

@@ -28,7 +28,7 @@ module.exports = function(User) {
return winston.log('[user/jobs] Did not send daily digests because subscription system is disabled.'); return winston.log('[user/jobs] Did not send daily digests because subscription system is disabled.');
} }
topics.getLatestTopics(0, 0, 10, 'day', function(err, topics) { topics.getLatestTopics(0, 0, 10, 'day', function(err, data) {
if (err) { if (err) {
return winston.error('[user/jobs] Could not send daily digests: ' + err.message); return winston.error('[user/jobs] Could not send daily digests: ' + err.message);
} }
@@ -49,7 +49,7 @@ module.exports = function(User) {
return next(); return next();
} }
sendEmails(subscribed, topics, next); sendEmails(subscribed, data.topics, next);
}); });
}, function(err) { }, function(err) {
if (err) { if (err) {

View File

@@ -6,13 +6,13 @@
"^users/latest": "users", "^users/latest": "users",
"^users/sort-reputation": "users", "^users/sort-reputation": "users",
"^users/search": "users", "^users/search": "users",
"^user.*edit": "account/edit", "^user/.*/edit": "account/edit",
"^user.*following": "account/following", "^user/.*/following": "account/following",
"^user.*followers": "account/followers", "^user/.*/followers": "account/followers",
"^user.*settings": "account/settings", "^user/.*/settings": "account/settings",
"^user.*favourites": "account/favourites", "^user/.*/favourites": "account/favourites",
"^user.*posts": "account/posts", "^user/.*/posts": "account/posts",
"^user.*topics": "account/topics", "^user/.*/topics": "account/topics",
"^user/.*": "account/profile", "^user/.*": "account/profile",
"^reset/.*": "reset_code", "^reset/.*": "reset_code",
"^tags/.*": "tag", "^tags/.*": "tag",