From 486fd8f7d6ec4a116c3a92ee3a7490d64ef6250b Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 15 Jul 2021 16:59:34 +0200 Subject: [PATCH] Docker: Implement fallback for DockerDevice::directoryEntries() Change-Id: I57430bc4cf79abfc07ccbe06746a0857e10053da Reviewed-by: Christian Stenger --- src/libs/utils/fileutils.cpp | 41 ++++++++++++++++++++++++++--- src/libs/utils/fileutils.h | 5 ++++ src/plugins/docker/dockerdevice.cpp | 9 +++++-- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index bdb649c4107..fceca709372 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -969,9 +969,9 @@ bool FilePath::createDir() const return dir.mkpath(dir.absolutePath()); } -QList FilePath::dirEntries(const QStringList &nameFilters, - QDir::Filters filters, - QDir::SortFlags sort) const +FilePaths FilePath::dirEntries(const QStringList &nameFilters, + QDir::Filters filters, + QDir::SortFlags sort) const { if (needsDevice()) { QTC_ASSERT(s_deviceHooks.dirEntries, return {}); @@ -982,6 +982,41 @@ QList FilePath::dirEntries(const QStringList &nameFilters, return Utils::transform(entryInfoList, &FilePath::fromFileInfo); } +FilePaths FilePath::filterEntriesHelper(const FilePath &base, + const QStringList &entries, + const QStringList &nameFilters, + QDir::Filters filters, + QDir::SortFlags sort) +{ + const QList nameRegexps = transform(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 false; + }; + + // FIXME: Handle sort and filters. For now bark on unsupported options. + QTC_CHECK(filters == QDir::NoFilter); + QTC_CHECK(sort == QDir::NoSort); + + FilePaths result; + for (const QString &entry : entries) { + if (!nameMatches(entry)) + continue; + result.append(base.pathAppended(entry)); + } + return result; +} + QList FilePath::dirEntries(QDir::Filters filters) const { return dirEntries({}, filters); diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 7e83ce2ecae..772c246ed71 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -227,6 +227,11 @@ public: static void removeDuplicates(QList &files); static void sort(QList &files); + static QList filterEntriesHelper(const FilePath &base, + const QStringList &entries, + const QStringList &nameFilters, + QDir::Filters filters, + QDir::SortFlags sort); private: friend class ::tst_fileutils; static QString calcRelativePath(const QString &absolutePath, const QString &absoluteAnchorPath); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 401d4e5bbf5..365c20d9fe2 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1192,8 +1192,13 @@ FilePaths DockerDevice::directoryEntries(const FilePath &filePath, }); } - QTC_CHECK(false); // FIXME: Implement - return {}; + QtcProcess proc; + proc.setCommand({"ls", {"-1", "-b", "--", filePath.path()}}); + runProcess(proc); + proc.waitForFinished(); + + QStringList entries = proc.stdOut().split('\n', Qt::SkipEmptyParts); + return FilePath::filterEntriesHelper(filePath, entries, nameFilters, filters, sort); } QByteArray DockerDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const