summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt/base/utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/rbutilqt/base/utils.cpp')
-rw-r--r--rbutil/rbutilqt/base/utils.cpp67
1 files changed, 67 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 */
211int 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