diff --git a/cockatrice/src/dlg_update.cpp b/cockatrice/src/dlg_update.cpp index d6262f55..b292d276 100644 --- a/cockatrice/src/dlg_update.cpp +++ b/cockatrice/src/dlg_update.cpp @@ -125,7 +125,7 @@ void DlgUpdate::finishedUpdateCheck(bool needToUpdate, bool isCompatible, Releas //If there is an update, save its URL and work out its name updateUrl = release->getDownloadUrl(); - QMessageBox::StandardButton reply; + int reply; reply = QMessageBox::question(this, "Update Available", tr("A new version is available:
%1
published on %2 ." "
More informations are available on the release changelog" diff --git a/cockatrice/src/releasechannel.cpp b/cockatrice/src/releasechannel.cpp index 52dfbcc9..19788a61 100644 --- a/cockatrice/src/releasechannel.cpp +++ b/cockatrice/src/releasechannel.cpp @@ -4,16 +4,18 @@ #include #include +#include +#include +#include #define STABLERELEASE_URL "https://api.github.com/repos/Cockatrice/Cockatrice/releases/latest" #define STABLETAG_URL "https://api.github.com/repos/Cockatrice/Cockatrice/git/refs/tags/" #define STABLEMANUALDOWNLOAD_URL "https://github.com/Cockatrice/Cockatrice/releases/latest" -#define DEVRELEASE_URL "https://api.github.com/repos/Cockatrice/Cockatrice/commits/master" -#define DEVFILES_URL "https://api.bintray.com/packages/cockatrice/Cockatrice/Cockatrice-git/files" -#define DEVDOWNLOAD_URL "https://dl.bintray.com/cockatrice/Cockatrice/" -#define DEVMANUALDOWNLOAD_URL "https://bintray.com/cockatrice/Cockatrice/Cockatrice-git/_latestVersion#files" +#define DEVRELEASE_URL "https://api.github.com/repos/Cockatrice/Cockatrice/releases" +#define DEVMANUALDOWNLOAD_URL "https://github.com/Cockatrice/Cockatrice/releases/" #define DEVRELEASE_DESCURL "https://github.com/Cockatrice/Cockatrice/compare/%1...%2" + #define GIT_SHORT_HASH_LEN 7 int ReleaseChannel::sharedIndex = 0; @@ -66,8 +68,8 @@ bool ReleaseChannel::downloadMatchesCurrentOS(const QString &fileName) } auto exeName = arch + ".exe"; - auto exeDebugName = devSnapshotEnd + ".exe"; - return (fileName.endsWith(exeName) || fileName.endsWith(exeDebugName)); + auto exeDevName = devSnapshotEnd + ".exe"; + return (fileName.endsWith(exeName) || fileName.endsWith(exeDevName)); } #else @@ -117,7 +119,7 @@ void StableReleaseChannel::releaseListFinished() return; } - if(!lastRelease) + if (!lastRelease) lastRelease = new Release; lastRelease->setName(resultMap["name"].toString()); @@ -219,63 +221,75 @@ QString DevReleaseChannel::getReleaseChannelUrl() const return QString(DEVRELEASE_URL); } + void DevReleaseChannel::releaseListFinished() { QNetworkReply *reply = static_cast(sender()); - bool ok; - QString tmp = QString(reply->readAll()); + QByteArray jsonData = reply->readAll(); reply->deleteLater(); - QVariantMap resultMap = QtJson::Json::parse(tmp, ok).toMap(); - if (!ok) { - qWarning() << "No reply received from the release update server:" << tmp; + QJsonDocument doc = QJsonDocument::fromJson(jsonData); + QJsonArray array = doc.array(); + + /* + * Get the latest release on GitHub + * This can be either a pre-release or a published release + * depending on timing. Both are acceptable. + */ + QVariantMap resultMap = array.at(0).toObject().toVariantMap(); + + if (array.size() == 0 || resultMap.size() == 0) { + qWarning() << "No reply received from the release update server:" << QString(jsonData); emit error(tr("No reply received from the release update server.")); return; } - if(!(resultMap.contains("commit") && - resultMap.contains("html_url") && - resultMap.contains("sha") && - resultMap["commit"].toMap().contains("author") && - resultMap["commit"].toMap()["author"].toMap().contains("date"))) { - qWarning() << "Invalid received from the release update server:" << tmp; + // Make sure resultMap has all elements we'll need + if (!resultMap.contains("assets") || + !resultMap.contains("author") || + !resultMap.contains("tag_name") || + !resultMap.contains("target_commitish") || + !resultMap.contains("assets_url") || + !resultMap.contains("created_at")) + { + qWarning() << "Invalid received from the release update server:" << resultMap; emit error(tr("Invalid reply received from the release update server.")); return; } - if(!lastRelease) + if (lastRelease == nullptr) lastRelease = new Release; - - lastRelease->setCommitHash(resultMap["sha"].toString()); - lastRelease->setPublishDate(resultMap["commit"].toMap()["author"].toMap()["date"].toDate()); + lastRelease->setCommitHash(resultMap["target_commitish"].toString()); + lastRelease->setPublishDate(resultMap["created_at"].toDate()); QString shortHash = lastRelease->getCommitHash().left(GIT_SHORT_HASH_LEN); - lastRelease->setName("Commit " + shortHash); - + lastRelease->setName(QString("%1 (%2)").arg(resultMap["tag_name"].toString()).arg(shortHash)); lastRelease->setDescriptionUrl(QString(DEVRELEASE_DESCURL).arg(VERSION_COMMIT, shortHash)); - qDebug() << "Got reply from release server, size=" << tmp.size() + qDebug() << "Got reply from release server, size=" << resultMap.size() << "name=" << lastRelease->getName() << "desc=" << lastRelease->getDescriptionUrl() << "commit=" << lastRelease->getCommitHash() << "date=" << lastRelease->getPublishDate(); - qDebug() << "Searching for a corresponding file on the dev channel: " << QString(DEVFILES_URL); - response = netMan->get(QNetworkRequest(QString(DEVFILES_URL))); + QString devBuildDownloadUrl = resultMap["assets_url"].toString(); + + qDebug() << "Searching for a corresponding file on the dev channel: " << devBuildDownloadUrl; + response = netMan->get(QNetworkRequest(devBuildDownloadUrl)); connect(response, SIGNAL(finished()), this, SLOT(fileListFinished())); } void DevReleaseChannel::fileListFinished() { QNetworkReply *reply = static_cast(sender()); - bool ok; - QString tmp = QString(reply->readAll()); + QByteArray jsonData = reply->readAll(); reply->deleteLater(); + bool ok; - QVariantList resultList = QtJson::Json::parse(tmp, ok).toList(); + QVariantList resultList = QtJson::Json::parse(jsonData, ok).toList(); if (!ok) { - qWarning() << "No reply received from the file update server:" << tmp; + qWarning() << "No reply received from the file update server:" << QString(jsonData); emit error(tr("No reply received from the file update server.")); return; } @@ -290,20 +304,17 @@ void DevReleaseChannel::fileListFinished() foreach(QVariant file, resultList) { QVariantMap map = file.toMap(); - if(!map.contains("version")) - continue; - if(!map["version"].toString().endsWith(shortHash)) - continue; - if(!downloadMatchesCurrentOS(map["build"].toString())) + QString url = map["browser_download_url"].toString(); + + if (!downloadMatchesCurrentOS(url)) continue; compatibleVersion = true; - QString url = QString(DEVDOWNLOAD_URL) + map["path"].toString(); lastRelease->setDownloadUrl(url); qDebug() << "Found compatible version url=" << url; break; } emit finishedCheck(needToUpdate, compatibleVersion, lastRelease); -} +} \ No newline at end of file