Port to QDirListing

Use QDirListing in the Bootstrap build instead of QDirIterator.

Drive-by changes:
- more const variables
- use emplace_back() instead of append() where appropriate

Change-Id: Ie1f0d03856e557c4bfabfff38a87edc7da86d091
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Ahmad Samir 2023-12-21 21:40:40 +02:00
parent d5eb5d2f8d
commit 7cf39bd785
21 changed files with 123 additions and 145 deletions

View File

@ -6,7 +6,7 @@
#include <qregularexpression.h>
#include <qdir.h>
#include <qdiriterator.h>
#include <qdirlisting.h>
#include <qset.h>
#include <time.h>
@ -314,16 +314,15 @@ void NmakeMakefileGenerator::writeImplicitRulesPart(QTextStream &t)
const QStringList sourceFilesFilter = sourceFilesForImplicitRulesFilter();
QStringList fixifiedSourceDirs = fileFixify(QList<QString>(source_directories.constBegin(), source_directories.constEnd()), FileFixifyAbsolute);
fixifiedSourceDirs.removeDuplicates();
constexpr auto filters = QDir::Files | QDir::NoDotAndDotDot;
for (const QString &sourceDir : std::as_const(fixifiedSourceDirs)) {
QDirIterator dit(sourceDir, sourceFilesFilter, QDir::Files | QDir::NoDotAndDotDot);
while (dit.hasNext()) {
const QFileInfo fi = dit.nextFileInfo();
QString &duplicate = fileNames[fi.completeBaseName()];
for (const auto &dirEntry : QDirListing(sourceDir, sourceFilesFilter, filters)) {
QString &duplicate = fileNames[dirEntry.completeBaseName()];
if (duplicate.isNull()) {
duplicate = fi.filePath();
duplicate = dirEntry.filePath();
} else {
warn_msg(WarnLogic, "%s conflicts with %s", qPrintable(duplicate),
qPrintable(fi.filePath()));
qPrintable(dirEntry.filePath()));
duplicatesFound = true;
}
}

View File

@ -8,7 +8,7 @@
#include <ioutils.h>
#include <qdir.h>
#include <qdiriterator.h>
#include <qdirlisting.h>
#include <qcryptographichash.h>
#include <qhash.h>
#include <quuid.h>
@ -1293,18 +1293,16 @@ void VcprojGenerator::initDeploymentTool()
}
int pathSize = searchPath.size();
QDirIterator iterator(searchPath, QStringList() << nameFilter
, QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks
, QDirIterator::Subdirectories);
constexpr auto filters = QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks;
using F = QDirListing::IteratorFlag;
QDirListing dirList(searchPath, QStringList{nameFilter}, filters, F::Recursive);
// foreach dirIterator-entry in d
while(iterator.hasNext()) {
iterator.next();
QString absoluteItemPath = Option::fixPathToTargetOS(QFileInfo(iterator.filePath()).absolutePath());
for (const auto &dirEntry : dirList) {
const QString absoluteItemPath = Option::fixPathToTargetOS(dirEntry.absolutePath());
// Identify if it is just another subdir
int diffSize = absoluteItemPath.size() - pathSize;
// write out rules
conf.deployment.AdditionalFiles += iterator.fileName()
conf.deployment.AdditionalFiles += dirEntry.fileName()
+ "|" + absoluteItemPath
+ "|" + itemDevicePath + (diffSize ? (absoluteItemPath.right(diffSize)) : QLatin1String(""))
+ "|0;";

View File

@ -10,7 +10,7 @@
#include "qreadwritelock.h"
#include "qvariant.h"
// built-in handlers
#include "qdiriterator.h"
#include "qdirlisting.h"
#include "qstringbuilder.h"
#include <QtCore/private/qfilesystementry_p.h>
@ -590,11 +590,8 @@ bool QAbstractFileEngine::isRelativePath() const
QStringList QAbstractFileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const
{
QStringList ret;
QDirIterator it(fileName(), filterNames, filters);
while (it.hasNext()) {
it.next();
ret << it.fileName();
}
for (const auto &dirEntry : QDirListing(fileName(), filterNames, filters))
ret.emplace_back(dirEntry.fileName());
return ret;
}
@ -826,11 +823,12 @@ bool QAbstractFileEngine::cloneTo(QAbstractFileEngine *target)
\internal
If all you want is to iterate over entries in a directory, see
QDirIterator instead. This class is only for custom file engine authors.
QDirListing instead. This class is useful only for custom file engine
authors.
QAbstractFileEngineIterator is a unidirectional single-use virtual
iterator that plugs into QDirIterator, providing transparent proxy
iteration for custom file engines.
iterator that plugs into QDirListing, providing transparent proxy
iteration for custom file engines (for example, QResourceFileEngine).
You can subclass QAbstractFileEngineIterator to provide an iterator when
writing your own file engine. To plug the iterator into your file system,
@ -869,7 +867,7 @@ bool QAbstractFileEngine::cloneTo(QAbstractFileEngine *target)
Note: QAbstractFileEngineIterator does not deal with QDir::IteratorFlags;
it simply returns entries for a single directory.
\sa QDirIterator
\sa QDirListing
*/
/*!
@ -911,15 +909,18 @@ QAbstractFileEngineIterator::QAbstractFileEngineIterator(QDir::Filters filters,
/*!
Destroys the QAbstractFileEngineIterator.
\sa QDirIterator
\sa QDirListing
*/
QAbstractFileEngineIterator::~QAbstractFileEngineIterator()
{
}
/*!
Returns the path for this iterator. QDirIterator is responsible for
assigning this path; it cannot change during the iterator's lifetime.
Returns the path for this iterator. It can be set using setPath().
Typically the path is passed to beginEntryList(), which sets the path.
\note The path should't be changed once iteration begins.
\sa nameFilters(), filters()
*/
@ -932,7 +933,7 @@ QString QAbstractFileEngineIterator::path() const
\internal
Sets the iterator path to \a path. This function is called from within
QDirIterator.
QDirListing.
*/
void QAbstractFileEngineIterator::setPath(const QString &path)
{
@ -1032,8 +1033,6 @@ QVariant QAbstractFileEngineIterator::entryInfo(EntryInfoType type) const
optimize its performance.
Reimplement this function in a subclass to advance the iterator.
\sa QDirIterator::next()
*/
/*!
@ -1042,19 +1041,17 @@ QVariant QAbstractFileEngineIterator::entryInfo(EntryInfoType type) const
This pure virtual function returns \c true if there is at least one more
entry in the current directory (i.e., the iterator path is valid and
accessible, and the iterator has not reached the end of the entry list).
\sa QDirIterator::hasNext()
*/
/*!
Returns an instance of a QAbstractFileEngineIterator using \a filters for
entry filtering and \a filterNames for name filtering. This function is
called by QDirIterator to initiate directory iteration.
called by QDirListing to initiate directory iteration.
QDirIterator takes ownership of the returned instance, and deletes it when
QDirListing takes ownership of the returned instance, and deletes it when
it's done.
\sa QDirIterator
\sa QDirListing
*/
QAbstractFileEngine::Iterator *QAbstractFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames)
{

View File

@ -9,7 +9,7 @@
#ifndef QT_NO_DEBUG_STREAM
#include "qdebug.h"
#endif
#include "qdiriterator.h"
#include "qdirlisting.h"
#include "qdatetime.h"
#include "qstring.h"
#if QT_CONFIG(regularexpression)
@ -346,9 +346,8 @@ inline void QDirPrivate::initFileLists(const QDir &dir) const
QMutexLocker locker(&fileCache.mutex);
if (!fileCache.fileListsInitialized) {
QFileInfoList l;
QDirIterator it(dir);
while (it.hasNext())
l.append(it.nextFileInfo());
for (const auto &dirEntry : QDirListing(dir))
l.emplace_back(dirEntry.fileInfo());
sortFileList(sort, l, &fileCache.files, &fileCache.fileInfos);
fileCache.fileListsInitialized = true;
@ -1427,18 +1426,16 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
}
}
QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
QDirListing dirList(d->dirEntry.filePath(), nameFilters, filters);
QStringList ret;
if (needsSorting) {
QFileInfoList l;
while (it.hasNext())
l.append(it.nextFileInfo());
for (const auto &dirEntry : dirList)
l.emplace_back(dirEntry.fileInfo());
d->sortFileList(sort, l, &ret, nullptr);
} else {
while (it.hasNext()) {
it.next();
ret.append(it.fileName());
}
for (const auto &dirEntry : dirList)
ret.emplace_back(dirEntry.fileName());
}
return ret;
}
@ -1475,9 +1472,8 @@ QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filter
}
QFileInfoList l;
QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
while (it.hasNext())
l.append(it.nextFileInfo());
for (const auto &dirEntry : QDirListing(d->dirEntry.filePath(), nameFilters, filters))
l.emplace_back(dirEntry.fileInfo());
QFileInfoList ret;
d->sortFileList(sort, l, nullptr, &ret);
return ret;
@ -1646,12 +1642,11 @@ bool QDir::removeRecursively()
bool success = true;
const QString dirPath = path();
// not empty -- we must empty it first
QDirIterator di(dirPath, QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
while (di.hasNext()) {
const QFileInfo fi = di.nextFileInfo();
const QString &filePath = di.filePath();
constexpr auto dirFilters = QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot;
for (const auto &dirEntry : QDirListing(dirPath, dirFilters)) {
const QString &filePath = dirEntry.filePath();
bool ok;
if (fi.isDir() && !fi.isSymLink()) {
if (dirEntry.isDir() && !dirEntry.isSymLink()) {
ok = QDir(filePath).removeRecursively(); // recursive
} else {
ok = QFile::remove(filePath);
@ -1969,8 +1964,8 @@ bool QDir::exists(const QString &name) const
bool QDir::isEmpty(Filters filters) const
{
Q_D(const QDir);
QDirIterator it(d->dirEntry.filePath(), d->nameFilters, filters);
return !it.hasNext();
QDirListing dirList(d->dirEntry.filePath(), d->nameFilters, filters);
return dirList.cbegin() == dirList.cend();
}
/*!

View File

@ -20,7 +20,6 @@
#ifndef QT_NO_FILESYSTEMITERATOR
#include <QtCore/qdir.h>
#include <QtCore/qdiriterator.h>
#include <QtCore/qstringlist.h>
#include <QtCore/private/qfilesystementry_p.h>

View File

@ -6,7 +6,6 @@
#include "qfsfileengine_iterator_p.h"
#include "qfilesystemengine_p.h"
#include "qdatetime.h"
#include "qdiriterator.h"
#include "qset.h"
#include <QtCore/qdebug.h>

View File

@ -6,7 +6,7 @@
#include "qstorageinfo_linux_p.h"
#include "qdiriterator.h"
#include "qdirlisting.h"
#include <private/qcore_unix_p.h>
#include <private/qtools_p.h>
@ -99,13 +99,13 @@ static inline quint64 retrieveDeviceId(const QByteArray &device, quint64 deviceI
return st.st_rdev;
}
static QDirIterator devicesByLabel()
static QDirListing devicesByLabel()
{
static const char pathDiskByLabel[] = "/dev/disk/by-label";
static constexpr auto LabelFileFilter =
QDir::AllEntries | QDir::System | QDir::Hidden | QDir::NoDotAndDotDot;
return QDirIterator(QLatin1StringView(pathDiskByLabel), LabelFileFilter);
return QDirListing(QLatin1StringView(pathDiskByLabel), LabelFileFilter);
}
static inline auto retrieveLabels()
@ -116,13 +116,11 @@ static inline auto retrieveLabels()
};
QList<Entry> result;
QDirIterator it = devicesByLabel();
while (it.hasNext()) {
QFileInfo fileInfo = it.nextFileInfo();
quint64 deviceId = retrieveDeviceId(QFile::encodeName(fileInfo.filePath()));
for (const auto &dirEntry : devicesByLabel()) {
quint64 deviceId = retrieveDeviceId(QFile::encodeName(dirEntry.filePath()));
if (!deviceId)
continue;
result.emplaceBack(Entry{ decodeFsEncString(fileInfo.fileName()), deviceId });
result.emplaceBack(Entry{ decodeFsEncString(dirEntry.fileName()), deviceId });
}
return result;
}
@ -153,12 +151,9 @@ static inline QString retrieveLabel(const QStorageInfoPrivate &d, quint64 device
if (!deviceId)
return QString();
QDirIterator it = devicesByLabel();
while (it.hasNext()) {
QFileInfo fileInfo = it.nextFileInfo();
QString name = fileInfo.fileName();
if (retrieveDeviceId(QFile::encodeName(fileInfo.filePath())) == deviceId)
return decodeFsEncString(std::move(name));
for (const auto &dirEntry : devicesByLabel()) {
if (retrieveDeviceId(QFile::encodeName(dirEntry.filePath())) == deviceId)
return decodeFsEncString(dirEntry.fileName());
}
return QString();
}

View File

@ -5,7 +5,6 @@
#include "qstorageinfo_p.h"
#include <QtCore/qdiriterator.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qtextstream.h>

View File

@ -7,7 +7,6 @@
#ifndef QT_NO_TEMPORARYFILE
#include "qdebug.h"
#include "qdiriterator.h"
#include "qplatformdefs.h"
#include "qrandom.h"
#include "private/qtemporaryfile_p.h"

View File

@ -13,7 +13,7 @@
#include "qcbormap.h"
#include "qcborstreamreader.h"
#include "qcborvalue.h"
#include "qdiriterator.h"
#include "qdirlisting.h"
#include "qfileinfo.h"
#include "qjsonarray.h"
#include "qjsondocument.h"
@ -303,7 +303,7 @@ inline void QFactoryLoaderPrivate::updateSinglePath(const QString &path)
qCDebug(lcFactoryLoader) << "checking directory path" << path << "...";
QDirIterator plugins(path,
QDirListing plugins(path,
#if defined(Q_OS_WIN)
QStringList(QStringLiteral("*.dll")),
#elif defined(Q_OS_ANDROID)
@ -311,8 +311,8 @@ inline void QFactoryLoaderPrivate::updateSinglePath(const QString &path)
#endif
QDir::Files);
while (plugins.hasNext()) {
QString fileName = plugins.next();
for (const auto &dirEntry : plugins) {
const QString &fileName = dirEntry.fileName();
#ifdef Q_OS_DARWIN
const bool isDebugPlugin = fileName.endsWith("_debug.dylib"_L1);
const bool isDebugLibrary =
@ -337,7 +337,7 @@ inline void QFactoryLoaderPrivate::updateSinglePath(const QString &path)
Q_TRACE(QFactoryLoader_update, fileName);
QLibraryPrivate::UniquePtr library;
library.reset(QLibraryPrivate::findOrCreate(QFileInfo(fileName).canonicalFilePath()));
library.reset(QLibraryPrivate::findOrCreate(dirEntry.canonicalFilePath()));
if (!library->isPlugin()) {
qCDebug(lcFactoryLoader) << library->errorString << Qt::endl
<< " not a plugin";

View File

@ -10,7 +10,7 @@
#include <QtCore/QDataStream>
#include <QtCore/QDateTime>
#include <QtCore/QDirIterator>
#include <QtCore/QDirListing>
#include <QtCore/QFile>
#include <QtCore/QCache>
#include <QtCore/QMap>
@ -121,9 +121,7 @@ static QTzTimeZoneHash loadTzTimeZones()
const qsizetype cut = path.lastIndexOf(u'/');
Q_ASSERT(cut > 0);
const QDir zoneDir = QDir(path.first(cut));
QDirIterator zoneFiles(zoneDir, QDirIterator::Subdirectories);
while (zoneFiles.hasNext()) {
const QFileInfo info = zoneFiles.nextFileInfo();
for (const auto &info : QDirListing(zoneDir, QDirListing::IteratorFlag::Recursive)) {
if (!(info.isFile() || info.isSymLink()))
continue;
const QString name = zoneDir.relativeFilePath(info.filePath());

View File

@ -4,7 +4,7 @@
#include "qfileinfogatherer_p.h"
#include <qcoreapplication.h>
#include <qdebug.h>
#include <qdiriterator.h>
#include <qdirlisting.h>
#include <private/qabstractfileiconprovider_p.h>
#include <private/qfileinfo_p.h>
#ifndef Q_OS_WIN
@ -419,9 +419,11 @@ void QFileInfoGatherer::getFileInfos(const QString &path, const QStringList &fil
QStringList allFiles;
if (files.isEmpty()) {
QDirIterator dirIt(path, QDir::AllEntries | QDir::System | QDir::Hidden);
while (!isInterruptionRequested() && dirIt.hasNext()) {
fileInfo = dirIt.nextFileInfo();
constexpr auto dirFilters = QDir::AllEntries | QDir::System | QDir::Hidden;
for (const auto &dirEntry : QDirListing(path, dirFilters)) {
if (isInterruptionRequested())
break;
fileInfo = dirEntry.fileInfo();
fileInfo.stat();
allFiles.append(fileInfo.fileName());
fetch(fileInfo, base, firstTime, updatedFiles, path);

View File

@ -9,7 +9,6 @@
#include <QtCore/qpair.h>
#include <QtCore/qdir.h>
#include <QtGui/qicon.h>
#include <QtCore/qdiriterator.h>
QT_REQUIRE_CONFIG(filesystemmodel);

View File

@ -12,7 +12,7 @@
#include <qdir.h>
#include <qdatastream.h>
#include <qdatetime.h>
#include <qdiriterator.h>
#include <qdirlisting.h>
#include <qurl.h>
#include <qcryptographichash.h>
#include <qdebug.h>
@ -478,7 +478,6 @@ qint64 QNetworkDiskCache::expire()
d->lastItem.reset();
const QDir::Filters filters = QDir::AllDirs | QDir:: Files | QDir::NoDotAndDotDot;
QDirIterator it(cacheDirectory(), filters, QDirIterator::Subdirectories);
struct CacheItem
{
@ -488,11 +487,12 @@ qint64 QNetworkDiskCache::expire()
};
std::vector<CacheItem> cacheItems;
qint64 totalSize = 0;
while (it.hasNext()) {
QFileInfo info = it.nextFileInfo();
if (!info.fileName().endsWith(CACHE_POSTFIX))
using F = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(cacheDirectory(), filters, F::Recursive)) {
if (!dirEntry.fileName().endsWith(CACHE_POSTFIX))
continue;
const QFileInfo &info = dirEntry.fileInfo();
QDateTime fileTime = info.birthTime(QTimeZone::UTC);
if (!fileTime.isValid())
fileTime = info.metadataChangeTime(QTimeZone::UTC);

View File

@ -110,7 +110,7 @@
#endif
#include <QtCore/qdir.h>
#include <QtCore/qdiriterator.h>
#include <QtCore/qdirlisting.h>
#include <QtCore/qfile.h>
QT_BEGIN_NAMESPACE
@ -680,9 +680,12 @@ QList<QSslCertificate> QSslCertificate::fromPath(const QString &path,
QRegularExpression pattern(QRegularExpression::anchoredPattern(sourcePath));
#endif
QDirIterator it(pathPrefixString, QDir::Files, QDirIterator::FollowSymlinks | QDirIterator::Subdirectories);
while (it.hasNext()) {
QString filePath = startIndex == 0 ? it.next() : it.next().mid(startIndex);
using F = QDirListing::IteratorFlag;
constexpr auto iterFlags = F::FollowSymlinks | F::Recursive;
for (const auto &dirEntry : QDirListing(pathPrefixString, QDir::Files, iterFlags)) {
QString filePath = dirEntry.filePath();
if (startIndex > 0)
filePath.remove(0, startIndex);
#if QT_CONFIG(regularexpression)
if (!pattern.match(filePath).hasMatch())

View File

@ -17,7 +17,7 @@
#include <QtNetwork/qssl.h>
#include <QtCore/qdir.h>
#include <QtCore/qdiriterator.h>
#include <QtCore/qdirlisting.h>
#include <QtCore/qlist.h>
#include <QtCore/qmutex.h>
#include <QtCore/qscopeguard.h>
@ -204,11 +204,11 @@ void QTlsBackendOpenSSL::ensureCiphersAndCertsLoaded() const
#elif defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
// check whether we can enable on-demand root-cert loading (i.e. check whether the sym links are there)
const QList<QByteArray> dirs = QSslSocketPrivate::unixRootCertDirectories();
QStringList symLinkFilter;
symLinkFilter << "[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].[0-9]"_L1;
const QStringList symLinkFilter{
u"[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].[0-9]"_s};
for (const auto &dir : dirs) {
QDirIterator iterator(QLatin1StringView(dir), symLinkFilter, QDir::Files);
if (iterator.hasNext()) {
QDirListing dirList(QString::fromLatin1(dir), symLinkFilter, QDir::Files);
if (dirList.cbegin() != dirList.cend()) { // Not empty
QSslSocketPrivate::setRootCertOnDemandLoadingSupported(true);
break;
}
@ -394,10 +394,9 @@ QList<QSslCertificate> systemCaCertificates()
currentDir.setNameFilters(QStringList{QStringLiteral("*.pem"), QStringLiteral("*.crt")});
for (const auto &directory : directories) {
currentDir.setPath(QLatin1StringView(directory));
QDirIterator it(currentDir);
while (it.hasNext()) {
for (const auto &dirEntry : QDirListing(currentDir)) {
// use canonical path here to not load the same certificate twice if symlinked
certFiles.insert(it.nextFileInfo().canonicalFilePath());
certFiles.insert(dirEntry.canonicalFilePath());
}
}
for (const QString& file : std::as_const(certFiles))

View File

@ -10,7 +10,7 @@
#include <QtCore/qcoreapplication.h>
#include <QtCore/qdebug.h>
#include <QtCore/qdir.h>
#include <QtCore/qdiriterator.h>
#include <QtCore/qdirlisting.h>
#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qfloat16.h>
@ -3010,22 +3010,18 @@ QSharedPointer<QTemporaryDir> QTest::qExtractTestData(const QString &dirName)
return result;
}
QDirIterator it(resourcePath, QDirIterator::Subdirectories);
if (!it.hasNext()) {
qWarning("Resource directory '%s' is empty.", qPrintable(resourcePath));
return result;
}
while (it.hasNext()) {
QFileInfo fileInfo = it.nextFileInfo();
if (!fileInfo.isDir()) {
const QString destination = dataPath + u'/' + QStringView{fileInfo.filePath()}.mid(resourcePath.size());
bool isResourceDirEmpty = true;
for (const auto &dirEntry : QDirListing(resourcePath, QDirListing::IteratorFlag::Recursive)) {
isResourceDirEmpty = false;
if (!dirEntry.isDir()) {
const QString &filePath = dirEntry.filePath();
const QString destination =
dataPath + u'/' + QStringView{filePath}.sliced(resourcePath.size());
QFileInfo destinationFileInfo(destination);
QDir().mkpath(destinationFileInfo.path());
QFile file(fileInfo.filePath());
QFile file(filePath);
if (!file.copy(destination)) {
qWarning("Failed to copy '%ls': %ls.", qUtf16Printable(fileInfo.filePath()),
qWarning("Failed to copy '%ls': %ls.", qUtf16Printable(filePath),
qUtf16Printable(file.errorString()));
return result;
}
@ -3039,6 +3035,11 @@ QSharedPointer<QTemporaryDir> QTest::qExtractTestData(const QString &dirName)
}
}
if (isResourceDirEmpty) {
qWarning("Resource directory '%s' is empty.", qPrintable(resourcePath));
return result;
}
result = std::move(tempDir);
return result;

View File

@ -13,7 +13,7 @@
#include <QXmlStreamReader>
#include <QStandardPaths>
#include <QUuid>
#include <QDirIterator>
#include <QDirListing>
#include <QElapsedTimer>
#include <QRegularExpression>
#include <QSettings>
@ -1222,6 +1222,7 @@ bool readInputFile(Options *options)
}
{
using ItFlag = QDirListing::IteratorFlag;
const QJsonValue deploymentDependencies = jsonObject.value("deployment-dependencies"_L1);
if (!deploymentDependencies.isUndefined()) {
QString deploymentDependenciesString = deploymentDependencies.toString();
@ -1230,11 +1231,9 @@ bool readInputFile(Options *options)
QString path = options->qtInstallDirectory + QChar::fromLatin1('/');
path += dependency;
if (QFileInfo(path).isDir()) {
QDirIterator iterator(path, QDirIterator::Subdirectories);
while (iterator.hasNext()) {
iterator.next();
if (iterator.fileInfo().isFile()) {
QString subPath = iterator.filePath();
for (const auto &dirEntry : QDirListing(path, ItFlag::Recursive)) {
if (dirEntry.isFile()) {
const QString subPath = dirEntry.filePath();
auto arch = fileArchitecture(*options, subPath);
if (!arch.isEmpty()) {
options->qtDependencies[arch].append(QtDependency(subPath.mid(options->qtInstallDirectory.size() + 1),
@ -2724,12 +2723,11 @@ static bool mergeGradleProperties(const QString &path, GradleProperties properti
void checkAndWarnGradleLongPaths(const QString &outputDirectory)
{
QStringList longFileNames;
QDirIterator it(outputDirectory, QStringList(QStringLiteral("*.java")), QDir::Files,
QDirIterator::Subdirectories);
while (it.hasNext()) {
const QString &filePath = it.next();
if (filePath.size() >= MAX_PATH)
longFileNames.append(filePath);
using F = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(outputDirectory, QStringList(u"*.java"_s),
QDir::Files, F::Recursive)) {
if (dirEntry.size() >= MAX_PATH)
longFileNames.append(dirEntry.filePath());
}
if (!longFileNames.isEmpty()) {

View File

@ -27,7 +27,7 @@ qt_internal_extend_target(Bootstrap
../../corelib/io/qbuffer.cpp
../../corelib/io/qdebug.cpp
../../corelib/io/qdir.cpp
../../corelib/io/qdiriterator.cpp
../../corelib/io/qdirlisting.cpp
../../corelib/io/qfile.cpp
../../corelib/io/qfiledevice.cpp
../../corelib/io/qfileinfo.cpp

View File

@ -8,7 +8,7 @@
#include <qdatetime.h>
#include <qdebug.h>
#include <qdir.h>
#include <qdiriterator.h>
#include <qdirlisting.h>
#include <qfile.h>
#include <qiodevice.h>
#include <qlocale.h>
@ -634,12 +634,12 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice,
alias += slash;
QStringList filePaths;
QDirIterator it(dir, QDirIterator::FollowSymlinks|QDirIterator::Subdirectories);
while (it.hasNext()) {
it.next();
if (it.fileName() == "."_L1 || it.fileName() == ".."_L1)
using F = QDirListing::IteratorFlag;
for (const auto &entry : QDirListing(dir, F::FollowSymlinks | F::Recursive)) {
const QString &fileName = entry.fileName();
if (fileName == "."_L1 || fileName == ".."_L1)
continue;
filePaths.append(it.filePath());
filePaths.emplace_back(entry.filePath());
}
// make rcc output deterministic

View File

@ -4,7 +4,7 @@
#include "qtmoduleinfo.h"
#include "utils.h"
#include <QDirIterator>
#include <QDirListing>
#include <QJsonDocument>
#include <QJsonArray>
#include <QDebug>
@ -134,10 +134,8 @@ bool QtModuleInfoStore::populate(const QString &modulesDir, const QString &trans
}
// Read modules, and assign a bit as ID.
QDirIterator dit(modulesDir, { QLatin1String("*.json") }, QDir::Files);
while (dit.hasNext()) {
QString filePath = dit.next();
QtModule module = moduleFromJsonFile(filePath, errorString);
for (const auto &dirEntry : QDirListing(modulesDir, {u"*.json"_s}, QDir::Files)) {
QtModule module = moduleFromJsonFile(dirEntry.filePath(), errorString);
if (!errorString->isEmpty())
return false;
if (module.internal && module.name.endsWith(QStringLiteral("Private")))