diff options
Diffstat (limited to 'rbutil/rbutilqt/base')
-rw-r--r-- | rbutil/rbutilqt/base/utils.cpp | 67 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/utils.h | 1 |
2 files changed, 68 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/base/utils.cpp b/rbutil/rbutilqt/base/utils.cpp index 767b3c1c52..ce8cb1c5a9 100644 --- a/rbutil/rbutilqt/base/utils.cpp +++ b/rbutil/rbutilqt/base/utils.cpp | |||
@@ -203,4 +203,71 @@ QString Utils::checkEnvironment(bool permission) | |||
203 | else | 203 | else |
204 | return text; | 204 | return text; |
205 | } | 205 | } |
206 | /** @brief Compare two version strings. | ||
207 | * @param s1 first version string | ||
208 | * @param s2 second version string | ||
209 | * @return 0 if strings identical, 1 if second is newer, -1 if first. | ||
210 | */ | ||
211 | int Utils::compareVersionStrings(QString s1, QString s2) | ||
212 | { | ||
213 | QString a = s1.trimmed(); | ||
214 | QString b = s2.trimmed(); | ||
215 | qDebug() << "[Utils] comparing version strings" << a << "and" << b; | ||
216 | // if strings are identical return 0. | ||
217 | if(a.isEmpty()) | ||
218 | return 1; | ||
219 | if(b.isEmpty()) | ||
220 | return -1; | ||
221 | |||
222 | while(!a.isEmpty() || !b.isEmpty()) { | ||
223 | // trim all leading non-digits and non-dots (dots are removed afterwards) | ||
224 | a.remove(QRegExp("^[^\\d\\.]*")); | ||
225 | b.remove(QRegExp("^[^\\d\\.]*")); | ||
226 | |||
227 | // trim all trailing non-digits for conversion (QString::toInt() | ||
228 | // requires this). Copy strings first as replace() changes the string. | ||
229 | QString numa = a; | ||
230 | QString numb = b; | ||
231 | numa.remove(QRegExp("\\D+.*$")); | ||
232 | numb.remove(QRegExp("\\D+.*$")); | ||
233 | |||
234 | // convert to number | ||
235 | bool ok1, ok2; | ||
236 | int vala = numa.toUInt(&ok1); | ||
237 | int valb = numb.toUInt(&ok2); | ||
238 | // if none of the numbers converted successfully we're at trailing garbage. | ||
239 | if(!ok1 && !ok2) | ||
240 | break; | ||
241 | if(!ok1) | ||
242 | return 1; | ||
243 | if(!ok2) | ||
244 | return -1; | ||
245 | |||
246 | // if numbers mismatch we have a decision. | ||
247 | if(vala != valb) | ||
248 | return (vala > valb) ? -1 : 1; | ||
249 | |||
250 | // trim leading digits. | ||
251 | a.remove(QRegExp("^\\d*")); | ||
252 | b.remove(QRegExp("^\\d*")); | ||
253 | |||
254 | // if number is immediately followed by a character consider it as | ||
255 | // version addon (like 1.2.3b). In this case compare characters too. | ||
256 | QChar ltra; | ||
257 | QChar ltrb; | ||
258 | if(a.contains(QRegExp("^[a-zA-Z]"))) | ||
259 | ltra = a.at(0); | ||
260 | if(b.contains(QRegExp("^[a-zA-Z]"))) | ||
261 | ltrb = b.at(0); | ||
262 | if(ltra != ltrb) | ||
263 | return (ltra < ltrb) ? 1 : -1; | ||
264 | // both are identical or no addon characters, ignore. | ||
265 | // remove modifiers and following dot. | ||
266 | a.remove(QRegExp("^[a-zA-Z]*\\.")); | ||
267 | b.remove(QRegExp("^[a-zA-Z]*\\.")); | ||
268 | } | ||
269 | |||
270 | // no differences found. | ||
271 | return 0; | ||
272 | } | ||
206 | 273 | ||
diff --git a/rbutil/rbutilqt/base/utils.h b/rbutil/rbutilqt/base/utils.h index cdc3d3be5b..266044d567 100644 --- a/rbutil/rbutilqt/base/utils.h +++ b/rbutil/rbutilqt/base/utils.h | |||
@@ -34,6 +34,7 @@ public: | |||
34 | static qulonglong filesystemFree(QString path); | 34 | static qulonglong filesystemFree(QString path); |
35 | static QString findExecutable(QString name); | 35 | static QString findExecutable(QString name); |
36 | static QString checkEnvironment(bool permission); | 36 | static QString checkEnvironment(bool permission); |
37 | static int compareVersionStrings(QString s1, QString s2); | ||
37 | }; | 38 | }; |
38 | 39 | ||
39 | #endif | 40 | #endif |