Don't compare non-numeric parts of the version string. (#2762)

Signed-off-by: Adam Treat <treat.adam@gmail.com>
This commit is contained in:
AT 2024-07-28 11:36:16 -04:00 committed by GitHub
parent ee6064b608
commit 78cc324e8c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 11 deletions

View File

@ -62,17 +62,24 @@ static bool operator==(const ReleaseInfo& lhs, const ReleaseInfo& rhs)
static bool compareVersions(const QString &a, const QString &b)
{
QRegularExpression regex("(\\d+)");
QStringList aParts = a.split('.');
QStringList bParts = b.split('.');
Q_ASSERT(aParts.size() == 3);
Q_ASSERT(bParts.size() == 3);
for (int i = 0; i < std::min(aParts.size(), bParts.size()); ++i) {
int aInt = aParts[i].toInt();
int bInt = bParts[i].toInt();
if (aInt > bInt) {
return true;
} else if (aInt < bInt) {
return false;
QRegularExpressionMatch aMatch = regex.match(aParts[i]);
QRegularExpressionMatch bMatch = regex.match(bParts[i]);
Q_ASSERT(aMatch.hasMatch() && bMatch.hasMatch());
if (aMatch.hasMatch() && bMatch.hasMatch()) {
int aInt = aMatch.captured(1).toInt();
int bInt = bMatch.captured(1).toInt();
if (aInt > bInt) {
return true;
} else if (aInt < bInt) {
return false;
}
}
}

View File

@ -1444,14 +1444,21 @@ void ModelList::updateDataForSettings()
static std::strong_ordering compareVersions(const QString &a, const QString &b)
{
QRegularExpression regex("(\\d+)");
QStringList aParts = a.split('.');
QStringList bParts = b.split('.');
Q_ASSERT(aParts.size() == 3);
Q_ASSERT(bParts.size() == 3);
for (int i = 0; i < std::min(aParts.size(), bParts.size()); ++i) {
int aInt = aParts[i].toInt();
int bInt = bParts[i].toInt();
if (auto diff = aInt <=> bInt; diff != 0) {
return diff;
QRegularExpressionMatch aMatch = regex.match(aParts[i]);
QRegularExpressionMatch bMatch = regex.match(bParts[i]);
Q_ASSERT(aMatch.hasMatch() && bMatch.hasMatch());
if (aMatch.hasMatch() && bMatch.hasMatch()) {
int aInt = aMatch.captured(1).toInt();
int bInt = bMatch.captured(1).toInt();
if (auto diff = aInt <=> bInt; diff != 0)
return diff;
}
}