diff options
-rw-r--r-- | rbutil/rbutilqt/base/utils.cpp | 16 | ||||
-rw-r--r-- | rbutil/rbutilqt/test/compareversion.cpp | 11 |
2 files changed, 23 insertions, 4 deletions
diff --git a/rbutil/rbutilqt/base/utils.cpp b/rbutil/rbutilqt/base/utils.cpp index 1452ada330..bd2bce0609 100644 --- a/rbutil/rbutilqt/base/utils.cpp +++ b/rbutil/rbutilqt/base/utils.cpp | |||
@@ -211,9 +211,9 @@ QString Utils::checkEnvironment(bool permission) | |||
211 | */ | 211 | */ |
212 | int Utils::compareVersionStrings(QString s1, QString s2) | 212 | int Utils::compareVersionStrings(QString s1, QString s2) |
213 | { | 213 | { |
214 | qDebug() << "[Utils] comparing version strings" << s1 << "and" << s2; | ||
214 | QString a = s1.trimmed(); | 215 | QString a = s1.trimmed(); |
215 | QString b = s2.trimmed(); | 216 | QString b = s2.trimmed(); |
216 | qDebug() << "[Utils] comparing version strings" << a << "and" << b; | ||
217 | // if strings are identical return 0. | 217 | // if strings are identical return 0. |
218 | if(a.isEmpty()) | 218 | if(a.isEmpty()) |
219 | return 1; | 219 | return 1; |
@@ -252,8 +252,19 @@ int Utils::compareVersionStrings(QString s1, QString s2) | |||
252 | a.remove(QRegExp("^\\d*")); | 252 | a.remove(QRegExp("^\\d*")); |
253 | b.remove(QRegExp("^\\d*")); | 253 | b.remove(QRegExp("^\\d*")); |
254 | 254 | ||
255 | // If only one of the following characters is a dot that one is | ||
256 | // "greater" then anything else. Make sure it's followed by a number, | ||
257 | // Otherwise it might be the end of the string or suffix. Do this | ||
258 | // before version addon characters check to avoid stopping too early. | ||
259 | bool adot = a.contains(QRegExp("^[a-zA-Z]*\\.[0-9]")); | ||
260 | bool bdot = b.contains(QRegExp("^[a-zA-Z]*\\.[0-9]")); | ||
261 | if(adot && !bdot) | ||
262 | return -1; | ||
263 | if(!adot && bdot) | ||
264 | return 1; | ||
255 | // if number is immediately followed by a character consider it as | 265 | // if number is immediately followed by a character consider it as |
256 | // version addon (like 1.2.3b). In this case compare characters too. | 266 | // version addon (like 1.2.3b). In this case compare characters and end |
267 | // (version numbers like 1.2b.3 aren't handled). | ||
257 | QChar ltra; | 268 | QChar ltra; |
258 | QChar ltrb; | 269 | QChar ltrb; |
259 | if(a.contains(QRegExp("^[a-zA-Z]"))) | 270 | if(a.contains(QRegExp("^[a-zA-Z]"))) |
@@ -262,6 +273,7 @@ int Utils::compareVersionStrings(QString s1, QString s2) | |||
262 | ltrb = b.at(0); | 273 | ltrb = b.at(0); |
263 | if(ltra != ltrb) | 274 | if(ltra != ltrb) |
264 | return (ltra < ltrb) ? 1 : -1; | 275 | return (ltra < ltrb) ? 1 : -1; |
276 | |||
265 | // both are identical or no addon characters, ignore. | 277 | // both are identical or no addon characters, ignore. |
266 | // remove modifiers and following dot. | 278 | // remove modifiers and following dot. |
267 | a.remove(QRegExp("^[a-zA-Z]*\\.")); | 279 | a.remove(QRegExp("^[a-zA-Z]*\\.")); |
diff --git a/rbutil/rbutilqt/test/compareversion.cpp b/rbutil/rbutilqt/test/compareversion.cpp index db1c62e5d5..80bddf733a 100644 --- a/rbutil/rbutilqt/test/compareversion.cpp +++ b/rbutil/rbutilqt/test/compareversion.cpp | |||
@@ -62,6 +62,12 @@ const struct testvector testdata[] = | |||
62 | { "test-1.2.3.tar.gz", "program-1.2.3.1.tar.bz2", 1 }, | 62 | { "test-1.2.3.tar.gz", "program-1.2.3.1.tar.bz2", 1 }, |
63 | { "program-1.2.3.zip", "program-1.2.3a.zip", 1 }, | 63 | { "program-1.2.3.zip", "program-1.2.3a.zip", 1 }, |
64 | { "program-1.2.3.tar.bz2", "2.0.0", 1 }, | 64 | { "program-1.2.3.tar.bz2", "2.0.0", 1 }, |
65 | { "prog-1.2-64bit.tar.bz2", "prog-1.2.3.tar.bz2", 1 }, | ||
66 | { "prog-1.2-64bit.tar.bz2", "prog-1.2-64bit.tar.bz2", 0 }, | ||
67 | { "prog-1.2-64bit.tar.bz2", "prog-1.2.3-64bit.tar.bz2", 1 }, | ||
68 | { "prog-1.2a-64bit.tar.bz2","prog-1.2b-64bit.tar.bz2", 1 }, | ||
69 | { "prog-1.2-64bit.tar.bz2", "prog-1.2.3a-64bit.tar.bz2", 1 }, | ||
70 | { "prog-1.2a-64bit.tar.bz2","prog-1.2.3-64bit.tar.bz2", 1 }, | ||
65 | }; | 71 | }; |
66 | 72 | ||
67 | 73 | ||
@@ -72,8 +78,9 @@ void TestVersionCompare::testMain() | |||
72 | QCOMPARE(Utils::compareVersionStrings(testdata[i].first, | 78 | QCOMPARE(Utils::compareVersionStrings(testdata[i].first, |
73 | testdata[i].second), testdata[i].expected); | 79 | testdata[i].second), testdata[i].expected); |
74 | // inverse test possible because function return values are symmetrical. | 80 | // inverse test possible because function return values are symmetrical. |
75 | QCOMPARE(Utils::compareVersionStrings(testdata[i].second, | 81 | if(testdata[i].expected != 0) |
76 | testdata[i].first), -testdata[i].expected); | 82 | QCOMPARE(Utils::compareVersionStrings(testdata[i].second, |
83 | testdata[i].first), -testdata[i].expected); | ||
77 | } | 84 | } |
78 | } | 85 | } |
79 | 86 | ||