Utils: Wrap various file system iteration flags and filters

... into a single class.

This makes passing them around as a whole easier, and opens a path
to have "generic" filters in form of a lambda or such.

Change-Id: Ibf644b2fedcf0f1a35258030710afff8f5873f88
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2022-01-21 12:22:54 +01:00
parent c6fdb66b2b
commit 1fc83d2a56
35 changed files with 121 additions and 143 deletions

View File

@@ -88,9 +88,7 @@ static FilePath findQmakeInDir(const FilePath &dir)
// Prefer qmake-qt5 to qmake-qt4 by sorting the filenames in reverse order. // Prefer qmake-qt5 to qmake-qt4 by sorting the filenames in reverse order.
const FilePaths candidates = dir.dirEntries( const FilePaths candidates = dir.dirEntries(
BuildableHelperLibrary::possibleQMakeCommands(), {BuildableHelperLibrary::possibleQMakeCommands(), QDir::Files},
QDir::Files,
QDirIterator::NoIteratorFlags,
QDir::Name | QDir::Reversed); QDir::Name | QDir::Reversed);
for (const FilePath &candidate : candidates) { for (const FilePath &candidate : candidates) {
if (candidate == qmakePath) if (candidate == qmakePath)

View File

@@ -718,19 +718,16 @@ bool FilePath::createDir() const
return dir.mkpath(dir.absolutePath()); return dir.mkpath(dir.absolutePath());
} }
FilePaths FilePath::dirEntries(const QStringList &nameFilters, FilePaths FilePath::dirEntries(const FileFilter &filter, QDir::SortFlags sort) const
QDir::Filters filters,
QDirIterator::IteratorFlags flags,
QDir::SortFlags sort) const
{ {
FilePaths result; FilePaths result;
if (needsDevice()) { if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.iterateDirectory, return {}); QTC_ASSERT(s_deviceHooks.iterateDirectory, return {});
const auto callBack = [&result](const FilePath &path) { result.append(path); return true; }; const auto callBack = [&result](const FilePath &path) { result.append(path); return true; };
s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags); s_deviceHooks.iterateDirectory(*this, callBack, filter);
} else { } else {
QDirIterator dit(m_data, nameFilters, filters, flags); QDirIterator dit(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
while (dit.hasNext()) while (dit.hasNext())
result.append(FilePath::fromString(dit.next())); result.append(FilePath::fromString(dit.next()));
} }
@@ -748,7 +745,7 @@ FilePaths FilePath::dirEntries(const QStringList &nameFilters,
FilePaths FilePath::dirEntries(QDir::Filters filters) const FilePaths FilePath::dirEntries(QDir::Filters filters) const
{ {
return dirEntries({}, filters); return dirEntries(FileFilter({}, filters));
} }
// This runs \a callBack on each directory entry matching all \a filters and // This runs \a callBack on each directory entry matching all \a filters and
@@ -756,17 +753,15 @@ FilePaths FilePath::dirEntries(QDir::Filters filters) const
// An empty \nameFilters list matches every name. // An empty \nameFilters list matches every name.
void FilePath::iterateDirectory(const std::function<bool(const FilePath &item)> &callBack, void FilePath::iterateDirectory(const std::function<bool(const FilePath &item)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) const
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
{ {
if (needsDevice()) { if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.iterateDirectory, return); QTC_ASSERT(s_deviceHooks.iterateDirectory, return);
s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags); s_deviceHooks.iterateDirectory(*this, callBack, filter);
return; return;
} }
QDirIterator it(m_data, nameFilters, filters, flags); QDirIterator it(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
while (it.hasNext()) { while (it.hasNext()) {
if (!callBack(FilePath::fromString(it.next()))) if (!callBack(FilePath::fromString(it.next())))
return; return;
@@ -1454,6 +1449,15 @@ QTextStream &operator<<(QTextStream &s, const FilePath &fn)
return s << fn.toString(); return s << fn.toString();
} }
FileFilter::FileFilter(const QStringList &nameFilters,
const QDir::Filters fileFilters,
const QDirIterator::IteratorFlags flags)
: nameFilters(nameFilters),
fileFilters(fileFilters),
iteratorFlags(flags)
{
}
} // namespace Utils } // namespace Utils
std::hash<Utils::FilePath>::result_type std::hash<Utils::FilePath>::result_type

View File

@@ -51,6 +51,18 @@ namespace Utils {
class Environment; class Environment;
class EnvironmentChange; class EnvironmentChange;
class QTCREATOR_UTILS_EXPORT FileFilter
{
public:
FileFilter(const QStringList &nameFilters,
const QDir::Filters fileFilters = QDir::NoFilter,
const QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags);
const QStringList nameFilters;
const QDir::Filters fileFilters = QDir::NoFilter;
const QDirIterator::IteratorFlags iteratorFlags = QDirIterator::NoIteratorFlags;
};
class QTCREATOR_UTILS_EXPORT FilePath class QTCREATOR_UTILS_EXPORT FilePath
{ {
public: public:
@@ -121,9 +133,7 @@ public:
qint64 fileSize() const; qint64 fileSize() const;
qint64 bytesAvailable() const; qint64 bytesAvailable() const;
bool createDir() const; bool createDir() const;
QList<FilePath> dirEntries(const QStringList &nameFilters, QList<FilePath> dirEntries(const FileFilter &filter,
QDir::Filters filters = QDir::NoFilter,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags,
QDir::SortFlags sort = QDir::NoSort) const; QDir::SortFlags sort = QDir::NoSort) const;
QList<FilePath> dirEntries(QDir::Filters filters) const; QList<FilePath> dirEntries(QDir::Filters filters) const;
QByteArray fileContents(qint64 maxSize = -1, qint64 offset = 0) const; QByteArray fileContents(qint64 maxSize = -1, qint64 offset = 0) const;
@@ -160,9 +170,7 @@ public:
[[nodiscard]] FilePath onDevice(const FilePath &deviceTemplate) const; [[nodiscard]] FilePath onDevice(const FilePath &deviceTemplate) const;
[[nodiscard]] FilePath withNewPath(const QString &newPath) const; [[nodiscard]] FilePath withNewPath(const QString &newPath) const;
void iterateDirectory(const std::function<bool(const FilePath &item)> &callBack, void iterateDirectory(const std::function<bool(const FilePath &item)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) const;
QDir::Filters filters = QDir::NoFilter,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const;
// makes sure that capitalization of directories is canonical // makes sure that capitalization of directories is canonical
// on Windows and macOS. This is rarely needed. // on Windows and macOS. This is rarely needed.

View File

@@ -82,9 +82,7 @@ public:
std::function<QString(const FilePath &)> mapToDevicePath; std::function<QString(const FilePath &)> mapToDevicePath;
std::function<void(const FilePath &, std::function<void(const FilePath &,
const std::function<bool(const FilePath &)> &, // Abort on 'false' return. const std::function<bool(const FilePath &)> &, // Abort on 'false' return.
const QStringList &, const FileFilter &)> iterateDirectory;
QDir::Filters,
QDirIterator::IteratorFlags)> iterateDirectory;
std::function<QByteArray(const FilePath &, qint64, qint64)> fileContents; std::function<QByteArray(const FilePath &, qint64, qint64)> fileContents;
std::function<bool(const FilePath &, const QByteArray &)> writeFileContents; std::function<bool(const FilePath &, const QByteArray &)> writeFileContents;
std::function<QDateTime(const FilePath &)> lastModified; std::function<QDateTime(const FilePath &)> lastModified;

View File

@@ -221,7 +221,7 @@ FilePaths BackUpStrategy::readFileCandidates(const FilePath &baseFileName) const
const QStringList filter(baseFileName.fileName() + '*'); const QStringList filter(baseFileName.fileName() + '*');
const FilePath baseFileDir = baseFileName.parentDir(); const FilePath baseFileDir = baseFileName.parentDir();
return baseFileDir.dirEntries(filter, QDir::Files | QDir::Hidden | QDir::System); return baseFileDir.dirEntries({filter, QDir::Files | QDir::Hidden | QDir::System});
} }
int BackUpStrategy::compare(const SettingsAccessor::RestoreData &data1, int BackUpStrategy::compare(const SettingsAccessor::RestoreData &data1,

View File

@@ -382,8 +382,7 @@ QVector<int> AndroidConfig::availableNdkPlatforms(const QtVersion *qtVersion) co
.toInt()); .toInt());
return true; return true;
}, },
{"android-*"}, {{"android-*"}, QDir::Dirs});
QDir::Dirs);
Utils::sort(availableNdkPlatforms, std::greater<>()); Utils::sort(availableNdkPlatforms, std::greater<>());
return availableNdkPlatforms; return availableNdkPlatforms;

View File

@@ -423,7 +423,7 @@ QString AndroidManager::apkDevicePreferredAbi(const Target *target)
QStringList apkAbis; QStringList apkAbis;
const FilePaths libsPaths = libsPath.dirEntries(QDir::Dirs | QDir::NoDotAndDotDot); const FilePaths libsPaths = libsPath.dirEntries(QDir::Dirs | QDir::NoDotAndDotDot);
for (const FilePath &abiDir : libsPaths) { for (const FilePath &abiDir : libsPaths) {
if (!abiDir.dirEntries(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty()) if (!abiDir.dirEntries({{"*.so"}, QDir::Files | QDir::NoDotAndDotDot}).isEmpty())
apkAbis << abiDir.fileName(); apkAbis << abiDir.fileName();
} }
return preferredAbi(apkAbis, target); return preferredAbi(apkAbis, target);

View File

@@ -256,7 +256,7 @@ static QImage scaleWithoutStretching(const QImage& original, const QSize& target
static bool similarFilesExist(const FilePath &path) static bool similarFilesExist(const FilePath &path)
{ {
const FilePaths entries = path.parentDir().dirEntries({path.completeBaseName() + ".*"}, {}); const FilePaths entries = path.parentDir().dirEntries({{path.completeBaseName() + ".*"}});
return !entries.empty(); return !entries.empty();
} }

View File

@@ -73,9 +73,7 @@ static void setSdkFilesExecPermission( const FilePath &sdkExtractPath)
} }
return true; return true;
}, },
{"*"}, {{"*"}, QDir::Files, QDirIterator::Subdirectories});
QDir::Files,
QDirIterator::Subdirectories);
} }
void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath) void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath)

View File

@@ -322,7 +322,7 @@ void JLSClient::updateProjectFiles()
const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar") const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar")
.arg(targetSDK); .arg(targetSDK);
FilePaths libs = {androidJar}; FilePaths libs = {androidJar};
libs << packageSourceDir.pathAppended("libs").dirEntries({"*.jar"}, QDir::Files); libs << packageSourceDir.pathAppended("libs").dirEntries({{"*.jar"}, QDir::Files});
generateProjectFile(projectDir, qtSrc, project()->displayName()); generateProjectFile(projectDir, qtSrc, project()->displayName());
generateClassPathFile(projectDir, sourceDir, libs); generateClassPathFile(projectDir, sourceDir, libs);
} }

View File

@@ -79,7 +79,7 @@ static QStringList scanDirectory(const FilePath &path, const QString &prefix)
QStringList result; QStringList result;
qCDebug(cmInputLog) << "Scanning for directories matching" << prefix << "in" << path; qCDebug(cmInputLog) << "Scanning for directories matching" << prefix << "in" << path;
foreach (const FilePath &entry, path.dirEntries({prefix + "*"}, QDir::Dirs | QDir::NoDotAndDotDot)) { foreach (const FilePath &entry, path.dirEntries({{prefix + "*"}, QDir::Dirs | QDir::NoDotAndDotDot})) {
QTC_ASSERT(entry.isDir(), continue); QTC_ASSERT(entry.isDir(), continue);
result.append(entry.toString()); result.append(entry.toString());
} }

View File

@@ -948,10 +948,7 @@ FilePath FileApiParser::scanForCMakeReplyFile(const FilePath &buildDirectory)
if (!replyDir.exists()) if (!replyDir.exists())
return {}; return {};
const FilePaths entries = replyDir.dirEntries({"index-*.json"}, const FilePaths entries = replyDir.dirEntries({{"index-*.json"}, QDir::Files}, QDir::Name);
QDir::Files,
QDirIterator::NoIteratorFlags,
QDir::Name);
return entries.isEmpty() ? FilePath() : entries.first(); return entries.isEmpty() ? FilePath() : entries.first();
} }

View File

@@ -780,7 +780,7 @@ void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers(const FilePaths &s
const auto addSuspect = [&suspects](const FilePath &entry) { suspects.append(entry); return true; }; const auto addSuspect = [&suspects](const FilePath &entry) { suspects.append(entry); return true; };
for (const FilePath &path : paths) for (const FilePath &path : paths)
path.iterateDirectory(addSuspect, filters, QDir::Files | QDir::Executable); path.iterateDirectory(addSuspect, {filters, QDir::Files | QDir::Executable});
QStringList logMessages{tr("Searching debuggers...")}; QStringList logMessages{tr("Searching debuggers...")};
for (const FilePath &command : qAsConst(suspects)) { for (const FilePath &command : qAsConst(suspects)) {

View File

@@ -1615,9 +1615,7 @@ QString GdbEngine::cleanupFullName(const QString &fileName)
} }
return true; return true;
}, },
{"*"}, {{"*"}, QDir::NoFilter, QDirIterator::Subdirectories});
QDir::NoFilter,
QDirIterator::Subdirectories);
} }
} }

View File

@@ -1455,17 +1455,20 @@ bool DockerDevice::setPermissions(const FilePath &filePath, QFileDevice::Permiss
void DockerDevice::iterateWithFind(const FilePath &filePath, void DockerDevice::iterateWithFind(const FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack, const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) const
QDir::Filters filters) const
{ {
QTC_ASSERT(callBack, return); QTC_ASSERT(callBack, return);
QTC_CHECK(filePath.isAbsolutePath()); QTC_CHECK(filePath.isAbsolutePath());
QStringList arguments{filePath.path(), "-maxdepth", "1"}; QStringList arguments{filePath.path()};
const QDir::Filters filters = filter.fileFilters;
if (filters & QDir::NoSymLinks) if (filters & QDir::NoSymLinks)
arguments.prepend("-H"); arguments.prepend("-H");
else else
arguments.prepend("-L"); arguments.prepend("-L");
if (!filter.iteratorFlags.testFlag(QDirIterator::Subdirectories))
arguments.append({"-maxdepth", "1"});
QStringList filterOptions; QStringList filterOptions;
if (filters & QDir::Dirs) if (filters & QDir::Dirs)
@@ -1493,12 +1496,12 @@ void DockerDevice::iterateWithFind(const FilePath &filePath,
const QString nameOption = (filters & QDir::CaseSensitive) ? QString{"-name"} const QString nameOption = (filters & QDir::CaseSensitive) ? QString{"-name"}
: QString{"-iname"}; : QString{"-iname"};
QStringList criticalWildcards; QStringList criticalWildcards;
if (!nameFilters.isEmpty()) { if (!filter.nameFilters.isEmpty()) {
const QRegularExpression oneChar("\\[.*?\\]"); const QRegularExpression oneChar("\\[.*?\\]");
for (int i = 0, len = nameFilters.size(); i < len; ++i) { for (int i = 0, len = filter.nameFilters.size(); i < len; ++i) {
if (i > 0) if (i > 0)
filterOptions << "-o"; filterOptions << "-o";
QString current = nameFilters.at(i); QString current = filter.nameFilters.at(i);
if (current.indexOf(oneChar) != -1) if (current.indexOf(oneChar) != -1)
criticalWildcards.append(current); criticalWildcards.append(current);
current.replace(oneChar, "?"); // BAD! but still better than nothing current.replace(oneChar, "?"); // BAD! but still better than nothing
@@ -1537,15 +1540,17 @@ void DockerDevice::iterateWithFind(const FilePath &filePath,
static void filterEntriesHelper(const FilePath &base, static void filterEntriesHelper(const FilePath &base,
const std::function<bool(const FilePath &)> &callBack, const std::function<bool(const FilePath &)> &callBack,
const QStringList &entries, const QStringList &entries,
const QStringList &nameFilters, const FileFilter &filter)
QDir::Filters filters)
{ {
const QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) { QTC_CHECK(filter.iteratorFlags != QDirIterator::NoIteratorFlags); // FIXME: Not supported yet below.
QRegularExpression re;
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter)); const QList<QRegularExpression> nameRegexps =
QTC_CHECK(re.isValid()); transform(filter.nameFilters, [](const QString &filter) {
return re; QRegularExpression re;
}); re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
QTC_CHECK(re.isValid());
return re;
});
const auto nameMatches = [&nameRegexps](const QString &fileName) { const auto nameMatches = [&nameRegexps](const QString &fileName) {
for (const QRegularExpression &re : nameRegexps) { for (const QRegularExpression &re : nameRegexps) {
@@ -1557,7 +1562,7 @@ static void filterEntriesHelper(const FilePath &base,
}; };
// FIXME: Handle filters. For now bark on unsupported options. // FIXME: Handle filters. For now bark on unsupported options.
QTC_CHECK(filters == QDir::NoFilter); QTC_CHECK(filter.fileFilters == QDir::NoFilter);
for (const QString &entry : entries) { for (const QString &entry : entries) {
if (!nameMatches(entry)) if (!nameMatches(entry))
@@ -1569,12 +1574,8 @@ static void filterEntriesHelper(const FilePath &base,
void DockerDevice::iterateDirectory(const FilePath &filePath, void DockerDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack, const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) const
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
{ {
Q_UNUSED(flags) // FIXME: Use it.
QTC_ASSERT(handlesFile(filePath), return); QTC_ASSERT(handlesFile(filePath), return);
updateContainerAccess(); updateContainerAccess();
if (hasLocalFileAccess()) { if (hasLocalFileAccess()) {
@@ -1582,12 +1583,12 @@ void DockerDevice::iterateDirectory(const FilePath &filePath,
local.iterateDirectory([&callBack, this](const FilePath &entry) { local.iterateDirectory([&callBack, this](const FilePath &entry) {
return callBack(mapFromLocalAccess(entry)); return callBack(mapFromLocalAccess(entry));
}, },
nameFilters, filters); filter);
return; return;
} }
if (d->m_useFind) { if (d->m_useFind) {
iterateWithFind(filePath, callBack, nameFilters, filters); iterateWithFind(filePath, callBack, filter);
// d->m_useFind will be set to false if 'find' is not found. In this // d->m_useFind will be set to false if 'find' is not found. In this
// case fall back to 'ls' below. // case fall back to 'ls' below.
if (d->m_useFind) if (d->m_useFind)
@@ -1597,7 +1598,7 @@ void DockerDevice::iterateDirectory(const FilePath &filePath,
// if we do not have find - use ls as fallback // if we do not have find - use ls as fallback
const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}});
const QStringList entries = output.split('\n', Qt::SkipEmptyParts); const QStringList entries = output.split('\n', Qt::SkipEmptyParts);
filterEntriesHelper(filePath, callBack, entries, nameFilters, filters); filterEntriesHelper(filePath, callBack, entries, filter);
} }
QByteArray DockerDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const QByteArray DockerDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const

View File

@@ -96,9 +96,7 @@ public:
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
void iterateDirectory(const Utils::FilePath &filePath, void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack, const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters, const Utils::FileFilter &filter) const override;
QDir::Filters filters,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const override;
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) 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; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
QDateTime lastModified(const Utils::FilePath &filePath) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override;
@@ -127,8 +125,7 @@ protected:
private: private:
void iterateWithFind(const Utils::FilePath &filePath, void iterateWithFind(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack, const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters, const Utils::FileFilter &filter) const;
QDir::Filters filters) const;
void aboutToBeRemoved() const final; void aboutToBeRemoved() const final;

View File

@@ -70,7 +70,7 @@ static FilePath detectApp(const QString &defaultExe)
if (!gitBinDir.endsWith("/usr/bin")) if (!gitBinDir.endsWith("/usr/bin"))
return {}; return {};
path = gitBinDir.parentDir().parentDir(); path = gitBinDir.parentDir().parentDir();
const FilePaths entries = path.dirEntries({"mingw*"}, {}); const FilePaths entries = path.dirEntries({{"mingw*"}});
if (entries.isEmpty()) if (entries.isEmpty())
return {}; return {};
path = entries.first() / "bin" / defaultApp; path = entries.first() / "bin" / defaultApp;

View File

@@ -217,8 +217,7 @@ static McuPackage *createRGLPackage()
if (rglPath.exists()) { if (rglPath.exists()) {
defaultPath = rglPath; defaultPath = rglPath;
const FilePaths subDirs = const FilePaths subDirs =
defaultPath.dirEntries({QLatin1String("rgl_ghs_D1Mx_*")}, defaultPath.dirEntries({{"rgl_ghs_D1Mx_*"}, QDir::Dirs | QDir::NoDotAndDotDot});
QDir::Dirs | QDir::NoDotAndDotDot);
if (subDirs.count() == 1) if (subDirs.count() == 1)
defaultPath = subDirs.first(); defaultPath = subDirs.first();
} }
@@ -272,8 +271,7 @@ static McuPackage *createMcuXpressoIdePackage()
defaultPath = programPath; defaultPath = programPath;
// If default dir has exactly one sub dir that could be the IDE path, pre-select that. // If default dir has exactly one sub dir that could be the IDE path, pre-select that.
const FilePaths subDirs = const FilePaths subDirs =
defaultPath.dirEntries({QLatin1String("MCUXpressoIDE*")}, defaultPath.dirEntries({{"MCUXpressoIDE*"}, QDir::Dirs | QDir::NoDotAndDotDot});
QDir::Dirs | QDir::NoDotAndDotDot);
if (subDirs.count() == 1) if (subDirs.count() == 1)
defaultPath = subDirs.first(); defaultPath = subDirs.first();
} }
@@ -304,8 +302,8 @@ static McuPackage *createCypressProgrammerPackage()
const FilePath candidate = findInProgramFiles("Cypress"); const FilePath candidate = findInProgramFiles("Cypress");
if (candidate.exists()) { if (candidate.exists()) {
// "Cypress Auto Flash Utility 1.0" // "Cypress Auto Flash Utility 1.0"
const auto subDirs = candidate.dirEntries({"Cypress Auto Flash Utility*"}, const auto subDirs = candidate.dirEntries({{"Cypress Auto Flash Utility*"}, QDir::Dirs},
QDir::Dirs, QDirIterator::NoIteratorFlags, QDir::Unsorted); QDir::Unsorted);
if (!subDirs.empty()) if (!subDirs.empty())
defaultPath = subDirs.first(); defaultPath = subDirs.first();
} }
@@ -331,8 +329,8 @@ static McuPackage *createRenesasProgrammerPackage()
const FilePath candidate = findInProgramFiles("Renesas Electronics/Programming Tools"); const FilePath candidate = findInProgramFiles("Renesas Electronics/Programming Tools");
if (candidate.exists()) { if (candidate.exists()) {
// "Renesas Flash Programmer V3.09" // "Renesas Flash Programmer V3.09"
const auto subDirs = candidate.dirEntries({"Renesas Flash Programmer*"}, const auto subDirs = candidate.dirEntries({{"Renesas Flash Programmer*"}, QDir::Dirs},
QDir::Dirs, QDirIterator::NoIteratorFlags, QDir::Unsorted); QDir::Unsorted);
if (!subDirs.empty()) if (!subDirs.empty())
defaultPath = subDirs.first(); defaultPath = subDirs.first();
} }

View File

@@ -177,13 +177,11 @@ bool DesktopDevice::handlesFile(const FilePath &filePath) const
} }
void DesktopDevice::iterateDirectory(const FilePath &filePath, void DesktopDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack, const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) const
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
{ {
QTC_CHECK(!filePath.needsDevice()); QTC_CHECK(!filePath.needsDevice());
filePath.iterateDirectory(callBack, nameFilters, filters, flags); filePath.iterateDirectory(callBack, filter);
} }
qint64 DesktopDevice::fileSize(const FilePath &filePath) const qint64 DesktopDevice::fileSize(const FilePath &filePath) const

View File

@@ -75,9 +75,7 @@ public:
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
void iterateDirectory(const Utils::FilePath &filePath, void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack, const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters, const Utils::FileFilter &filter) const override;
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const override;
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) 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; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
qint64 fileSize(const Utils::FilePath &filePath) const override; qint64 fileSize(const Utils::FilePath &filePath) const override;

View File

@@ -524,12 +524,10 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
deviceHooks.iterateDirectory = [](const FilePath &filePath, deviceHooks.iterateDirectory = [](const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack, const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) {
QDir::Filters filters,
QDirIterator::IteratorFlags flags) {
auto device = DeviceManager::deviceForPath(filePath); auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return); QTC_ASSERT(device, return);
device->iterateDirectory(filePath, callBack, nameFilters, filters, flags); device->iterateDirectory(filePath, callBack, filter);
}; };
deviceHooks.fileContents = [](const FilePath &filePath, qint64 maxSize, qint64 offset) { deviceHooks.fileContents = [](const FilePath &filePath, qint64 maxSize, qint64 offset) {

View File

@@ -363,15 +363,11 @@ FilePath IDevice::symLinkTarget(const FilePath &filePath) const
void IDevice::iterateDirectory(const FilePath &filePath, void IDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack, const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) const
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
{ {
Q_UNUSED(filePath); Q_UNUSED(filePath);
Q_UNUSED(callBack); Q_UNUSED(callBack);
Q_UNUSED(nameFilters); Q_UNUSED(filter);
Q_UNUSED(filters);
Q_UNUSED(flags);
QTC_CHECK(false); QTC_CHECK(false);
} }

View File

@@ -33,7 +33,6 @@
#include <QAbstractSocket> #include <QAbstractSocket>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDir>
#include <QList> #include <QList>
#include <QObject> #include <QObject>
#include <QSharedPointer> #include <QSharedPointer>
@@ -257,13 +256,11 @@ public:
virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const; virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const;
virtual Utils::FilePath searchExecutableInPath(const QString &fileName) const; virtual Utils::FilePath searchExecutableInPath(const QString &fileName) const;
virtual Utils::FilePath searchExecutable(const QString &fileName, virtual Utils::FilePath searchExecutable(const QString &fileName,
const QList<Utils::FilePath> &dirs) const; const Utils::FilePaths &dirs) const;
virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const; virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const;
virtual void iterateDirectory(const Utils::FilePath &filePath, virtual void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack, const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters, const Utils::FileFilter &filter) const;
QDir::Filters filters,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const;
virtual QByteArray fileContents(const Utils::FilePath &filePath, virtual QByteArray fileContents(const Utils::FilePath &filePath,
qint64 limit, qint64 limit,
qint64 offset) const; qint64 offset) const;

View File

@@ -1126,7 +1126,8 @@ static FilePaths findCompilerCandidates(const IDevice::ConstPtr &device,
return true; return true;
}; };
const FilePath globalDir = device->mapToGlobalPath(deviceDir); const FilePath globalDir = device->mapToGlobalPath(deviceDir);
device->iterateDirectory(globalDir, callBack, nameFilters, QDir::Files | QDir::Executable); device->iterateDirectory(globalDir, callBack,
{nameFilters, QDir::Files | QDir::Executable});
} }
} else { } else {
// The normal, local host case. // The normal, local host case.

View File

@@ -423,10 +423,11 @@ QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories()
continue; continue;
} }
const QDir::Filters filters = QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot; const FileFilter filter {
{}, QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags
};
const QDir::SortFlags sortflags = QDir::Name|QDir::IgnoreCase; const QDir::SortFlags sortflags = QDir::Name|QDir::IgnoreCase;
const QDirIterator::IteratorFlag iteratorFlags = QDirIterator::NoIteratorFlags; FilePaths dirs = path.dirEntries(filter, sortflags);
FilePaths dirs = path.dirEntries({}, filters, iteratorFlags, sortflags);
while (!dirs.isEmpty()) { while (!dirs.isEmpty()) {
const FilePath currentDir = dirs.takeFirst(); const FilePath currentDir = dirs.takeFirst();
@@ -483,7 +484,7 @@ QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories()
result << factory; result << factory;
} else { } else {
FilePaths subDirs = currentDir.dirEntries({}, filters, iteratorFlags, sortflags); FilePaths subDirs = currentDir.dirEntries(filter, sortflags);
if (!subDirs.isEmpty()) { if (!subDirs.isEmpty()) {
// There is no QList::prepend(QList)... // There is no QList::prepend(QList)...
dirs.swap(subDirs); dirs.swap(subDirs);
@@ -579,7 +580,7 @@ static QString qmlProjectName(const FilePath &folder)
{ {
FilePath currentFolder = folder; FilePath currentFolder = folder;
while (!currentFolder.isEmpty()) { while (!currentFolder.isEmpty()) {
const QList<FilePath> fileList = currentFolder.dirEntries({"*.qmlproject"}); const FilePaths fileList = currentFolder.dirEntries({{"*.qmlproject"}});
if (!fileList.isEmpty()) if (!fileList.isEmpty())
return fileList.first().baseName(); return fileList.first().baseName();
currentFolder = currentFolder.parentDir(); currentFolder = currentFolder.parentDir();

View File

@@ -694,7 +694,7 @@ static ProjectExplorerPluginPrivate *dd = nullptr;
static FilePaths projectFilesInDirectory(const FilePath &path) static FilePaths projectFilesInDirectory(const FilePath &path)
{ {
return path.dirEntries(ProjectExplorerPlugin::projectFileGlobs(), QDir::Files); return path.dirEntries({ProjectExplorerPlugin::projectFileGlobs(), QDir::Files});
} }
static FilePaths projectsInDirectory(const FilePath &filePath) static FilePaths projectsInDirectory(const FilePath &filePath)

View File

@@ -791,8 +791,7 @@ QStringList SessionManager::sessions()
{ {
if (d->m_sessions.isEmpty()) { if (d->m_sessions.isEmpty()) {
// We are not initialized yet, so do that now // We are not initialized yet, so do that now
const FilePaths sessionFiles = ICore::userResourcePath().dirEntries({"*.qws"}, const FilePaths sessionFiles = ICore::userResourcePath().dirEntries({{"*qws"}}, QDir::Time);
QDir::NoFilter, QDirIterator::NoIteratorFlags, QDir::Time);
for (const FilePath &file : sessionFiles) { for (const FilePath &file : sessionFiles) {
const QString &name = file.completeBaseName(); const QString &name = file.completeBaseName();
d->m_sessionDateTimes.insert(name, file.lastModified()); d->m_sessionDateTimes.insert(name, file.lastModified());

View File

@@ -354,7 +354,7 @@ void generateModuleCmake(const FilePath &dir, const QString &uri)
QString fileTemplate = GenerateCmake::readTemplate(MODULEFILE_TEMPLATE_PATH); QString fileTemplate = GenerateCmake::readTemplate(MODULEFILE_TEMPLATE_PATH);
QString singletonContent; QString singletonContent;
FilePaths qmldirFileList = dir.dirEntries(QStringList(FILENAME_QMLDIR), FILES_ONLY); FilePaths qmldirFileList = dir.dirEntries({QStringList(FILENAME_QMLDIR), FILES_ONLY});
if (!qmldirFileList.isEmpty()) { if (!qmldirFileList.isEmpty()) {
QStringList singletons = getSingletonsFromQmldirFile(qmldirFileList.first()); QStringList singletons = getSingletonsFromQmldirFile(qmldirFileList.first());
for (QString &singleton : singletons) { for (QString &singleton : singletons) {
@@ -418,7 +418,7 @@ FilePaths getDirectoryQmls(const FilePath &dir)
{ {
const QStringList qmlFilesOnly("*.qml"); const QStringList qmlFilesOnly("*.qml");
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
FilePaths allFiles = dir.dirEntries(qmlFilesOnly, FILES_ONLY); FilePaths allFiles = dir.dirEntries({qmlFilesOnly, FILES_ONLY});
FilePaths moduleFiles; FilePaths moduleFiles;
for (FilePath &file : allFiles) { for (FilePath &file : allFiles) {
if (!isFileBlacklisted(file.fileName()) && if (!isFileBlacklisted(file.fileName()) &&
@@ -436,7 +436,7 @@ QStringList getDirectoryTreeQmls(const FilePath &dir)
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
QStringList qmlFileList; QStringList qmlFileList;
FilePaths thisDirFiles = dir.dirEntries(qmlFilesOnly, FILES_ONLY); FilePaths thisDirFiles = dir.dirEntries({qmlFilesOnly, FILES_ONLY});
for (FilePath &file : thisDirFiles) { for (FilePath &file : thisDirFiles) {
if (!isFileBlacklisted(file.fileName()) && if (!isFileBlacklisted(file.fileName()) &&
project->isKnownFile(file)) { project->isKnownFile(file)) {

View File

@@ -444,9 +444,8 @@ void QnxConfiguration::updateTargets()
void QnxConfiguration::assignDebuggersToTargets() void QnxConfiguration::assignDebuggersToTargets()
{ {
const FilePath hostUsrBinDir = m_qnxHost.pathAppended("usr/bin"); const FilePath hostUsrBinDir = m_qnxHost.pathAppended("usr/bin");
FilePaths debuggerNames = hostUsrBinDir.dirEntries( const FilePaths debuggerNames = hostUsrBinDir.dirEntries(
QStringList(HostOsInfo::withExecutableSuffix("nto*-gdb")), {{HostOsInfo::withExecutableSuffix("nto*-gdb")}, QDir::Files});
QDir::Files);
Environment sysEnv = Environment::systemEnvironment(); Environment sysEnv = Environment::systemEnvironment();
sysEnv.modify(qnxEnvironmentItems()); sysEnv.modify(qnxEnvironmentItems());
for (const FilePath &debuggerPath : debuggerNames) { for (const FilePath &debuggerPath : debuggerNames) {

View File

@@ -144,9 +144,9 @@ FilePath QnxUtils::envFilePath(const FilePath &sdpPath)
{ {
FilePaths entries; FilePaths entries;
if (sdpPath.osType() == OsTypeWindows) if (sdpPath.osType() == OsTypeWindows)
entries = sdpPath.dirEntries({"*-env.bat"}); entries = sdpPath.dirEntries({{"*-env.bat"}});
else else
entries = sdpPath.dirEntries({"*-env.sh"}); entries = sdpPath.dirEntries({{"*-env.sh"}});
if (!entries.isEmpty()) if (!entries.isEmpty())
return entries.first(); return entries.first();

View File

@@ -114,8 +114,7 @@ void FileSystemAccessTest::testDirStatuses()
} }
return false; return false;
}, },
{"test"}, {{"test"}, QDir::Files});
QDir::Files);
QVERIFY(fileExists); QVERIFY(fileExists);
QVERIFY(testFilePath.removeFile()); QVERIFY(testFilePath.removeFile());

View File

@@ -679,16 +679,15 @@ bool LinuxDevice::setPermissions(const Utils::FilePath &filePath, QFileDevice::P
static void filterEntriesHelper(const FilePath &base, static void filterEntriesHelper(const FilePath &base,
const std::function<bool(const FilePath &)> &callBack, const std::function<bool(const FilePath &)> &callBack,
const QStringList &entries, const QStringList &entries,
const QStringList &nameFilters, const FileFilter &filter)
QDir::Filters filters,
QDirIterator::IteratorFlags flags)
{ {
const QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) { const QList<QRegularExpression> nameRegexps =
QRegularExpression re; transform(filter.nameFilters, [](const QString &filter) {
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter)); QRegularExpression re;
QTC_CHECK(re.isValid()); re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
return re; QTC_CHECK(re.isValid());
}); return re;
});
const auto nameMatches = [&nameRegexps](const QString &fileName) { const auto nameMatches = [&nameRegexps](const QString &fileName) {
for (const QRegularExpression &re : nameRegexps) { for (const QRegularExpression &re : nameRegexps) {
@@ -700,8 +699,8 @@ static void filterEntriesHelper(const FilePath &base,
}; };
// FIXME: Handle filters. For now bark on unsupported options. // FIXME: Handle filters. For now bark on unsupported options.
QTC_CHECK(filters == QDir::NoFilter); QTC_CHECK(filter.fileFilters == QDir::NoFilter);
QTC_CHECK(flags == QDirIterator::NoIteratorFlags); QTC_CHECK(filter.iteratorFlags == QDirIterator::NoIteratorFlags);
for (const QString &entry : entries) { for (const QString &entry : entries) {
if (!nameMatches(entry)) if (!nameMatches(entry))
@@ -713,15 +712,13 @@ static void filterEntriesHelper(const FilePath &base,
void LinuxDevice::iterateDirectory(const FilePath &filePath, void LinuxDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack, const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters, const FileFilter &filter) const
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
{ {
QTC_ASSERT(handlesFile(filePath), return); QTC_ASSERT(handlesFile(filePath), return);
// if we do not have find - use ls as fallback // if we do not have find - use ls as fallback
const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}});
const QStringList entries = output.split('\n', Qt::SkipEmptyParts); const QStringList entries = output.split('\n', Qt::SkipEmptyParts);
filterEntriesHelper(filePath, callBack, entries, nameFilters, filters, flags); filterEntriesHelper(filePath, callBack, entries, filter);
} }
QByteArray LinuxDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const QByteArray LinuxDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const

View File

@@ -78,9 +78,7 @@ public:
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
void iterateDirectory(const Utils::FilePath &filePath, void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack, const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters, const Utils::FileFilter &filter) const override;
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const override;
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) 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; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
QDateTime lastModified(const Utils::FilePath &filePath) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override;

View File

@@ -58,7 +58,7 @@ FilePath findFallbackDefinitionsLocation()
FilePath("/opt") / kateSyntaxPath FilePath("/opt") / kateSyntaxPath
}; };
for (const FilePath &path : paths) { for (const FilePath &path : paths) {
if (path.exists() && !path.dirEntries({"*.xml"}).isEmpty()) if (path.exists() && !path.dirEntries({{"*.xml"}}).isEmpty())
return path; return path;
} }
} }
@@ -76,7 +76,7 @@ FilePath findFallbackDefinitionsLocation()
const FilePath dir = FilePath::fromString(output); const FilePath dir = FilePath::fromString(output);
for (auto &kateSyntaxPath : kateSyntaxPaths) { for (auto &kateSyntaxPath : kateSyntaxPaths) {
const FilePath path = dir / kateSyntaxPath; const FilePath path = dir / kateSyntaxPath;
if (path.exists() && !path.dirEntries({"*.xml"}).isEmpty()) if (path.exists() && !path.dirEntries({{"*.xml"}}).isEmpty())
return path; return path;
} }
} }
@@ -84,7 +84,7 @@ FilePath findFallbackDefinitionsLocation()
} }
const FilePath dir = Core::ICore::resourcePath("generic-highlighter"); const FilePath dir = Core::ICore::resourcePath("generic-highlighter");
if (dir.exists() && !dir.dirEntries({"*.xml"}).isEmpty()) if (dir.exists() && !dir.dirEntries({{"*.xml"}}).isEmpty())
return dir; return dir;
return {}; return {};

View File

@@ -95,7 +95,8 @@ SnippetsCollection *SnippetsCollection::instance()
// SnippetsCollection // SnippetsCollection
SnippetsCollection::SnippetsCollection() SnippetsCollection::SnippetsCollection()
: m_userSnippetsFile(Core::ICore::userResourcePath("snippets/snippets.xml")), : m_userSnippetsFile(Core::ICore::userResourcePath("snippets/snippets.xml")),
m_builtInSnippetsFiles(Core::ICore::resourcePath("snippets").dirEntries({"*.xml"})) m_builtInSnippetsFiles(Core::ICore::resourcePath("snippets")
.dirEntries(FileFilter({"*.xml"})))
{ {
connect(Core::ICore::instance(), &Core::ICore::coreOpened, connect(Core::ICore::instance(), &Core::ICore::coreOpened,