From fd8ed265558c82e6c24762b0453de8b0962665ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Mon, 21 Sep 2026 11:27:47 +0200 Subject: [PATCH] ReleaseChannel: parse non-numeric OS versions on Windows Server QSysInfo::productVersion() returns "Server 2022" on Windows Server, so splitting on '.' and calling toInt() made the version unparseable and disabled the in-client updater there. Extract the first numeric token instead; Server 2022 becomes 2022 and matches the Win10 assets. --- .../network/update/client/release_channel.cpp | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/cockatrice/src/client/network/update/client/release_channel.cpp b/cockatrice/src/client/network/update/client/release_channel.cpp index b760c021c..22fd0e0d4 100644 --- a/cockatrice/src/client/network/update/client/release_channel.cpp +++ b/cockatrice/src/client/network/update/client/release_channel.cpp @@ -27,6 +27,27 @@ #define GIT_SHORT_HASH_LEN 7 +namespace +{ + +// 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; +} + +} // namespace + ReleaseChannel::ReleaseChannel() : netMan(new QNetworkAccessManager(this)), response(nullptr), lastRelease(nullptr) { } @@ -49,16 +70,7 @@ std::optional ReleaseChannel::getTargetVersionForCurrentOS(const QString &f { 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}; - }(); + static const std::optional systemVersion = getProductVersionMajor(); if (!systemVersion) { return std::nullopt;