diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp index 7eedba4368d..a4ab89fe89c 100644 --- a/src/libs/utils/buildablehelperlibrary.cpp +++ b/src/libs/utils/buildablehelperlibrary.cpp @@ -90,6 +90,7 @@ static FilePath findQmakeInDir(const FilePath &dir) const FilePaths candidates = dir.dirEntries( BuildableHelperLibrary::possibleQMakeCommands(), QDir::Files, + QDirIterator::NoIteratorFlags, QDir::Name | QDir::Reversed); for (const FilePath &candidate : candidates) { if (candidate == qmakePath) diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 6246533abc1..2b665d0c84e 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -719,26 +720,41 @@ bool FilePath::createDir() const FilePaths FilePath::dirEntries(const QStringList &nameFilters, QDir::Filters filters, + QDirIterator::IteratorFlags flags, QDir::SortFlags sort) const { + FilePaths result; + if (needsDevice()) { QTC_ASSERT(s_deviceHooks.iterateDirectory, return {}); - FilePaths result; const auto callBack = [&result](const FilePath &path) { result.append(path); return true; }; - s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters); - return result; + s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags); + } else { + QDirIterator dit(m_data, nameFilters, filters, flags); + while (dit.hasNext()) + result.append(FilePath::fromString(dit.next())); } - const QFileInfoList entryInfoList = QDir(m_data).entryInfoList(nameFilters, filters, sort); - return Utils::transform(entryInfoList, &FilePath::fromFileInfo); + // FIXME: Not all flags supported here. + + if ((sort & QDir::SortByMask) == QDir::Name) + Utils::sort(result); + + if (sort & QDir::Reversed) + std::reverse(result.begin(), result.end()); + + return result; } - -QList FilePath::dirEntries(QDir::Filters filters) const +FilePaths FilePath::dirEntries(QDir::Filters filters) const { return dirEntries({}, filters); } +// This runs \a callBack on each directory entry matching all \a filters and +// either of the specified \a nameFilters. +// An empty \nameFilters list matches every name. + void FilePath::iterateDirectory(const std::function &callBack, const QStringList &nameFilters, QDir::Filters filters, @@ -746,14 +762,15 @@ void FilePath::iterateDirectory(const std::function { if (needsDevice()) { QTC_ASSERT(s_deviceHooks.iterateDirectory, return); - s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters); + s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags); return; } QDirIterator it(m_data, nameFilters, filters, flags); - while (it.hasNext()) + while (it.hasNext()) { if (!callBack(FilePath::fromString(it.next()))) return; + } } QByteArray FilePath::fileContents(qint64 maxSize, qint64 offset) const diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index 9fa455c45e7..2cb2ad9d92b 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -123,6 +123,7 @@ public: bool createDir() const; QList dirEntries(const QStringList &nameFilters, QDir::Filters filters = QDir::NoFilter, + QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags, QDir::SortFlags sort = QDir::NoSort) const; QList dirEntries(QDir::Filters filters) const; QByteArray fileContents(qint64 maxSize = -1, qint64 offset = 0) const; diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 61fac716bf2..af56d2fb49a 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -83,7 +83,8 @@ public: std::function &, // Abort on 'false' return. const QStringList &, - QDir::Filters)> iterateDirectory; + QDir::Filters, + QDirIterator::IteratorFlags)> iterateDirectory; std::function fileContents; std::function writeFileContents; std::function lastModified; diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp index ada6f9a6916..863aec0c14e 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp +++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp @@ -948,7 +948,10 @@ FilePath FileApiParser::scanForCMakeReplyFile(const FilePath &buildDirectory) if (!replyDir.exists()) return {}; - const FilePaths entries = replyDir.dirEntries({"index-*.json"}, QDir::Files, QDir::Name); + const FilePaths entries = replyDir.dirEntries({"index-*.json"}, + QDir::Files, + QDirIterator::NoIteratorFlags, + QDir::Name); return entries.isEmpty() ? FilePath() : entries.first(); } diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index bb157d682f1..d728018c3b5 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1547,8 +1547,11 @@ static void filterEntriesHelper(const FilePath &base, void DockerDevice::iterateDirectory(const FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const + QDir::Filters filters, + QDirIterator::IteratorFlags flags) const { + Q_UNUSED(flags) // FIXME: Use it. + QTC_ASSERT(handlesFile(filePath), return); updateContainerAccess(); if (hasLocalFileAccess()) { diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 6e05f9c09be..310dd9e0d96 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -97,7 +97,8 @@ public: void iterateDirectory(const Utils::FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const override; + QDir::Filters filters, + QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const override; QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override; diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index 4e4ea722d2b..d23147ee83a 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -304,7 +304,8 @@ static McuPackage *createCypressProgrammerPackage() const FilePath candidate = findInProgramFiles("Cypress"); if (candidate.exists()) { // "Cypress Auto Flash Utility 1.0" - const auto subDirs = candidate.dirEntries({"Cypress Auto Flash Utility*"}, QDir::Dirs, QDir::Unsorted); + const auto subDirs = candidate.dirEntries({"Cypress Auto Flash Utility*"}, + QDir::Dirs, QDirIterator::NoIteratorFlags, QDir::Unsorted); if (!subDirs.empty()) defaultPath = subDirs.first(); } @@ -330,7 +331,8 @@ static McuPackage *createRenesasProgrammerPackage() const FilePath candidate = findInProgramFiles("Renesas Electronics/Programming Tools"); if (candidate.exists()) { // "Renesas Flash Programmer V3.09" - const auto subDirs = candidate.dirEntries({"Renesas Flash Programmer*"}, QDir::Dirs, QDir::Unsorted); + const auto subDirs = candidate.dirEntries({"Renesas Flash Programmer*"}, + QDir::Dirs, QDirIterator::NoIteratorFlags, QDir::Unsorted); if (!subDirs.empty()) defaultPath = subDirs.first(); } diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index c97e00f6e0e..3a5c209dda7 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -179,10 +179,11 @@ bool DesktopDevice::handlesFile(const FilePath &filePath) const void DesktopDevice::iterateDirectory(const FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const + QDir::Filters filters, + QDirIterator::IteratorFlags flags) const { QTC_CHECK(!filePath.needsDevice()); - filePath.iterateDirectory(callBack, nameFilters, filters); + filePath.iterateDirectory(callBack, nameFilters, filters, flags); } qint64 DesktopDevice::fileSize(const FilePath &filePath) const diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.h b/src/plugins/projectexplorer/devicesupport/desktopdevice.h index 9e5fed0211f..4523be31bda 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.h +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.h @@ -76,7 +76,8 @@ public: void iterateDirectory(const Utils::FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const override; + QDir::Filters filters, + QDirIterator::IteratorFlags flags) const override; QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; qint64 fileSize(const Utils::FilePath &filePath) const override; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 1bc615202f8..8eb992a88bd 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -525,10 +525,11 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique &callBack, const QStringList &nameFilters, - QDir::Filters filters) { + QDir::Filters filters, + QDirIterator::IteratorFlags flags) { auto device = DeviceManager::deviceForPath(filePath); QTC_ASSERT(device, return); - device->iterateDirectory(filePath, callBack, nameFilters, filters); + device->iterateDirectory(filePath, callBack, nameFilters, filters, flags); }; deviceHooks.fileContents = [](const FilePath &filePath, qint64 maxSize, qint64 offset) { diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 9ed6f24529d..b183e38edfc 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -364,12 +364,14 @@ FilePath IDevice::symLinkTarget(const FilePath &filePath) const void IDevice::iterateDirectory(const FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const + QDir::Filters filters, + QDirIterator::IteratorFlags flags) const { Q_UNUSED(filePath); Q_UNUSED(callBack); Q_UNUSED(nameFilters); Q_UNUSED(filters); + Q_UNUSED(flags); QTC_CHECK(false); } diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 189c3a23036..75491f94fcc 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -262,7 +262,8 @@ public: virtual void iterateDirectory(const Utils::FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const; + QDir::Filters filters, + QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const; virtual QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const; diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index 844321f354d..6f182cc1e4b 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -425,7 +425,8 @@ QList JsonWizardFactory::createWizardFactories() const QDir::Filters filters = QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot; const QDir::SortFlags sortflags = QDir::Name|QDir::IgnoreCase; - FilePaths dirs = path.dirEntries({}, filters, sortflags); + const QDirIterator::IteratorFlag iteratorFlags = QDirIterator::NoIteratorFlags; + FilePaths dirs = path.dirEntries({}, filters, iteratorFlags, sortflags); while (!dirs.isEmpty()) { const FilePath currentDir = dirs.takeFirst(); @@ -482,7 +483,7 @@ QList JsonWizardFactory::createWizardFactories() result << factory; } else { - FilePaths subDirs = currentDir.dirEntries({}, filters, sortflags); + FilePaths subDirs = currentDir.dirEntries({}, filters, iteratorFlags, sortflags); if (!subDirs.isEmpty()) { // There is no QList::prepend(QList)... dirs.swap(subDirs); diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 83dce1fde4e..c62d8796754 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -791,8 +791,8 @@ QStringList SessionManager::sessions() { if (d->m_sessions.isEmpty()) { // We are not initialized yet, so do that now - const FilePaths sessionFiles = - ICore::userResourcePath().dirEntries({"*.qws"}, QDir::NoFilter, QDir::Time); + const FilePaths sessionFiles = ICore::userResourcePath().dirEntries({"*.qws"}, + QDir::NoFilter, QDirIterator::NoIteratorFlags, QDir::Time); for (const FilePath &file : sessionFiles) { const QString &name = file.completeBaseName(); d->m_sessionDateTimes.insert(name, file.lastModified()); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index aec9af303da..554ea8a13a4 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -677,7 +677,8 @@ static void filterEntriesHelper(const FilePath &base, const std::function &callBack, const QStringList &entries, const QStringList &nameFilters, - QDir::Filters filters) + QDir::Filters filters, + QDirIterator::IteratorFlags flags) { const QList nameRegexps = transform(nameFilters, [](const QString &filter) { QRegularExpression re; @@ -697,6 +698,7 @@ static void filterEntriesHelper(const FilePath &base, // FIXME: Handle filters. For now bark on unsupported options. QTC_CHECK(filters == QDir::NoFilter); + QTC_CHECK(flags == QDirIterator::NoIteratorFlags); for (const QString &entry : entries) { if (!nameMatches(entry)) @@ -709,13 +711,14 @@ static void filterEntriesHelper(const FilePath &base, void LinuxDevice::iterateDirectory(const FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const + QDir::Filters filters, + QDirIterator::IteratorFlags flags) const { QTC_ASSERT(handlesFile(filePath), return); // if we do not have find - use ls as fallback const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); const QStringList entries = output.split('\n', Qt::SkipEmptyParts); - filterEntriesHelper(filePath, callBack, entries, nameFilters, filters); + filterEntriesHelper(filePath, callBack, entries, nameFilters, filters, flags); } QByteArray LinuxDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index 4f728fdfbb9..189b0229ecc 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -79,7 +79,8 @@ public: void iterateDirectory(const Utils::FilePath &filePath, const std::function &callBack, const QStringList &nameFilters, - QDir::Filters filters) const override; + QDir::Filters filters, + QDirIterator::IteratorFlags flags) const override; QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override;