Change stable channel downloads to use only github api and links (#2515)

* Change stable channel downloads to use only github api and links

Ref #2502
This commit is contained in:
Gavin Bisesi 2017-03-25 16:35:04 -04:00 committed by GitHub
parent 3374576831
commit 6f30304271
3 changed files with 50 additions and 62 deletions

View file

@ -167,6 +167,7 @@ void DlgUpdate::downloadSuccessful(QUrl filepath) {
if (QDesktopServices::openUrl(filepath))
{
QMetaObject::invokeMethod((MainWindow*) parent(), "close", Qt::QueuedConnection);
qDebug() << "Opened downloaded update file successfully - closing Cockatrice";
close();
} else {
setLabel(tr("Error"));

View file

@ -3,14 +3,11 @@
#include "version_string.h"
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QMessageBox>
#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 STABLEFILES_URL "https://api.bintray.com/packages/cockatrice/Cockatrice/Cockatrice/files"
#define STABLEDOWNLOAD_URL "https://dl.bintray.com/cockatrice/Cockatrice/"
#define STABLEMANUALDOWNLOAD_URL "https://bintray.com/cockatrice/Cockatrice/Cockatrice/_latestVersion#files"
#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"
@ -42,16 +39,16 @@ void ReleaseChannel::checkForUpdates()
}
#if defined(Q_OS_OSX)
bool ReleaseChannel::downloadMatchesCurrentOS(QVariantMap build)
bool ReleaseChannel::downloadMatchesCurrentOS(const QString &fileName)
{
return build["name"].toString().endsWith(".dmg");
return fileName.endsWith(".dmg");
}
#elif defined(Q_OS_WIN)
#include <QSysInfo>
bool ReleaseChannel::downloadMatchesCurrentOS(QVariantMap build)
bool ReleaseChannel::downloadMatchesCurrentOS(const QString &fileName)
{
QString wordSize = QSysInfo::buildAbi().split('-')[2];
QString arch;
@ -68,18 +65,13 @@ bool ReleaseChannel::downloadMatchesCurrentOS(QVariantMap build)
return false;
}
auto fileName = build["name"].toString();
// Checking for .zip is a workaround for the May 6th 2016 release
auto zipName = arch + ".zip";
auto exeName = arch + ".exe";
auto zipDebugName = devSnapshotEnd + ".zip";
auto exeDebugName = devSnapshotEnd + ".exe";
return (fileName.endsWith(exeName) || fileName.endsWith(zipName) ||
fileName.endsWith(exeDebugName) || fileName.endsWith(zipDebugName));
return (fileName.endsWith(exeName) || fileName.endsWith(exeDebugName));
}
#else
bool ReleaseChannel::downloadMatchesCurrentOS(QVariantMap)
bool ReleaseChannel::downloadMatchesCurrentOS(const QString &)
{
//If the OS doesn't fit one of the above #defines, then it will never match
return false;
@ -132,13 +124,41 @@ void StableReleaseChannel::releaseListFinished()
lastRelease->setDescriptionUrl(resultMap["html_url"].toString());
lastRelease->setPublishDate(resultMap["published_at"].toDate());
if (resultMap.contains("assets")) {
auto rawAssets = resultMap["assets"].toList();
// [(name, url)]
QVector<std::pair<QString, QString>> assets;
std::transform(rawAssets.begin(), rawAssets.end(), std::back_inserter(assets), [](QVariant _asset) {
QVariantMap asset = _asset.toMap();
QString name = asset["name"].toString();
QString url = asset["browser_download_url"].toString();
return std::make_pair(name, url);
});
auto _releaseAsset = std::find_if(assets.begin(), assets.end(), [](std::pair<QString, QString> nameAndUrl) {
return downloadMatchesCurrentOS(nameAndUrl.first);
});
if (_releaseAsset != assets.end()) {
std::pair<QString, QString> releaseAsset = *_releaseAsset;
auto releaseUrl = releaseAsset.second;
lastRelease->setDownloadUrl(releaseUrl);
}
}
QString shortHash = lastRelease->getCommitHash().left(GIT_SHORT_HASH_LEN);
QString myHash = QString(VERSION_COMMIT);
qDebug() << "Current hash=" << myHash << "update hash=" << shortHash;
qDebug() << "Got reply from release server, size=" << tmp.size()
<< "name=" << lastRelease->getName()
<< "desc=" << lastRelease->getDescriptionUrl()
<< "date=" << lastRelease->getPublishDate();
<< "date=" << lastRelease->getPublishDate()
<< "url=" << lastRelease->getDownloadUrl();
QString url = QString(STABLETAG_URL) + resultMap["tag_name"].toString();
qDebug() << "Searching for a corresponding tag on the stable channel: " << url;
const QString &tagName = resultMap["tag_name"].toString();
QString url = QString(STABLETAG_URL) + tagName;
qDebug() << "Searching for commit hash corresponding to stable channel tag: " << tagName;
response = netMan->get(QNetworkRequest(url));
connect(response, SIGNAL(finished()), this, SLOT(tagListFinished()));
}
@ -168,55 +188,20 @@ void StableReleaseChannel::tagListFinished()
qDebug() << "Got reply from tag server, size=" << tmp.size()
<< "commit=" << lastRelease->getCommitHash();
qDebug() << "Searching for a corresponding file on the stable channel: " << QString(STABLEFILES_URL);
response = netMan->get(QNetworkRequest(QString(STABLEFILES_URL)));
connect(response, SIGNAL(finished()), this, SLOT(fileListFinished()));
}
void StableReleaseChannel::fileListFinished()
{
QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
bool ok;
QString tmp = QString(reply->readAll());
reply->deleteLater();
QVariantList resultList = QtJson::Json::parse(tmp, ok).toList();
if (!ok) {
qWarning() << "No reply received from the file update server:" << tmp;
emit error(tr("No reply received from the file update server."));
return;
}
QString shortHash = lastRelease->getCommitHash().left(GIT_SHORT_HASH_LEN);
QString myHash = QString(VERSION_COMMIT);
qDebug() << "Current hash=" << myHash << "update hash=" << shortHash;
const bool needToUpdate = (QString::compare(shortHash, myHash, Qt::CaseInsensitive) != 0);
bool needToUpdate = (QString::compare(shortHash, myHash, Qt::CaseInsensitive) != 0);
bool compatibleVersion = false;
foreach(QVariant file, resultList)
{
QVariantMap map = file.toMap();
// TODO: map github version to bintray version
/*
if(!map.contains("version"))
continue;
if(!map["version"].toString().endsWith(shortHash))
continue;
*/
emit finishedCheck(needToUpdate, lastRelease->isCompatibleVersionFound(), lastRelease);
}
if(!downloadMatchesCurrentOS(map))
continue;
compatibleVersion = true;
QString url = QString(STABLEDOWNLOAD_URL) + map["path"].toString();
lastRelease->setDownloadUrl(url);
qDebug() << "Found compatible version url=" << url;
break;
}
emit finishedCheck(needToUpdate, compatibleVersion, lastRelease);
void StableReleaseChannel::fileListFinished()
{
// Only implemented to satisfy interface
return;
}
QString DevReleaseChannel::getManualDownloadUrl() const
@ -310,7 +295,7 @@ void DevReleaseChannel::fileListFinished()
if(!map["version"].toString().endsWith(shortHash))
continue;
if(!downloadMatchesCurrentOS(map))
if(!downloadMatchesCurrentOS(map["build"].toString()))
continue;
compatibleVersion = true;

View file

@ -18,10 +18,11 @@ public:
private:
QString name, descriptionUrl, downloadUrl, commitHash;
QDate publishDate;
bool compatibleVersionFound = false;
protected:
void setName(QString _name) { name = _name; }
void setDescriptionUrl(QString _descriptionUrl) { descriptionUrl = _descriptionUrl; }
void setDownloadUrl(QString _downloadUrl) { downloadUrl = _downloadUrl; }
void setDownloadUrl(QString _downloadUrl) { downloadUrl = _downloadUrl; compatibleVersionFound = true; }
void setCommitHash(QString _commitHash) { commitHash = _commitHash; }
void setPublishDate(QDate _publishDate) { publishDate = _publishDate; }
public:
@ -30,6 +31,7 @@ public:
QString getDownloadUrl() const { return downloadUrl; }
QString getCommitHash() const { return commitHash; }
QDate getPublishDate() const { return publishDate; }
bool isCompatibleVersionFound() const { return compatibleVersionFound; }
};
class ReleaseChannel: public QObject {
@ -45,7 +47,7 @@ protected:
QNetworkReply *response;
Release * lastRelease;
protected:
static bool downloadMatchesCurrentOS(QVariantMap build);
static bool downloadMatchesCurrentOS(const QString &fileName);
virtual QString getReleaseChannelUrl() const = 0;
public:
int getIndex() const { return index; }