From f2798c225ad783afc1e170a393656c1a645e09ab Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Tue, 21 Dec 2021 10:52:27 +0100 Subject: rbutil: Simplify reading rockbox-info.txt. Simplify, and replace use of QRegExp with QRegularExpression for Qt6 compatibility. Also fix the test running on Windows. RockboxInfo constructs the filename from path and filename, so we cannot pass an empty path, since that results in an invalid path. On Linux / MacOS this works only because we use an absolute path. Change-Id: Ieaf30a2df005291d3e997aabf42d64ee832381c2 --- utils/rbutilqt/base/rockboxinfo.cpp | 70 +++++++++++++++++--------------- utils/rbutilqt/test/test-rockboxinfo.cpp | 14 ++++--- 2 files changed, 47 insertions(+), 37 deletions(-) (limited to 'utils/rbutilqt') diff --git a/utils/rbutilqt/base/rockboxinfo.cpp b/utils/rbutilqt/base/rockboxinfo.cpp index f34adbfc2f..744559fdec 100644 --- a/utils/rbutilqt/base/rockboxinfo.cpp +++ b/utils/rbutilqt/base/rockboxinfo.cpp @@ -18,15 +18,18 @@ #include "rockboxinfo.h" -#include -#include +#include +#include +#include #include "Logger.h" -RockboxInfo::RockboxInfo(QString mountpoint, QString fname) +RockboxInfo::RockboxInfo(QString mountpoint, QString fname) : + m_ram(0), + m_voicefmt(0), + m_success(false) { LOG_INFO() << "Getting version info from rockbox-info.txt"; QFile file(mountpoint + "/" + fname); - m_success = false; m_voicefmt = 400; // default value for compatibility if(!file.exists()) return; @@ -35,44 +38,47 @@ RockboxInfo::RockboxInfo(QString mountpoint, QString fname) return; // read file contents - QRegExp hash("^Version:\\s+(r?)([0-9a-fM]+)"); - QRegExp version("^Version:\\s+(\\S.*)"); - QRegExp release("^Version:\\s+([0-9\\.]+)\\s*$"); - QRegExp target("^Target:\\s+(\\S.*)"); - QRegExp features("^Features:\\s+(\\S.*)"); - QRegExp targetid("^Target id:\\s+(\\S.*)"); - QRegExp memory("^Memory:\\s+(\\S.*)"); - QRegExp voicefmt("^Voice format:\\s+(\\S.*)"); + QRegularExpression parts("^([A-Z][a-z ]+):\\s+(.*)"); + while (!file.atEnd()) { QString line = file.readLine().trimmed(); - if(version.indexIn(line) >= 0) { - m_version = version.cap(1); - } - if(release.indexIn(line) >= 0) { - m_release = release.cap(1); + auto match = parts.match(line); + if(!match.isValid()) + { + continue; } - if(hash.indexIn(line) >= 0) { - // git hashes are usually at least 7 characters. - // svn revisions are expected to be at least 4 digits. - if(hash.cap(2).size() > 3) - m_revision = hash.cap(2); + + if(match.captured(1) == "Version") { + m_version = match.captured(2); + + if(match.captured(2).contains(".")) { + // version number + m_release = match.captured(2); + } + if(match.captured(2).contains("-")) { + // hash-date format. Revision is first part. + m_revision = match.captured(2).split("-").at(0); + if(m_revision.startsWith("r")) { + m_revision.remove(0, 1); + } + } } - else if(target.indexIn(line) >= 0) { - m_target = target.cap(1); + else if(match.captured(1) == "Target") { + m_target = match.captured(2); } - else if(features.indexIn(line) >= 0) { - m_features = features.cap(1); + else if(match.captured(1) == "Features") { + m_features = match.captured(2); } - else if(targetid.indexIn(line) >= 0) { - m_targetid = targetid.cap(1); + else if(match.captured(1) == "Target id") { + m_targetid = match.captured(2); } - else if(memory.indexIn(line) >= 0) { - m_ram = memory.cap(1).toInt(); + else if(match.captured(1) == "Memory") { + m_ram = match.captured(2).toInt(); } - else if(voicefmt.indexIn(line) >= 0) { - m_voicefmt = voicefmt.cap(1).toInt(); + else if(match.captured(1) == "Voice format") { + m_voicefmt = match.captured(2).toInt(); } } diff --git a/utils/rbutilqt/test/test-rockboxinfo.cpp b/utils/rbutilqt/test/test-rockboxinfo.cpp index 9d2b53b3ab..69189f585e 100644 --- a/utils/rbutilqt/test/test-rockboxinfo.cpp +++ b/utils/rbutilqt/test/test-rockboxinfo.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "rockboxinfo.h" @@ -83,12 +84,12 @@ void TestRockboxInfo::testVersion() QFETCH(QString, release); QTemporaryFile tf(this); tf.open(); - QString filename = tf.fileName(); + QFileInfo finfo(tf); tf.write(input.toLatin1()); tf.write("\n"); tf.close(); - RockboxInfo info("", filename); + RockboxInfo info(finfo.path(), finfo.fileName()); QCOMPARE(info.version(), QString(version)); QCOMPARE(info.revision(), QString(revision)); QCOMPARE(info.release(), QString(release)); @@ -112,13 +113,14 @@ void TestRockboxInfo::testTarget() QFETCH(QString, target); QTemporaryFile tf(this); tf.open(); + QFileInfo finfo(tf); QString filename = tf.fileName(); tf.write(prefix.at(j).toLatin1()); tf.write(target.toLatin1()); tf.write("\n"); tf.close(); - RockboxInfo info("", filename); + RockboxInfo info(finfo.path(), finfo.fileName()); QCOMPARE(info.target(), target); } } @@ -141,13 +143,14 @@ void TestRockboxInfo::testMemory() QFETCH(QString, memory); QTemporaryFile tf(this); tf.open(); + QFileInfo finfo(tf); QString filename = tf.fileName(); tf.write(prefix.at(j).toLatin1()); tf.write(memory.toLatin1()); tf.write("\n"); tf.close(); - RockboxInfo info("", filename); + RockboxInfo info(finfo.path(), finfo.fileName()); QCOMPARE(info.ram(), memory.toInt()); } } @@ -168,13 +171,14 @@ void TestRockboxInfo::testFeatures() QFETCH(QString, features); QTemporaryFile tf(this); tf.open(); + QFileInfo finfo(tf); QString filename = tf.fileName(); tf.write(prefix.at(j).toLatin1()); tf.write(features.toLatin1()); tf.write("\n"); tf.close(); - RockboxInfo info("", filename); + RockboxInfo info(finfo.path(), finfo.fileName()); QCOMPARE(info.features(), features); } } -- cgit v1.2.3