summaryrefslogtreecommitdiffstats
path: root/rbutil/rbutilqt/base
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/rbutilqt/base')
-rw-r--r--rbutil/rbutilqt/base/utils.cpp67
-rw-r--r--rbutil/rbutilqt/base/utils.h1
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)
else
return text;
}
+/** @brief Compare two version strings.
+ * @param s1 first version string
+ * @param s2 second version string
+ * @return 0 if strings identical, 1 if second is newer, -1 if first.
+ */
+int Utils::compareVersionStrings(QString s1, QString s2)
+{
+ QString a = s1.trimmed();
+ QString b = s2.trimmed();
+ qDebug() << "[Utils] comparing version strings" << a << "and" << b;
+ // if strings are identical return 0.
+ if(a.isEmpty())
+ return 1;
+ if(b.isEmpty())
+ return -1;
+
+ while(!a.isEmpty() || !b.isEmpty()) {
+ // trim all leading non-digits and non-dots (dots are removed afterwards)
+ a.remove(QRegExp("^[^\\d\\.]*"));
+ b.remove(QRegExp("^[^\\d\\.]*"));
+
+ // trim all trailing non-digits for conversion (QString::toInt()
+ // requires this). Copy strings first as replace() changes the string.
+ QString numa = a;
+ QString numb = b;
+ numa.remove(QRegExp("\\D+.*$"));
+ numb.remove(QRegExp("\\D+.*$"));
+
+ // convert to number
+ bool ok1, ok2;
+ int vala = numa.toUInt(&ok1);
+ int valb = numb.toUInt(&ok2);
+ // if none of the numbers converted successfully we're at trailing garbage.
+ if(!ok1 && !ok2)
+ break;
+ if(!ok1)
+ return 1;
+ if(!ok2)
+ return -1;
+
+ // if numbers mismatch we have a decision.
+ if(vala != valb)
+ return (vala > valb) ? -1 : 1;
+
+ // trim leading digits.
+ a.remove(QRegExp("^\\d*"));
+ b.remove(QRegExp("^\\d*"));
+
+ // if number is immediately followed by a character consider it as
+ // version addon (like 1.2.3b). In this case compare characters too.
+ QChar ltra;
+ QChar ltrb;
+ if(a.contains(QRegExp("^[a-zA-Z]")))
+ ltra = a.at(0);
+ if(b.contains(QRegExp("^[a-zA-Z]")))
+ ltrb = b.at(0);
+ if(ltra != ltrb)
+ return (ltra < ltrb) ? 1 : -1;
+ // both are identical or no addon characters, ignore.
+ // remove modifiers and following dot.
+ a.remove(QRegExp("^[a-zA-Z]*\\."));
+ b.remove(QRegExp("^[a-zA-Z]*\\."));
+ }
+
+ // no differences found.
+ return 0;
+}
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:
static qulonglong filesystemFree(QString path);
static QString findExecutable(QString name);
static QString checkEnvironment(bool permission);
+ static int compareVersionStrings(QString s1, QString s2);
};
#endif