forked from qt-creator/qt-creator
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:
@@ -88,9 +88,7 @@ static FilePath findQmakeInDir(const FilePath &dir)
|
||||
|
||||
// Prefer qmake-qt5 to qmake-qt4 by sorting the filenames in reverse order.
|
||||
const FilePaths candidates = dir.dirEntries(
|
||||
BuildableHelperLibrary::possibleQMakeCommands(),
|
||||
QDir::Files,
|
||||
QDirIterator::NoIteratorFlags,
|
||||
{BuildableHelperLibrary::possibleQMakeCommands(), QDir::Files},
|
||||
QDir::Name | QDir::Reversed);
|
||||
for (const FilePath &candidate : candidates) {
|
||||
if (candidate == qmakePath)
|
||||
|
@@ -718,19 +718,16 @@ bool FilePath::createDir() const
|
||||
return dir.mkpath(dir.absolutePath());
|
||||
}
|
||||
|
||||
FilePaths FilePath::dirEntries(const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags,
|
||||
QDir::SortFlags sort) const
|
||||
FilePaths FilePath::dirEntries(const FileFilter &filter, QDir::SortFlags sort) const
|
||||
{
|
||||
FilePaths result;
|
||||
|
||||
if (needsDevice()) {
|
||||
QTC_ASSERT(s_deviceHooks.iterateDirectory, return {});
|
||||
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 {
|
||||
QDirIterator dit(m_data, nameFilters, filters, flags);
|
||||
QDirIterator dit(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
|
||||
while (dit.hasNext())
|
||||
result.append(FilePath::fromString(dit.next()));
|
||||
}
|
||||
@@ -748,7 +745,7 @@ FilePaths FilePath::dirEntries(const QStringList &nameFilters,
|
||||
|
||||
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
|
||||
@@ -756,17 +753,15 @@ FilePaths FilePath::dirEntries(QDir::Filters filters) const
|
||||
// An empty \nameFilters list matches every name.
|
||||
|
||||
void FilePath::iterateDirectory(const std::function<bool(const FilePath &item)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) const
|
||||
const FileFilter &filter) const
|
||||
{
|
||||
if (needsDevice()) {
|
||||
QTC_ASSERT(s_deviceHooks.iterateDirectory, return);
|
||||
s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags);
|
||||
s_deviceHooks.iterateDirectory(*this, callBack, filter);
|
||||
return;
|
||||
}
|
||||
|
||||
QDirIterator it(m_data, nameFilters, filters, flags);
|
||||
QDirIterator it(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
|
||||
while (it.hasNext()) {
|
||||
if (!callBack(FilePath::fromString(it.next())))
|
||||
return;
|
||||
@@ -1454,6 +1449,15 @@ QTextStream &operator<<(QTextStream &s, const FilePath &fn)
|
||||
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
|
||||
|
||||
std::hash<Utils::FilePath>::result_type
|
||||
|
@@ -51,6 +51,18 @@ namespace Utils {
|
||||
class Environment;
|
||||
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
|
||||
{
|
||||
public:
|
||||
@@ -121,9 +133,7 @@ public:
|
||||
qint64 fileSize() const;
|
||||
qint64 bytesAvailable() const;
|
||||
bool createDir() const;
|
||||
QList<FilePath> dirEntries(const QStringList &nameFilters,
|
||||
QDir::Filters filters = QDir::NoFilter,
|
||||
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags,
|
||||
QList<FilePath> dirEntries(const FileFilter &filter,
|
||||
QDir::SortFlags sort = QDir::NoSort) const;
|
||||
QList<FilePath> dirEntries(QDir::Filters filters) const;
|
||||
QByteArray fileContents(qint64 maxSize = -1, qint64 offset = 0) const;
|
||||
@@ -160,9 +170,7 @@ public:
|
||||
[[nodiscard]] FilePath onDevice(const FilePath &deviceTemplate) const;
|
||||
[[nodiscard]] FilePath withNewPath(const QString &newPath) const;
|
||||
void iterateDirectory(const std::function<bool(const FilePath &item)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters = QDir::NoFilter,
|
||||
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const;
|
||||
const FileFilter &filter) const;
|
||||
|
||||
// makes sure that capitalization of directories is canonical
|
||||
// on Windows and macOS. This is rarely needed.
|
||||
|
@@ -82,9 +82,7 @@ public:
|
||||
std::function<QString(const FilePath &)> mapToDevicePath;
|
||||
std::function<void(const FilePath &,
|
||||
const std::function<bool(const FilePath &)> &, // Abort on 'false' return.
|
||||
const QStringList &,
|
||||
QDir::Filters,
|
||||
QDirIterator::IteratorFlags)> iterateDirectory;
|
||||
const FileFilter &)> iterateDirectory;
|
||||
std::function<QByteArray(const FilePath &, qint64, qint64)> fileContents;
|
||||
std::function<bool(const FilePath &, const QByteArray &)> writeFileContents;
|
||||
std::function<QDateTime(const FilePath &)> lastModified;
|
||||
|
@@ -221,7 +221,7 @@ FilePaths BackUpStrategy::readFileCandidates(const FilePath &baseFileName) const
|
||||
const QStringList filter(baseFileName.fileName() + '*');
|
||||
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,
|
||||
|
@@ -382,8 +382,7 @@ QVector<int> AndroidConfig::availableNdkPlatforms(const QtVersion *qtVersion) co
|
||||
.toInt());
|
||||
return true;
|
||||
},
|
||||
{"android-*"},
|
||||
QDir::Dirs);
|
||||
{{"android-*"}, QDir::Dirs});
|
||||
|
||||
Utils::sort(availableNdkPlatforms, std::greater<>());
|
||||
return availableNdkPlatforms;
|
||||
|
@@ -423,7 +423,7 @@ QString AndroidManager::apkDevicePreferredAbi(const Target *target)
|
||||
QStringList apkAbis;
|
||||
const FilePaths libsPaths = libsPath.dirEntries(QDir::Dirs | QDir::NoDotAndDotDot);
|
||||
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();
|
||||
}
|
||||
return preferredAbi(apkAbis, target);
|
||||
|
@@ -256,7 +256,7 @@ static QImage scaleWithoutStretching(const QImage& original, const QSize& target
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
@@ -73,9 +73,7 @@ static void setSdkFilesExecPermission( const FilePath &sdkExtractPath)
|
||||
}
|
||||
return true;
|
||||
},
|
||||
{"*"},
|
||||
QDir::Files,
|
||||
QDirIterator::Subdirectories);
|
||||
{{"*"}, QDir::Files, QDirIterator::Subdirectories});
|
||||
}
|
||||
|
||||
void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath)
|
||||
|
@@ -322,7 +322,7 @@ void JLSClient::updateProjectFiles()
|
||||
const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar")
|
||||
.arg(targetSDK);
|
||||
FilePaths libs = {androidJar};
|
||||
libs << packageSourceDir.pathAppended("libs").dirEntries({"*.jar"}, QDir::Files);
|
||||
libs << packageSourceDir.pathAppended("libs").dirEntries({{"*.jar"}, QDir::Files});
|
||||
generateProjectFile(projectDir, qtSrc, project()->displayName());
|
||||
generateClassPathFile(projectDir, sourceDir, libs);
|
||||
}
|
||||
|
@@ -79,7 +79,7 @@ static QStringList scanDirectory(const FilePath &path, const QString &prefix)
|
||||
QStringList result;
|
||||
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);
|
||||
result.append(entry.toString());
|
||||
}
|
||||
|
@@ -948,10 +948,7 @@ FilePath FileApiParser::scanForCMakeReplyFile(const FilePath &buildDirectory)
|
||||
if (!replyDir.exists())
|
||||
return {};
|
||||
|
||||
const FilePaths entries = replyDir.dirEntries({"index-*.json"},
|
||||
QDir::Files,
|
||||
QDirIterator::NoIteratorFlags,
|
||||
QDir::Name);
|
||||
const FilePaths entries = replyDir.dirEntries({{"index-*.json"}, QDir::Files}, QDir::Name);
|
||||
return entries.isEmpty() ? FilePath() : entries.first();
|
||||
}
|
||||
|
||||
|
@@ -780,7 +780,7 @@ void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers(const FilePaths &s
|
||||
|
||||
const auto addSuspect = [&suspects](const FilePath &entry) { suspects.append(entry); return true; };
|
||||
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...")};
|
||||
for (const FilePath &command : qAsConst(suspects)) {
|
||||
|
@@ -1615,9 +1615,7 @@ QString GdbEngine::cleanupFullName(const QString &fileName)
|
||||
}
|
||||
return true;
|
||||
},
|
||||
{"*"},
|
||||
QDir::NoFilter,
|
||||
QDirIterator::Subdirectories);
|
||||
{{"*"}, QDir::NoFilter, QDirIterator::Subdirectories});
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1455,17 +1455,20 @@ bool DockerDevice::setPermissions(const FilePath &filePath, QFileDevice::Permiss
|
||||
|
||||
void DockerDevice::iterateWithFind(const FilePath &filePath,
|
||||
const std::function<bool(const Utils::FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters) const
|
||||
const FileFilter &filter) const
|
||||
{
|
||||
QTC_ASSERT(callBack, return);
|
||||
QTC_CHECK(filePath.isAbsolutePath());
|
||||
QStringList arguments{filePath.path(), "-maxdepth", "1"};
|
||||
QStringList arguments{filePath.path()};
|
||||
|
||||
const QDir::Filters filters = filter.fileFilters;
|
||||
if (filters & QDir::NoSymLinks)
|
||||
arguments.prepend("-H");
|
||||
else
|
||||
arguments.prepend("-L");
|
||||
|
||||
if (!filter.iteratorFlags.testFlag(QDirIterator::Subdirectories))
|
||||
arguments.append({"-maxdepth", "1"});
|
||||
|
||||
QStringList filterOptions;
|
||||
if (filters & QDir::Dirs)
|
||||
@@ -1493,12 +1496,12 @@ void DockerDevice::iterateWithFind(const FilePath &filePath,
|
||||
const QString nameOption = (filters & QDir::CaseSensitive) ? QString{"-name"}
|
||||
: QString{"-iname"};
|
||||
QStringList criticalWildcards;
|
||||
if (!nameFilters.isEmpty()) {
|
||||
if (!filter.nameFilters.isEmpty()) {
|
||||
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)
|
||||
filterOptions << "-o";
|
||||
QString current = nameFilters.at(i);
|
||||
QString current = filter.nameFilters.at(i);
|
||||
if (current.indexOf(oneChar) != -1)
|
||||
criticalWildcards.append(current);
|
||||
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,
|
||||
const std::function<bool(const FilePath &)> &callBack,
|
||||
const QStringList &entries,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters)
|
||||
const FileFilter &filter)
|
||||
{
|
||||
const QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) {
|
||||
QRegularExpression re;
|
||||
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
|
||||
QTC_CHECK(re.isValid());
|
||||
return re;
|
||||
});
|
||||
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) {
|
||||
@@ -1557,7 +1562,7 @@ static void filterEntriesHelper(const FilePath &base,
|
||||
};
|
||||
|
||||
// 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) {
|
||||
if (!nameMatches(entry))
|
||||
@@ -1569,12 +1574,8 @@ static void filterEntriesHelper(const FilePath &base,
|
||||
|
||||
void DockerDevice::iterateDirectory(const FilePath &filePath,
|
||||
const std::function<bool(const FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) const
|
||||
const FileFilter &filter) const
|
||||
{
|
||||
Q_UNUSED(flags) // FIXME: Use it.
|
||||
|
||||
QTC_ASSERT(handlesFile(filePath), return);
|
||||
updateContainerAccess();
|
||||
if (hasLocalFileAccess()) {
|
||||
@@ -1582,12 +1583,12 @@ void DockerDevice::iterateDirectory(const FilePath &filePath,
|
||||
local.iterateDirectory([&callBack, this](const FilePath &entry) {
|
||||
return callBack(mapFromLocalAccess(entry));
|
||||
},
|
||||
nameFilters, filters);
|
||||
filter);
|
||||
return;
|
||||
}
|
||||
|
||||
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
|
||||
// case fall back to 'ls' below.
|
||||
if (d->m_useFind)
|
||||
@@ -1597,7 +1598,7 @@ void DockerDevice::iterateDirectory(const FilePath &filePath,
|
||||
// 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, filter);
|
||||
}
|
||||
|
||||
QByteArray DockerDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const
|
||||
|
@@ -96,9 +96,7 @@ public:
|
||||
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
|
||||
void iterateDirectory(const Utils::FilePath &filePath,
|
||||
const std::function<bool(const Utils::FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const override;
|
||||
const Utils::FileFilter &filter) 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;
|
||||
@@ -127,8 +125,7 @@ protected:
|
||||
private:
|
||||
void iterateWithFind(const Utils::FilePath &filePath,
|
||||
const std::function<bool(const Utils::FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters) const;
|
||||
const Utils::FileFilter &filter) const;
|
||||
|
||||
void aboutToBeRemoved() const final;
|
||||
|
||||
|
@@ -70,7 +70,7 @@ static FilePath detectApp(const QString &defaultExe)
|
||||
if (!gitBinDir.endsWith("/usr/bin"))
|
||||
return {};
|
||||
path = gitBinDir.parentDir().parentDir();
|
||||
const FilePaths entries = path.dirEntries({"mingw*"}, {});
|
||||
const FilePaths entries = path.dirEntries({{"mingw*"}});
|
||||
if (entries.isEmpty())
|
||||
return {};
|
||||
path = entries.first() / "bin" / defaultApp;
|
||||
|
@@ -217,8 +217,7 @@ static McuPackage *createRGLPackage()
|
||||
if (rglPath.exists()) {
|
||||
defaultPath = rglPath;
|
||||
const FilePaths subDirs =
|
||||
defaultPath.dirEntries({QLatin1String("rgl_ghs_D1Mx_*")},
|
||||
QDir::Dirs | QDir::NoDotAndDotDot);
|
||||
defaultPath.dirEntries({{"rgl_ghs_D1Mx_*"}, QDir::Dirs | QDir::NoDotAndDotDot});
|
||||
if (subDirs.count() == 1)
|
||||
defaultPath = subDirs.first();
|
||||
}
|
||||
@@ -272,8 +271,7 @@ static McuPackage *createMcuXpressoIdePackage()
|
||||
defaultPath = programPath;
|
||||
// If default dir has exactly one sub dir that could be the IDE path, pre-select that.
|
||||
const FilePaths subDirs =
|
||||
defaultPath.dirEntries({QLatin1String("MCUXpressoIDE*")},
|
||||
QDir::Dirs | QDir::NoDotAndDotDot);
|
||||
defaultPath.dirEntries({{"MCUXpressoIDE*"}, QDir::Dirs | QDir::NoDotAndDotDot});
|
||||
if (subDirs.count() == 1)
|
||||
defaultPath = subDirs.first();
|
||||
}
|
||||
@@ -304,8 +302,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, QDirIterator::NoIteratorFlags, QDir::Unsorted);
|
||||
const auto subDirs = candidate.dirEntries({{"Cypress Auto Flash Utility*"}, QDir::Dirs},
|
||||
QDir::Unsorted);
|
||||
if (!subDirs.empty())
|
||||
defaultPath = subDirs.first();
|
||||
}
|
||||
@@ -331,8 +329,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, QDirIterator::NoIteratorFlags, QDir::Unsorted);
|
||||
const auto subDirs = candidate.dirEntries({{"Renesas Flash Programmer*"}, QDir::Dirs},
|
||||
QDir::Unsorted);
|
||||
if (!subDirs.empty())
|
||||
defaultPath = subDirs.first();
|
||||
}
|
||||
|
@@ -177,13 +177,11 @@ bool DesktopDevice::handlesFile(const FilePath &filePath) const
|
||||
}
|
||||
|
||||
void DesktopDevice::iterateDirectory(const FilePath &filePath,
|
||||
const std::function<bool(const Utils::FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) const
|
||||
const std::function<bool(const FilePath &)> &callBack,
|
||||
const FileFilter &filter) const
|
||||
{
|
||||
QTC_CHECK(!filePath.needsDevice());
|
||||
filePath.iterateDirectory(callBack, nameFilters, filters, flags);
|
||||
filePath.iterateDirectory(callBack, filter);
|
||||
}
|
||||
|
||||
qint64 DesktopDevice::fileSize(const FilePath &filePath) const
|
||||
|
@@ -75,9 +75,7 @@ public:
|
||||
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
|
||||
void iterateDirectory(const Utils::FilePath &filePath,
|
||||
const std::function<bool(const Utils::FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) const override;
|
||||
const Utils::FileFilter &filter) 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;
|
||||
|
@@ -524,12 +524,10 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
|
||||
|
||||
deviceHooks.iterateDirectory = [](const FilePath &filePath,
|
||||
const std::function<bool(const FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) {
|
||||
const FileFilter &filter) {
|
||||
auto device = DeviceManager::deviceForPath(filePath);
|
||||
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) {
|
||||
|
@@ -363,15 +363,11 @@ FilePath IDevice::symLinkTarget(const FilePath &filePath) const
|
||||
|
||||
void IDevice::iterateDirectory(const FilePath &filePath,
|
||||
const std::function<bool(const FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) const
|
||||
const FileFilter &filter) const
|
||||
{
|
||||
Q_UNUSED(filePath);
|
||||
Q_UNUSED(callBack);
|
||||
Q_UNUSED(nameFilters);
|
||||
Q_UNUSED(filters);
|
||||
Q_UNUSED(flags);
|
||||
Q_UNUSED(filter);
|
||||
QTC_CHECK(false);
|
||||
}
|
||||
|
||||
|
@@ -33,7 +33,6 @@
|
||||
|
||||
#include <QAbstractSocket>
|
||||
#include <QCoreApplication>
|
||||
#include <QDir>
|
||||
#include <QList>
|
||||
#include <QObject>
|
||||
#include <QSharedPointer>
|
||||
@@ -257,13 +256,11 @@ public:
|
||||
virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const;
|
||||
virtual Utils::FilePath searchExecutableInPath(const QString &fileName) const;
|
||||
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 void iterateDirectory(const Utils::FilePath &filePath,
|
||||
const std::function<bool(const Utils::FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const;
|
||||
const Utils::FileFilter &filter) const;
|
||||
virtual QByteArray fileContents(const Utils::FilePath &filePath,
|
||||
qint64 limit,
|
||||
qint64 offset) const;
|
||||
|
@@ -1126,7 +1126,8 @@ static FilePaths findCompilerCandidates(const IDevice::ConstPtr &device,
|
||||
return true;
|
||||
};
|
||||
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 {
|
||||
// The normal, local host case.
|
||||
|
@@ -423,10 +423,11 @@ QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories()
|
||||
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 QDirIterator::IteratorFlag iteratorFlags = QDirIterator::NoIteratorFlags;
|
||||
FilePaths dirs = path.dirEntries({}, filters, iteratorFlags, sortflags);
|
||||
FilePaths dirs = path.dirEntries(filter, sortflags);
|
||||
|
||||
while (!dirs.isEmpty()) {
|
||||
const FilePath currentDir = dirs.takeFirst();
|
||||
@@ -483,7 +484,7 @@ QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories()
|
||||
|
||||
result << factory;
|
||||
} else {
|
||||
FilePaths subDirs = currentDir.dirEntries({}, filters, iteratorFlags, sortflags);
|
||||
FilePaths subDirs = currentDir.dirEntries(filter, sortflags);
|
||||
if (!subDirs.isEmpty()) {
|
||||
// There is no QList::prepend(QList)...
|
||||
dirs.swap(subDirs);
|
||||
@@ -579,7 +580,7 @@ static QString qmlProjectName(const FilePath &folder)
|
||||
{
|
||||
FilePath currentFolder = folder;
|
||||
while (!currentFolder.isEmpty()) {
|
||||
const QList<FilePath> fileList = currentFolder.dirEntries({"*.qmlproject"});
|
||||
const FilePaths fileList = currentFolder.dirEntries({{"*.qmlproject"}});
|
||||
if (!fileList.isEmpty())
|
||||
return fileList.first().baseName();
|
||||
currentFolder = currentFolder.parentDir();
|
||||
|
@@ -694,7 +694,7 @@ static ProjectExplorerPluginPrivate *dd = nullptr;
|
||||
|
||||
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)
|
||||
|
@@ -791,8 +791,7 @@ 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, QDirIterator::NoIteratorFlags, QDir::Time);
|
||||
const FilePaths sessionFiles = ICore::userResourcePath().dirEntries({{"*qws"}}, QDir::Time);
|
||||
for (const FilePath &file : sessionFiles) {
|
||||
const QString &name = file.completeBaseName();
|
||||
d->m_sessionDateTimes.insert(name, file.lastModified());
|
||||
|
@@ -354,7 +354,7 @@ void generateModuleCmake(const FilePath &dir, const QString &uri)
|
||||
QString fileTemplate = GenerateCmake::readTemplate(MODULEFILE_TEMPLATE_PATH);
|
||||
|
||||
QString singletonContent;
|
||||
FilePaths qmldirFileList = dir.dirEntries(QStringList(FILENAME_QMLDIR), FILES_ONLY);
|
||||
FilePaths qmldirFileList = dir.dirEntries({QStringList(FILENAME_QMLDIR), FILES_ONLY});
|
||||
if (!qmldirFileList.isEmpty()) {
|
||||
QStringList singletons = getSingletonsFromQmldirFile(qmldirFileList.first());
|
||||
for (QString &singleton : singletons) {
|
||||
@@ -418,7 +418,7 @@ FilePaths getDirectoryQmls(const FilePath &dir)
|
||||
{
|
||||
const QStringList qmlFilesOnly("*.qml");
|
||||
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
|
||||
FilePaths allFiles = dir.dirEntries(qmlFilesOnly, FILES_ONLY);
|
||||
FilePaths allFiles = dir.dirEntries({qmlFilesOnly, FILES_ONLY});
|
||||
FilePaths moduleFiles;
|
||||
for (FilePath &file : allFiles) {
|
||||
if (!isFileBlacklisted(file.fileName()) &&
|
||||
@@ -436,7 +436,7 @@ QStringList getDirectoryTreeQmls(const FilePath &dir)
|
||||
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
|
||||
QStringList qmlFileList;
|
||||
|
||||
FilePaths thisDirFiles = dir.dirEntries(qmlFilesOnly, FILES_ONLY);
|
||||
FilePaths thisDirFiles = dir.dirEntries({qmlFilesOnly, FILES_ONLY});
|
||||
for (FilePath &file : thisDirFiles) {
|
||||
if (!isFileBlacklisted(file.fileName()) &&
|
||||
project->isKnownFile(file)) {
|
||||
|
@@ -444,9 +444,8 @@ void QnxConfiguration::updateTargets()
|
||||
void QnxConfiguration::assignDebuggersToTargets()
|
||||
{
|
||||
const FilePath hostUsrBinDir = m_qnxHost.pathAppended("usr/bin");
|
||||
FilePaths debuggerNames = hostUsrBinDir.dirEntries(
|
||||
QStringList(HostOsInfo::withExecutableSuffix("nto*-gdb")),
|
||||
QDir::Files);
|
||||
const FilePaths debuggerNames = hostUsrBinDir.dirEntries(
|
||||
{{HostOsInfo::withExecutableSuffix("nto*-gdb")}, QDir::Files});
|
||||
Environment sysEnv = Environment::systemEnvironment();
|
||||
sysEnv.modify(qnxEnvironmentItems());
|
||||
for (const FilePath &debuggerPath : debuggerNames) {
|
||||
|
@@ -144,9 +144,9 @@ FilePath QnxUtils::envFilePath(const FilePath &sdpPath)
|
||||
{
|
||||
FilePaths entries;
|
||||
if (sdpPath.osType() == OsTypeWindows)
|
||||
entries = sdpPath.dirEntries({"*-env.bat"});
|
||||
entries = sdpPath.dirEntries({{"*-env.bat"}});
|
||||
else
|
||||
entries = sdpPath.dirEntries({"*-env.sh"});
|
||||
entries = sdpPath.dirEntries({{"*-env.sh"}});
|
||||
|
||||
if (!entries.isEmpty())
|
||||
return entries.first();
|
||||
|
@@ -114,8 +114,7 @@ void FileSystemAccessTest::testDirStatuses()
|
||||
}
|
||||
return false;
|
||||
},
|
||||
{"test"},
|
||||
QDir::Files);
|
||||
{{"test"}, QDir::Files});
|
||||
|
||||
QVERIFY(fileExists);
|
||||
QVERIFY(testFilePath.removeFile());
|
||||
|
@@ -679,16 +679,15 @@ bool LinuxDevice::setPermissions(const Utils::FilePath &filePath, QFileDevice::P
|
||||
static void filterEntriesHelper(const FilePath &base,
|
||||
const std::function<bool(const FilePath &)> &callBack,
|
||||
const QStringList &entries,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags)
|
||||
const FileFilter &filter)
|
||||
{
|
||||
const QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) {
|
||||
QRegularExpression re;
|
||||
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
|
||||
QTC_CHECK(re.isValid());
|
||||
return re;
|
||||
});
|
||||
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) {
|
||||
@@ -700,8 +699,8 @@ 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);
|
||||
QTC_CHECK(filter.fileFilters == QDir::NoFilter);
|
||||
QTC_CHECK(filter.iteratorFlags == QDirIterator::NoIteratorFlags);
|
||||
|
||||
for (const QString &entry : entries) {
|
||||
if (!nameMatches(entry))
|
||||
@@ -713,15 +712,13 @@ static void filterEntriesHelper(const FilePath &base,
|
||||
|
||||
void LinuxDevice::iterateDirectory(const FilePath &filePath,
|
||||
const std::function<bool(const FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) const
|
||||
const FileFilter &filter) 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, flags);
|
||||
filterEntriesHelper(filePath, callBack, entries, filter);
|
||||
}
|
||||
|
||||
QByteArray LinuxDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const
|
||||
|
@@ -78,9 +78,7 @@ public:
|
||||
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
|
||||
void iterateDirectory(const Utils::FilePath &filePath,
|
||||
const std::function<bool(const Utils::FilePath &)> &callBack,
|
||||
const QStringList &nameFilters,
|
||||
QDir::Filters filters,
|
||||
QDirIterator::IteratorFlags flags) const override;
|
||||
const Utils::FileFilter &filter) 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;
|
||||
|
@@ -58,7 +58,7 @@ FilePath findFallbackDefinitionsLocation()
|
||||
FilePath("/opt") / kateSyntaxPath
|
||||
};
|
||||
for (const FilePath &path : paths) {
|
||||
if (path.exists() && !path.dirEntries({"*.xml"}).isEmpty())
|
||||
if (path.exists() && !path.dirEntries({{"*.xml"}}).isEmpty())
|
||||
return path;
|
||||
}
|
||||
}
|
||||
@@ -76,7 +76,7 @@ FilePath findFallbackDefinitionsLocation()
|
||||
const FilePath dir = FilePath::fromString(output);
|
||||
for (auto &kateSyntaxPath : kateSyntaxPaths) {
|
||||
const FilePath path = dir / kateSyntaxPath;
|
||||
if (path.exists() && !path.dirEntries({"*.xml"}).isEmpty())
|
||||
if (path.exists() && !path.dirEntries({{"*.xml"}}).isEmpty())
|
||||
return path;
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,7 @@ FilePath findFallbackDefinitionsLocation()
|
||||
}
|
||||
|
||||
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 {};
|
||||
|
@@ -95,7 +95,8 @@ SnippetsCollection *SnippetsCollection::instance()
|
||||
// SnippetsCollection
|
||||
SnippetsCollection::SnippetsCollection()
|
||||
: 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,
|
||||
|
Reference in New Issue
Block a user