22 #include <QNetworkAccessManager>
24 #include <QJsonDocument>
25 #include <QJsonObject>
26 #include <QNetworkReply>
28 #include <QRegularExpression>
33 const QString versionUrl{QStringLiteral(
"https://api.github.com/repos/qTox/qTox/releases/latest")};
34 const QString versionRegexString{QStringLiteral(
"v([0-9]+)\\.([0-9]+)\\.([0-9]+)")};
42 Version tagToVersion(QString tagName)
45 QRegularExpression versionFormat(versionRegexString);
46 auto matches = versionFormat.match(tagName);
47 assert(matches.lastCapturedIndex() == 3);
50 auto major = matches.captured(1).toInt(&ok);
52 auto minor = matches.captured(2).toInt(&ok);
54 auto patch = matches.captured(3).toInt(&ok);
57 return {major, minor, patch};
60 bool isUpdateAvailable(Version current, Version available)
89 bool isCurrentVersionStable()
91 QRegularExpression versionRegex(versionRegexString);
92 auto currentVer = versionRegex.match(GIT_DESCRIBE_EXACT);
93 if (currentVer.hasMatch()){
105 qInfo() <<
"qTox is running version:" << GIT_DESCRIBE;
118 if (isCurrentVersionStable() ==
false) {
119 qWarning() <<
"Currently running an untested/unstable version of qTox";
125 QNetworkRequest request{versionUrl};
131 assert(reply !=
nullptr);
132 if (reply ==
nullptr) {
133 qWarning() <<
"Update check returned null reply, ignoring";
137 if (reply->error() != QNetworkReply::NoError) {
138 qWarning() <<
"Failed to check for update:" << reply->error();
140 reply->deleteLater();
143 QByteArray result = reply->readAll();
144 QJsonDocument doc = QJsonDocument::fromJson(result);
145 QJsonObject jObject = doc.object();
146 QVariantMap mainMap = jObject.toVariantMap();
147 QString latestVersion = mainMap[
"tag_name"].toString();
148 if (latestVersion.isEmpty()) {
149 qWarning() <<
"No tag name found in response:";
151 reply->deleteLater();
155 auto currentVer = tagToVersion(GIT_DESCRIBE);
156 auto availableVer = tagToVersion(latestVersion);
158 if (isUpdateAvailable(currentVer, availableVer)) {
159 qInfo() <<
"Update available to version" << latestVersion;
160 QUrl link{mainMap[
"html_url"].toString()};
163 qInfo() <<
"qTox is up to date";
167 reply->deleteLater();