From 16261ad4723e1400dc1aa06d021501febd0c76e0 Mon Sep 17 00:00:00 2001 From: Daniele Bortolotti Date: Wed, 19 Oct 2022 14:24:16 +0200 Subject: [PATCH] McuSupport: Improve version detector logic McuPackageDirectoryVersionDetector class name was misleading, McuPackageDirectoryEntriesVersionDetector better describes its purpose as it can be used to search for a regex match among the entries in packagePath filtered by filePattern. Also, remove isFile boolean member variable since is not needed for current use cases, ie Renesas Graphics library (RGL), and filePattern can be used instead. Also, improve version detector creation logic. If no filePattern is present in the Json kit file, the regex match is based on packagePath only, which is the correct way to detect the version for RGL. Task-number: UL-6642 Change-Id: I3ee2fdb623bdd77aea60f9eae3672b9b5aa40433 Reviewed-by: Rainer Keller Reviewed-by: Christian Stenger Reviewed-by: --- src/plugins/mcusupport/mcusupportsdk.cpp | 3 +-- src/plugins/mcusupport/mcusupportversiondetection.cpp | 11 ++++------- src/plugins/mcusupport/mcusupportversiondetection.h | 8 +++----- src/plugins/mcusupport/mcutargetdescription.h | 1 - src/plugins/mcusupport/mcutargetfactory.cpp | 7 ++++--- .../mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h | 4 +--- src/plugins/mcusupport/test/unittest.cpp | 4 +--- 7 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index 83655ab34fb..a85ac4c8894 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -82,7 +82,7 @@ static McuPackageVersionDetector *generatePackageVersionDetector(const QString & R"(\b(\d+\.\d+\.\d+)\b)"); if (envVar.startsWith("RGL")) - return new McuPackageDirectoryVersionDetector("rgl_*_obj_*", R"(\d+\.\d+\.\w+)", false); + return new McuPackagePathVersionDetector(R"(\d+\.\d+\.\w+)"); return nullptr; } @@ -613,7 +613,6 @@ VersionDetection parseVersionDetection(const QJsonObject &packageEntry) versioning["executableArgs"].toString(), versioning["xmlElement"].toString(), versioning["xmlAttribute"].toString(), - versioning["isFile"].toBool(true), }; } diff --git a/src/plugins/mcusupport/mcusupportversiondetection.cpp b/src/plugins/mcusupport/mcusupportversiondetection.cpp index f99ca115361..4b084d927ab 100644 --- a/src/plugins/mcusupport/mcusupportversiondetection.cpp +++ b/src/plugins/mcusupport/mcusupportversiondetection.cpp @@ -80,18 +80,15 @@ QString McuPackageXmlVersionDetector::parseVersion(const FilePath &packagePath) return QString(); } -McuPackageDirectoryVersionDetector::McuPackageDirectoryVersionDetector(const QString &filePattern, - const QString &versionRegExp, - const bool isFile) +McuPackageDirectoryEntriesVersionDetector::McuPackageDirectoryEntriesVersionDetector( + const QString &filePattern, const QString &versionRegExp) : m_filePattern(filePattern) , m_versionRegExp(versionRegExp) - , m_isFile(isFile) {} -QString McuPackageDirectoryVersionDetector::parseVersion(const FilePath &packagePath) const +QString McuPackageDirectoryEntriesVersionDetector::parseVersion(const FilePath &packagePath) const { - const auto files = QDir(packagePath.toString(), m_filePattern) - .entryInfoList(m_isFile ? QDir::Filter::Files : QDir::Filter::Dirs); + const auto files = QDir(packagePath.toString(), m_filePattern).entryInfoList(); for (const auto &entry : files) { const QString matched = matchRegExp(entry.fileName(), m_versionRegExp); if (!matched.isEmpty()) diff --git a/src/plugins/mcusupport/mcusupportversiondetection.h b/src/plugins/mcusupport/mcusupportversiondetection.h index 68480263d83..cfd878b25b6 100644 --- a/src/plugins/mcusupport/mcusupportversiondetection.h +++ b/src/plugins/mcusupport/mcusupportversiondetection.h @@ -49,18 +49,16 @@ private: }; // Get version from the filename of a given file/dir in the package directory -class McuPackageDirectoryVersionDetector : public McuPackageVersionDetector +class McuPackageDirectoryEntriesVersionDetector : public McuPackageVersionDetector { public: - McuPackageDirectoryVersionDetector(const QString &filePattern, - const QString &versionRegExp, - const bool isFile); + McuPackageDirectoryEntriesVersionDetector(const QString &filePattern, + const QString &versionRegExp); QString parseVersion(const Utils::FilePath &packagePath) const final; private: const QString m_filePattern; const QString m_versionRegExp; - const bool m_isFile; }; // Get version from the path of the package itself diff --git a/src/plugins/mcusupport/mcutargetdescription.h b/src/plugins/mcusupport/mcutargetdescription.h index 3b811e5a034..3c8600b6604 100644 --- a/src/plugins/mcusupport/mcutargetdescription.h +++ b/src/plugins/mcusupport/mcutargetdescription.h @@ -18,7 +18,6 @@ struct VersionDetection QString executableArgs; QString xmlElement; QString xmlAttribute; - bool isFile; }; // struct VersionDetection struct PackageDescription diff --git a/src/plugins/mcusupport/mcutargetfactory.cpp b/src/plugins/mcusupport/mcutargetfactory.cpp index d17263ca351..ae79aeee359 100644 --- a/src/plugins/mcusupport/mcutargetfactory.cpp +++ b/src/plugins/mcusupport/mcutargetfactory.cpp @@ -37,9 +37,10 @@ McuPackageVersionDetector *createVersionDetection(const VersionDetection &versio QStringList{versionDetection.executableArgs}, versionDetection.regex}; else if (!versionDetection.filePattern.isEmpty() && !versionDetection.regex.isEmpty()) - return new McuPackageDirectoryVersionDetector(versionDetection.filePattern, - versionDetection.regex, - versionDetection.isFile); + return new McuPackageDirectoryEntriesVersionDetector(versionDetection.filePattern, + versionDetection.regex); + else if (!versionDetection.regex.isEmpty()) + return new McuPackagePathVersionDetector(versionDetection.regex); else { // In this case the JSON entry is either invalid or missing. // After refactoring, this should raise a JSON error to the user. diff --git a/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h b/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h index e6203cbf1c2..2b10ac19b1d 100644 --- a/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h +++ b/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h @@ -66,9 +66,7 @@ constexpr auto ghs_rh850_d1m1a_baremetal_json = R"( "type": "path", "defaultValue": "/Renesas_Electronics/D1x_RGL/rgl_ghs_D1Mx_obj_V.2.0.0a", "versionDetection": { - "filePattern": "rgl_*_obj_*", - "regex": "\\d+\\.\\d+\\.\\w+", - "isFile": false + "regex": "\\d+\\.\\d+\\.\\w+" }, "optional": false } diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index 8f97f1c17ae..30c0808e077 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -1357,15 +1357,13 @@ void McuSupportTest::test_passDirectoryVersionDetectorToRenesasBoardSdkPackage() { const McuTargetDescription description = parseDescriptionJson(ghs_rh850_d1m1a_baremetal_json); - QCOMPARE(description.boardSdk.versionDetection.filePattern, "rgl_*_obj_*"); QCOMPARE(description.boardSdk.versionDetection.regex, R"(\d+\.\d+\.\w+)"); - QCOMPARE(description.boardSdk.versionDetection.isFile, false); McuPackagePtr boardSdk{targetFactory.createPackage(description.boardSdk)}; const auto *versionDetector{boardSdk->getVersionDetector()}; QVERIFY(versionDetector != nullptr); - QCOMPARE(typeid(*versionDetector).name(), typeid(McuPackageDirectoryVersionDetector).name()); + QCOMPARE(typeid(*versionDetector).name(), typeid(McuPackagePathVersionDetector).name()); } void McuSupportTest::test_resolveEnvironmentVariablesInDefaultPath()