diff --git a/cockatrice/src/client/network/update/client/release_channel.cpp b/cockatrice/src/client/network/update/client/release_channel.cpp index b760c021c..f401dfd00 100644 --- a/cockatrice/src/client/network/update/client/release_channel.cpp +++ b/cockatrice/src/client/network/update/client/release_channel.cpp @@ -27,6 +27,29 @@ #define GIT_SHORT_HASH_LEN 7 +namespace +{ + +#if defined(Q_OS_MACOS) || defined(Q_OS_WIN) +// QSysInfo::productVersion() is not guaranteed to start with a number, e.g. it returns +// "Server 2022" on Windows Server. Use the first numeric token as the major host version. +std::optional getProductVersionMajor() +{ + const QString versionString = QSysInfo::productVersion(); + bool ok = false; + static const QRegularExpression firstNumber(R"((\d+))"); + const auto match = firstNumber.match(versionString); + const int version = match.hasMatch() ? match.captured(1).toInt(&ok) : 0; + if (!ok) { + qCWarning(ReleaseChannelLog) << "Unable to determine OS version from" << versionString; + return std::nullopt; + } + return version; +} +#endif + +} // namespace + ReleaseChannel::ReleaseChannel() : netMan(new QNetworkAccessManager(this)), response(nullptr), lastRelease(nullptr) { } @@ -47,18 +70,21 @@ void ReleaseChannel::checkForUpdates() // Find assets compatible with host platform (Linux is not supported by in-client updater) std::optional ReleaseChannel::getTargetVersionForCurrentOS(const QString &fileName) { +#if defined(Q_OS_WIN) && Q_PROCESSOR_WORDSIZE == 4 + // The published Windows assets are 64-bit only + Q_UNUSED(fileName); + return std::nullopt; +#endif + const QRegularExpression *regex = nullptr; - static const std::optional systemVersion = [] { - bool ok = false; - const QString versionString = QSysInfo::productVersion(); - const int version = versionString.split('.').first().toInt(&ok); - if (!ok) { - qCWarning(ReleaseChannelLog) << "Unable to determine OS version from" << versionString; - return std::optional(); - } - return std::optional{version}; - }(); + // Only platforms shipping updater assets (macOS, Windows) need the host version + static const std::optional systemVersion = +#if defined(Q_OS_MACOS) || defined(Q_OS_WIN) + getProductVersionMajor(); +#else + std::nullopt; +#endif if (!systemVersion) { return std::nullopt;