aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorhjk <[email protected]>2022-01-21 13:11:39 +0100
committerhjk <[email protected]>2022-02-15 08:57:19 +0000
commitf7a585fad9bcb8e1ce305c18cbbe1508b5f9f844 (patch)
treeb2e0df9c91d061351c9f78f3cd4a2e2de65734ec /src/libs
parent4fb3eb8fd516bed168eb9d2a4c19196b4bee89ce (diff)
FileUtils: Add some helper to handle ls-style output
Unix-ish device implementations would otherwise repeat that code. Change-Id: I1265fe1a69e55409ab2875d0b6f6113ec92edd79 Reviewed-by: Eike Ziller <[email protected]>
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/utils/fileutils.cpp38
-rw-r--r--src/libs/utils/fileutils.h6
2 files changed, 44 insertions, 0 deletions
diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp
index 60a2d6e62fa..e0e207a9b22 100644
--- a/src/libs/utils/fileutils.cpp
+++ b/src/libs/utils/fileutils.cpp
@@ -42,6 +42,7 @@
#ifdef QT_GUI_LIB
#include <QMessageBox>
+#include <QRegularExpression>
#endif
#ifdef Q_OS_WIN
@@ -493,6 +494,43 @@ FilePaths FileUtils::getOpenFilePaths(QWidget *parent,
options);
return transform(result, &FilePath::fromString);
}
+
+// Used on 'ls' output on unix-like systems.
+void FileUtils::iterateLsOutput(const FilePath &base,
+ const QStringList &entries,
+ const FileFilter &filter,
+ const std::function<bool (const FilePath &)> &callBack)
+{
+ QTC_CHECK(filter.iteratorFlags != QDirIterator::NoIteratorFlags); // FIXME: Not supported yet below.
+
+ const QList<QRegularExpression> nameRegexps =
+ transform(filter.nameFilters, [](const QString &filter) {
+ QRegularExpression re;
+ re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
+ QTC_CHECK(re.isValid());
+ return re;
+ });
+
+ const auto nameMatches = [&nameRegexps](const QString &fileName) {
+ for (const QRegularExpression &re : nameRegexps) {
+ const QRegularExpressionMatch match = re.match(fileName);
+ if (match.hasMatch())
+ return true;
+ }
+ return nameRegexps.isEmpty();
+ };
+
+ // FIXME: Handle filters. For now bark on unsupported options.
+ QTC_CHECK(filter.fileFilters == QDir::NoFilter);
+
+ for (const QString &entry : entries) {
+ if (!nameMatches(entry))
+ continue;
+ if (!callBack(base.pathAppended(entry)))
+ break;
+ }
+}
+
#endif // QT_WIDGETS_LIB
} // namespace Utils
diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h
index 163e762e511..f76b621c484 100644
--- a/src/libs/utils/fileutils.h
+++ b/src/libs/utils/fileutils.h
@@ -144,6 +144,11 @@ public:
static void setDeviceFileHooks(const DeviceFileHooks &hooks);
+ static void iterateLsOutput(const FilePath &base,
+ const QStringList &entries,
+ const FileFilter &filter,
+ const std::function<bool(const FilePath &)> &callBack);
+
#ifdef QT_WIDGETS_LIB
static void setDialogParentGetter(const std::function<QWidget *()> &getter);
@@ -173,6 +178,7 @@ public:
QString *selectedFilter = nullptr,
QFileDialog::Options options = {});
#endif
+
};
template<typename T>