|
|
|
'use strict';
|
|
|
|
|
|
|
|
var semver = require('semver');
|
|
|
|
var request = require('request');
|
|
|
|
|
|
|
|
var meta = require('../meta');
|
|
|
|
|
|
|
|
var versionCache = '';
|
|
|
|
var versionCacheLastModified = '';
|
|
|
|
|
|
|
|
var isPrerelease = /^v?\d+\.\d+\.\d+-.+$/;
|
|
|
|
|
|
|
|
function getLatestVersion(callback) {
|
|
|
|
var headers = {
|
|
|
|
Accept: 'application/vnd.github.v3+json',
|
|
|
|
'User-Agent': encodeURIComponent('NodeBB Admin Control Panel/' + meta.config.title),
|
|
|
|
};
|
|
|
|
|
|
|
|
if (versionCacheLastModified) {
|
|
|
|
headers['If-Modified-Since'] = versionCacheLastModified;
|
|
|
|
}
|
|
|
|
|
|
|
|
request('https://api.github.com/repos/NodeBB/NodeBB/tags', {
|
|
|
|
json: true,
|
|
|
|
headers: headers,
|
|
|
|
timeout: 1000,
|
|
|
|
}, function (err, res, releases) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (res.statusCode === 304) {
|
|
|
|
return callback(null, versionCache);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (res.statusCode !== 200) {
|
|
|
|
return callback(Error(res.statusMessage));
|
|
|
|
}
|
|
|
|
|
|
|
|
releases = releases.filter(function (version) {
|
|
|
|
return !isPrerelease.test(version.name); // filter out automated prerelease versions
|
|
|
|
}).map(function (version) {
|
|
|
|
return version.name.replace(/^v/, '');
|
|
|
|
}).sort(function (a, b) {
|
|
|
|
return semver.lt(a, b) ? 1 : -1;
|
|
|
|
});
|
|
|
|
|
|
|
|
versionCache = releases[0];
|
|
|
|
versionCacheLastModified = res.headers['last-modified'];
|
|
|
|
|
|
|
|
callback(null, versionCache);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.getLatestVersion = getLatestVersion;
|
|
|
|
exports.isPrerelease = isPrerelease;
|