summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2010-06-30 21:59:47 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2010-06-30 21:59:47 +0000
commit10b8e327d8c0d37b8a9f1997e33e4bf1a97bb39b (patch)
tree96787bf458cec93c63bfd37904388450ce32052a
parent35150b6dcb18089ba76a660e6b73caf1dad86579 (diff)
downloadrockbox-10b8e327d8c0d37b8a9f1997e33e4bf1a97bb39b.tar.gz
rockbox-10b8e327d8c0d37b8a9f1997e33e4bf1a97bb39b.zip
FS#11439: Fix version comparison regression.
Improve string suffix handling by distinguishing between version number separators (i.e. dots) and extended separators and additional version characters. Corrects false update information displayed for 64bit binaries of Rockbox Utility. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27201 a1c6a512-1295-4272-9138-f99709370657
-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