mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
Merge pull request #13344 from birarda/feat/new-version-numbers
handle semantic version numbers in interface/sandbox update
This commit is contained in:
commit
99b5835098
10 changed files with 316 additions and 80 deletions
|
@ -95,7 +95,7 @@ macro(SET_PACKAGING_PARAMETERS)
|
|||
endif ()
|
||||
|
||||
execute_process(
|
||||
COMMAND git log -1 --format=${_GIT_LOG_FORMAT}
|
||||
COMMAND git log -1 --abbrev=7 --format=${_GIT_LOG_FORMAT}
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE _GIT_LOG_OUTPUT
|
||||
ERROR_VARIABLE _GIT_LOG_ERROR
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
{
|
||||
"releaseType": "@RELEASE_TYPE@",
|
||||
"buildNumber": "@BUILD_NUMBER@",
|
||||
"stableBuild": "@STABLE_BUILD@",
|
||||
"buildIdentifier": "@BUILD_VERSION@",
|
||||
"organization": "@BUILD_ORGANIZATION@"
|
||||
"organization": "@BUILD_ORGANIZATION@"
|
||||
}
|
||||
|
|
|
@ -905,7 +905,6 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) {
|
|||
DependencyManager::set<DiscoverabilityManager>();
|
||||
DependencyManager::set<SceneScriptingInterface>();
|
||||
DependencyManager::set<OffscreenUi>();
|
||||
DependencyManager::set<AutoUpdater>();
|
||||
DependencyManager::set<Midi>();
|
||||
DependencyManager::set<PathUtils>();
|
||||
DependencyManager::set<InterfaceDynamicFactory>();
|
||||
|
@ -1776,10 +1775,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
|
|||
// If launched from Steam, let it handle updates
|
||||
const QString HIFI_NO_UPDATER_COMMAND_LINE_KEY = "--no-updater";
|
||||
bool noUpdater = arguments().indexOf(HIFI_NO_UPDATER_COMMAND_LINE_KEY) != -1;
|
||||
if (!noUpdater) {
|
||||
bool buildCanUpdate = BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Stable
|
||||
|| BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Master;
|
||||
if (!noUpdater && buildCanUpdate) {
|
||||
constexpr auto INSTALLER_TYPE_CLIENT_ONLY = "client_only";
|
||||
|
||||
auto applicationUpdater = DependencyManager::get<AutoUpdater>();
|
||||
auto applicationUpdater = DependencyManager::set<AutoUpdater>();
|
||||
|
||||
AutoUpdater::InstallerType type = installerType == INSTALLER_TYPE_CLIENT_ONLY
|
||||
? AutoUpdater::InstallerType::CLIENT_ONLY : AutoUpdater::InstallerType::FULL;
|
||||
|
|
|
@ -21,19 +21,31 @@ UpdateDialog::UpdateDialog(QQuickItem* parent) :
|
|||
OffscreenQmlDialog(parent)
|
||||
{
|
||||
auto applicationUpdater = DependencyManager::get<AutoUpdater>();
|
||||
int currentVersion = QCoreApplication::applicationVersion().toInt();
|
||||
int latestVersion = applicationUpdater.data()->getBuildData().lastKey();
|
||||
_updateAvailableDetails = "v" + QString::number(latestVersion) + " released on "
|
||||
+ QString(applicationUpdater.data()->getBuildData()[latestVersion]["releaseTime"]).replace(" ", " ");
|
||||
if (applicationUpdater) {
|
||||
|
||||
_releaseNotes = "";
|
||||
for (int i = latestVersion; i > currentVersion; i--) {
|
||||
if (applicationUpdater.data()->getBuildData().contains(i)) {
|
||||
QString releaseNotes = applicationUpdater.data()->getBuildData()[i]["releaseNotes"];
|
||||
releaseNotes.remove("<br />");
|
||||
releaseNotes.remove(QRegExp("^\n+"));
|
||||
_releaseNotes += "\n" + QString().sprintf("%d", i) + "\n" + releaseNotes + "\n";
|
||||
auto buildData = applicationUpdater.data()->getBuildData();
|
||||
ApplicationVersion latestVersion = buildData.lastKey();
|
||||
_updateAvailableDetails = "v" + latestVersion.versionString + " released on "
|
||||
+ QString(buildData[latestVersion]["releaseTime"]).replace(" ", " ");
|
||||
|
||||
_releaseNotes = "";
|
||||
|
||||
auto it = buildData.end();
|
||||
while (it != buildData.begin()) {
|
||||
--it;
|
||||
|
||||
if (applicationUpdater->getCurrentVersion() < it.key()) {
|
||||
// grab the release notes for this later version
|
||||
QString releaseNotes = it.value()["releaseNotes"];
|
||||
releaseNotes.remove("<br />");
|
||||
releaseNotes.remove(QRegExp("^\n+"));
|
||||
_releaseNotes += "\n" + it.key().versionString + "\n" + releaseNotes + "\n";
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,5 +59,5 @@ const QString& UpdateDialog::releaseNotes() const {
|
|||
|
||||
void UpdateDialog::triggerUpgrade() {
|
||||
auto applicationUpdater = DependencyManager::get<AutoUpdater>();
|
||||
applicationUpdater.data()->performAutoUpdate(applicationUpdater.data()->getBuildData().lastKey());
|
||||
applicationUpdater.data()->openLatestUpdateURL();
|
||||
}
|
||||
|
|
|
@ -11,13 +11,16 @@
|
|||
|
||||
#include "AutoUpdater.h"
|
||||
|
||||
#include <BuildInfo.h>
|
||||
|
||||
#include <NetworkAccessManager.h>
|
||||
#include <SharedUtil.h>
|
||||
#include <unordered_map>
|
||||
|
||||
AutoUpdater::AutoUpdater() {
|
||||
#include <ApplicationVersion.h>
|
||||
#include <BuildInfo.h>
|
||||
#include <NetworkAccessManager.h>
|
||||
#include <SharedUtil.h>
|
||||
|
||||
AutoUpdater::AutoUpdater() :
|
||||
_currentVersion(BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Stable ? BuildInfo::VERSION : BuildInfo::BUILD_NUMBER)
|
||||
{
|
||||
#if defined Q_OS_WIN32
|
||||
_operatingSystem = "windows";
|
||||
#elif defined Q_OS_MAC
|
||||
|
@ -33,9 +36,22 @@ void AutoUpdater::checkForUpdate() {
|
|||
this->getLatestVersionData();
|
||||
}
|
||||
|
||||
const QUrl BUILDS_XML_URL("https://highfidelity.com/builds.xml");
|
||||
const QUrl MASTER_BUILDS_XML_URL("https://highfidelity.com/dev-builds.xml");
|
||||
|
||||
void AutoUpdater::getLatestVersionData() {
|
||||
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
|
||||
QNetworkRequest latestVersionRequest(BUILDS_XML_URL);
|
||||
|
||||
QUrl buildsURL;
|
||||
|
||||
if (BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Stable) {
|
||||
buildsURL = BUILDS_XML_URL;
|
||||
} else if (BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Master) {
|
||||
buildsURL = MASTER_BUILDS_XML_URL;
|
||||
}
|
||||
|
||||
QNetworkRequest latestVersionRequest(buildsURL);
|
||||
|
||||
latestVersionRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||
latestVersionRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
|
||||
QNetworkReply* reply = networkAccessManager.get(latestVersionRequest);
|
||||
|
@ -52,12 +68,22 @@ void AutoUpdater::parseLatestVersionData() {
|
|||
QString clientOnly;
|
||||
};
|
||||
|
||||
int version { 0 };
|
||||
QString version;
|
||||
QString downloadUrl;
|
||||
QString releaseTime;
|
||||
QString releaseNotes;
|
||||
QString commitSha;
|
||||
QString pullRequestNumber;
|
||||
|
||||
QString versionKey;
|
||||
|
||||
// stable builds look at the stable_version node (semantic version)
|
||||
// master builds look at the version node (build number)
|
||||
if (BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Stable) {
|
||||
versionKey = "stable_version";
|
||||
} else if (BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Master) {
|
||||
versionKey = "version";
|
||||
}
|
||||
|
||||
while (xml.readNextStartElement()) {
|
||||
if (xml.name() == "projects") {
|
||||
|
@ -77,8 +103,8 @@ void AutoUpdater::parseLatestVersionData() {
|
|||
QHash<QString, InstallerURLs> campaignInstallers;
|
||||
|
||||
while (xml.readNextStartElement()) {
|
||||
if (xml.name() == "version") {
|
||||
version = xml.readElementText().toInt();
|
||||
if (xml.name() == versionKey) {
|
||||
version = xml.readElementText();
|
||||
} else if (xml.name() == "url") {
|
||||
downloadUrl = xml.readElementText();
|
||||
} else if (xml.name() == "installers") {
|
||||
|
@ -159,31 +185,31 @@ void AutoUpdater::parseLatestVersionData() {
|
|||
}
|
||||
|
||||
void AutoUpdater::checkVersionAndNotify() {
|
||||
if (BuildInfo::BUILD_TYPE != BuildInfo::BuildType::Stable || _builds.empty()) {
|
||||
// No version checking is required in nightly/PR/dev builds or when no build
|
||||
// data was found for the platform
|
||||
if (_builds.empty()) {
|
||||
// no build data was found for this platform
|
||||
return;
|
||||
}
|
||||
int latestVersionAvailable = _builds.lastKey();
|
||||
if (QCoreApplication::applicationVersion().toInt() < latestVersionAvailable) {
|
||||
|
||||
qDebug() << "Checking if update version" << _builds.lastKey().versionString
|
||||
<< "is newer than current version" << _currentVersion.versionString;
|
||||
|
||||
if (_builds.lastKey() > _currentVersion) {
|
||||
emit newVersionIsAvailable();
|
||||
}
|
||||
}
|
||||
|
||||
void AutoUpdater::performAutoUpdate(int version) {
|
||||
// NOTE: This is not yet auto updating - however this is a checkpoint towards that end
|
||||
// Next PR will handle the automatic download, upgrading and application restart
|
||||
const QMap<QString, QString>& chosenVersion = _builds.value(version);
|
||||
void AutoUpdater::openLatestUpdateURL() {
|
||||
const QMap<QString, QString>& chosenVersion = _builds.last();
|
||||
const QUrl& downloadUrl = chosenVersion.value("downloadUrl");
|
||||
QDesktopServices::openUrl(downloadUrl);
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
|
||||
void AutoUpdater::downloadUpdateVersion(int version) {
|
||||
void AutoUpdater::downloadUpdateVersion(const QString& version) {
|
||||
emit newVersionIsDownloaded();
|
||||
}
|
||||
|
||||
void AutoUpdater::appendBuildData(int versionNumber,
|
||||
void AutoUpdater::appendBuildData(const QString& versionNumber,
|
||||
const QString& downloadURL,
|
||||
const QString& releaseTime,
|
||||
const QString& releaseNotes,
|
||||
|
@ -194,6 +220,6 @@ void AutoUpdater::appendBuildData(int versionNumber,
|
|||
thisBuildDetails.insert("releaseTime", releaseTime);
|
||||
thisBuildDetails.insert("releaseNotes", releaseNotes);
|
||||
thisBuildDetails.insert("pullRequestNumber", pullRequestNumber);
|
||||
_builds.insert(versionNumber, thisBuildDetails);
|
||||
_builds.insert(ApplicationVersion(versionNumber), thisBuildDetails);
|
||||
|
||||
}
|
||||
|
|
|
@ -26,10 +26,9 @@
|
|||
#include <QtNetwork/QNetworkReply>
|
||||
#include <QtNetwork/QNetworkRequest>
|
||||
|
||||
#include <ApplicationVersion.h>
|
||||
#include <DependencyManager.h>
|
||||
|
||||
const QUrl BUILDS_XML_URL("https://highfidelity.com/builds.xml");
|
||||
|
||||
class AutoUpdater : public QObject, public Dependency {
|
||||
Q_OBJECT
|
||||
SINGLETON_DEPENDENCY
|
||||
|
@ -43,25 +42,29 @@ public:
|
|||
};
|
||||
|
||||
void checkForUpdate();
|
||||
const QMap<int, QMap<QString, QString>>& getBuildData() { return _builds; }
|
||||
void performAutoUpdate(int version);
|
||||
const QMap<ApplicationVersion, QMap<QString, QString>>& getBuildData() { return _builds; }
|
||||
void openLatestUpdateURL();
|
||||
void setInstallerType(InstallerType type) { _installerType = type; }
|
||||
void setInstallerCampaign(QString campaign) { _installerCampaign = campaign; }
|
||||
|
||||
const ApplicationVersion& getCurrentVersion() const { return _currentVersion; }
|
||||
|
||||
signals:
|
||||
void latestVersionDataParsed();
|
||||
void newVersionIsAvailable();
|
||||
void newVersionIsDownloaded();
|
||||
|
||||
private:
|
||||
QMap<int, QMap<QString, QString>> _builds;
|
||||
QMap<ApplicationVersion, QMap<QString, QString>> _builds;
|
||||
QString _operatingSystem;
|
||||
InstallerType _installerType { InstallerType::FULL };
|
||||
QString _installerCampaign { "" };
|
||||
|
||||
ApplicationVersion _currentVersion;
|
||||
|
||||
void getLatestVersionData();
|
||||
void downloadUpdateVersion(int version);
|
||||
void appendBuildData(int versionNumber,
|
||||
void downloadUpdateVersion(const QString& version);
|
||||
void appendBuildData(const QString& versionNumber,
|
||||
const QString& downloadURL,
|
||||
const QString& releaseTime,
|
||||
const QString& releaseNotes,
|
||||
|
|
94
libraries/shared/src/ApplicationVersion.cpp
Normal file
94
libraries/shared/src/ApplicationVersion.cpp
Normal file
|
@ -0,0 +1,94 @@
|
|||
//
|
||||
// ApplicationVersion.cpp
|
||||
// libraries/shared/src
|
||||
//
|
||||
// Created by Stephen Birarda on 6/8/18.
|
||||
// Copyright 2018 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
#include "ApplicationVersion.h"
|
||||
|
||||
#include <cassert>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QRegExp>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
ApplicationVersion::ApplicationVersion(const QString& versionString) :
|
||||
versionString(versionString)
|
||||
{
|
||||
// attempt to regex out a semantic version from the string
|
||||
// handling both x.y.z and x.y formats
|
||||
QRegExp semanticRegex("([\\d]+)\\.([\\d]+)(?:\\.([\\d]+))?");
|
||||
|
||||
int pos = semanticRegex.indexIn(versionString);
|
||||
if (pos != -1) {
|
||||
isSemantic = true;
|
||||
auto captures = semanticRegex.capturedTexts();
|
||||
|
||||
major = captures[1].toInt();
|
||||
minor = captures[2].toInt();
|
||||
|
||||
if (captures.length() > 3) {
|
||||
patch = captures[3].toInt();
|
||||
} else {
|
||||
// the patch is implictly 0 if it was not included
|
||||
patch = 0;
|
||||
}
|
||||
} else {
|
||||
// if we didn't have a sematic style, we assume that we just have a build number
|
||||
build = versionString.toInt();
|
||||
}
|
||||
}
|
||||
|
||||
bool ApplicationVersion::operator==(const ApplicationVersion& other) const {
|
||||
if (isSemantic && other.isSemantic) {
|
||||
return major == other.major && minor == other.minor && patch == other.patch;
|
||||
} else if (!isSemantic && !other.isSemantic) {
|
||||
return build == other.build;
|
||||
} else {
|
||||
assert(isSemantic == other.isSemantic);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool ApplicationVersion::operator<(const ApplicationVersion& other) const {
|
||||
if (isSemantic && other.isSemantic) {
|
||||
if (major == other.major) {
|
||||
if (minor == other.minor) {
|
||||
return patch < other.patch;
|
||||
} else {
|
||||
return minor < other.minor;
|
||||
}
|
||||
} else {
|
||||
return major < other.major;
|
||||
}
|
||||
} else if (!isSemantic && !other.isSemantic) {
|
||||
return build < other.build;
|
||||
} else {
|
||||
assert(isSemantic == other.isSemantic);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool ApplicationVersion::operator>(const ApplicationVersion& other) const {
|
||||
if (isSemantic && other.isSemantic) {
|
||||
if (major == other.major) {
|
||||
if (minor == other.minor) {
|
||||
return patch > other.patch;
|
||||
} else {
|
||||
return minor > other.minor;
|
||||
}
|
||||
} else {
|
||||
return major > other.major;
|
||||
}
|
||||
} else if (!isSemantic && !other.isSemantic) {
|
||||
return build > other.build;
|
||||
} else {
|
||||
assert(isSemantic == other.isSemantic);
|
||||
return false;
|
||||
}
|
||||
}
|
41
libraries/shared/src/ApplicationVersion.h
Normal file
41
libraries/shared/src/ApplicationVersion.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
//
|
||||
// ApplicationVersion.h
|
||||
// libraries/shared/src
|
||||
//
|
||||
// Created by Stephen Birarda on 6/8/18.
|
||||
// Copyright 2018 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
#ifndef hifi_ApplicationVersion_h
|
||||
#define hifi_ApplicationVersion_h
|
||||
|
||||
#include <QtCore/QString>
|
||||
|
||||
class ApplicationVersion {
|
||||
public:
|
||||
ApplicationVersion(const QString& versionString);
|
||||
|
||||
bool operator==(const ApplicationVersion& other) const;
|
||||
bool operator!=(const ApplicationVersion& other) const { return !(*this == other); }
|
||||
|
||||
bool operator <(const ApplicationVersion& other) const;
|
||||
bool operator >(const ApplicationVersion& other) const;
|
||||
|
||||
bool operator >=(const ApplicationVersion& other) const { return (*this == other) || (*this > other); }
|
||||
bool operator <=(const ApplicationVersion& other) const { return (*this == other) || (*this < other); }
|
||||
|
||||
int major = -1;
|
||||
int minor = -1;
|
||||
int patch = -1;
|
||||
|
||||
int build = -1;
|
||||
|
||||
bool isSemantic { false };
|
||||
|
||||
QString versionString;
|
||||
};
|
||||
|
||||
#endif // hifi_ApplicationVersion_h
|
|
@ -60,7 +60,14 @@ function getBuildInfo() {
|
|||
}
|
||||
}
|
||||
|
||||
const DEFAULT_BUILD_INFO = { releaseType: "", buildIdentifier: "dev" };
|
||||
const DEFAULT_BUILD_INFO = {
|
||||
releaseType: "",
|
||||
buildIdentifier: "dev",
|
||||
buildNumber: "0",
|
||||
stableBuild: "0",
|
||||
organization: "High Fidelity - dev"
|
||||
};
|
||||
|
||||
var buildInfo = DEFAULT_BUILD_INFO;
|
||||
|
||||
if (buildInfoPath) {
|
||||
|
@ -768,33 +775,25 @@ function onContentLoaded() {
|
|||
// maybeShowSplash();
|
||||
|
||||
if (buildInfo.releaseType == 'PRODUCTION' && !argv.noUpdater) {
|
||||
var currentVersion = null;
|
||||
try {
|
||||
currentVersion = parseInt(buildInfo.buildIdentifier);
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
if (currentVersion !== null) {
|
||||
const CHECK_FOR_UPDATES_INTERVAL_SECONDS = 60 * 30;
|
||||
var hasShownUpdateNotification = false;
|
||||
const updateChecker = new updater.UpdateChecker(currentVersion, CHECK_FOR_UPDATES_INTERVAL_SECONDS);
|
||||
updateChecker.on('update-available', function(latestVersion, url) {
|
||||
if (!hasShownUpdateNotification) {
|
||||
notifier.notify({
|
||||
icon: notificationIcon,
|
||||
title: 'An update is available!',
|
||||
message: 'High Fidelity version ' + latestVersion + ' is available',
|
||||
wait: true,
|
||||
url: url
|
||||
});
|
||||
hasShownUpdateNotification = true;
|
||||
}
|
||||
});
|
||||
notifier.on('click', function(notifierObject, options) {
|
||||
log.debug("Got click", options.url);
|
||||
shell.openExternal(options.url);
|
||||
});
|
||||
}
|
||||
const CHECK_FOR_UPDATES_INTERVAL_SECONDS = 60 * 30;
|
||||
var hasShownUpdateNotification = false;
|
||||
const updateChecker = new updater.UpdateChecker(buildInfo, CHECK_FOR_UPDATES_INTERVAL_SECONDS);
|
||||
updateChecker.on('update-available', function(latestVersion, url) {
|
||||
if (!hasShownUpdateNotification) {
|
||||
notifier.notify({
|
||||
icon: notificationIcon,
|
||||
title: 'An update is available!',
|
||||
message: 'High Fidelity version ' + latestVersion + ' is available',
|
||||
wait: true,
|
||||
url: url
|
||||
});
|
||||
hasShownUpdateNotification = true;
|
||||
}
|
||||
});
|
||||
notifier.on('click', function(notifierObject, options) {
|
||||
log.debug("Got click", options.url);
|
||||
shell.openExternal(options.url);
|
||||
});
|
||||
}
|
||||
|
||||
deleteOldFiles(logPath, DELETE_LOG_FILES_OLDER_THAN_X_SECONDS, LOG_FILE_REGEX);
|
||||
|
|
|
@ -8,10 +8,48 @@ const os = require('os');
|
|||
const platform = os.type() == 'Windows_NT' ? 'windows' : 'mac';
|
||||
|
||||
const BUILDS_URL = 'https://highfidelity.com/builds.xml';
|
||||
const DEV_BUILDS_URL = 'https://highfidelity.com/dev-builds.xml';
|
||||
|
||||
function UpdateChecker(currentVersion, checkForUpdatesEveryXSeconds) {
|
||||
this.currentVersion = currentVersion;
|
||||
log.debug('cur', currentVersion);
|
||||
// returns 1 if A is greater, 0 if equal, -1 if A is lesser
|
||||
function semanticVersionCompare(versionA, versionB) {
|
||||
var versionAParts = versionA.split('.');
|
||||
var versionBParts = versionB.split('.');
|
||||
|
||||
// make sure each version has 3 parts
|
||||
var partsLength = versionAParts.length;
|
||||
while (partsLength < 3) {
|
||||
partsLength = versionAParts.push(0);
|
||||
}
|
||||
|
||||
partsLength = versionBParts.length;
|
||||
while (partsLength < 3) {
|
||||
partsLength = versionBParts.push(0);
|
||||
}
|
||||
|
||||
// map all of the parts to numbers
|
||||
versionAParts = versionAParts.map(Number);
|
||||
versionBParts = versionBParts.map(Number);
|
||||
|
||||
for (var i = 0; i < 3; ++i) {
|
||||
if (versionAParts[i] == versionBParts[i]) {
|
||||
continue;
|
||||
} else if (versionAParts[i] > versionBParts[i]) {
|
||||
return 1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
function UpdateChecker(buildInfo, checkForUpdatesEveryXSeconds) {
|
||||
this.stableBuild = (buildInfo.stableBuild == "1");
|
||||
|
||||
this.buildsURL = this.stableBuild ? BUILDS_URL : DEV_BUILDS_URL;
|
||||
this.currentVersion = this.stableBuild ? buildInfo.buildIdentifier : parseInt(buildInfo.buildNumber);
|
||||
|
||||
log.debug('Current version is', this.currentVersion);
|
||||
|
||||
setInterval(this.checkForUpdates.bind(this), checkForUpdatesEveryXSeconds * 1000);
|
||||
this.checkForUpdates();
|
||||
|
@ -20,7 +58,7 @@ util.inherits(UpdateChecker, events.EventEmitter);
|
|||
UpdateChecker.prototype = extend(UpdateChecker.prototype, {
|
||||
checkForUpdates: function() {
|
||||
log.debug("Checking for updates");
|
||||
request(BUILDS_URL, (error, response, body) => {
|
||||
request(this.buildsURL, (error, response, body) => {
|
||||
if (error) {
|
||||
log.debug("Error", error);
|
||||
return;
|
||||
|
@ -29,12 +67,32 @@ UpdateChecker.prototype = extend(UpdateChecker.prototype, {
|
|||
try {
|
||||
var $ = cheerio.load(body, { xmlMode: true });
|
||||
const latestBuild = $('project[name="interface"] platform[name="' + platform + '"]').children().first();
|
||||
const latestVersion = parseInt(latestBuild.find('version').text());
|
||||
log.debug("Latest version is:", latestVersion, this.currentVersion);
|
||||
if (latestVersion > this.currentVersion) {
|
||||
|
||||
var latestVersion = 0;
|
||||
|
||||
if (this.stableBuild) {
|
||||
latestVersion = latestBuild.find('stable_version').text();
|
||||
} else {
|
||||
latestVersion = parseInt(latestBuild.find('version').text());
|
||||
}
|
||||
|
||||
log.debug("Latest available update version is:", latestVersion);
|
||||
|
||||
updateAvailable = false;
|
||||
|
||||
if (this.stableBuild) {
|
||||
// compare the semantic versions to see if the update is newer
|
||||
updateAvailable = (semanticVersionCompare(latestVersion, this.currentVersion) == 1);
|
||||
} else {
|
||||
// for master builds we just compare the versions as integers
|
||||
updateAvailable = latestVersion > this.currentVersion;
|
||||
}
|
||||
|
||||
if (updateAvailable) {
|
||||
const url = latestBuild.find('url').text();
|
||||
this.emit('update-available', latestVersion, url);
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
log.warn("Error when checking for updates", e);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue