summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rbutil/rbutilqt/base/utils.cpp16
-rw-r--r--rbutil/rbutilqt/test/compareversion.cpp11
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 */
212int Utils::compareVersionStrings(QString s1, QString s2) 212int 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