From d74c5301ff91a9b058edaa89e0f5d95ecd288426 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 11 Oct 2022 13:09:15 +0200 Subject: [PATCH] Linuxdevice: Add FilePathInfo functions ::filePathInfo and iterateDirectory(..., IterateDirWithInfoCallback, ...) allow for faster info retrieval by the fsengine, making the listing of large directories like /bin a lot faster. Change-Id: I2a21e019e05f5bb08459483747ba2be4530929f4 Reviewed-by: hjk --- src/plugins/remotelinux/linuxdevice.cpp | 18 +++++++++++++++++- src/plugins/remotelinux/linuxdevice.h | 6 +++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 2d2d8684d69..60959d99291 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -1288,7 +1288,7 @@ bool LinuxDevice::setPermissions(const FilePath &filePath, QFileDevice::Permissi } void LinuxDevice::iterateDirectory(const FilePath &filePath, - const std::function &callBack, + const FilePath::IterateDirCallback &callBack, const FileFilter &filter) const { QTC_ASSERT(handlesFile(filePath), return); @@ -1296,6 +1296,22 @@ void LinuxDevice::iterateDirectory(const FilePath &filePath, FileUtils::iterateUnixDirectory(filePath, filter, &d->m_useFind, runInShell, callBack); } +void LinuxDevice::iterateDirectory(const FilePath &filePath, + const FilePath::IterateDirWithInfoCallback &callBack, + const FileFilter &filter) const +{ + QTC_ASSERT(handlesFile(filePath), return); + auto runInShell = [this](const CommandLine &cmd) { return d->runInShell(cmd); }; + FileUtils::iterateUnixDirectory(filePath, filter, &d->m_useFind, runInShell, callBack); +} + +FilePathInfo LinuxDevice::filePathInfo(const FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return {}); + const RunResult stat = d->runInShell({"stat", {"-L", "-c", "%f %Y %s", filePath.path()}}); + return FileUtils::filePathInfoFromTriple(QString::fromLatin1(stat.stdOut)); +} + std::optional LinuxDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index 1cecc12f2e7..2e9aeee3616 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -53,7 +53,10 @@ public: bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; void iterateDirectory(const Utils::FilePath &filePath, - const std::function &callBack, + const Utils::FilePath::IterateDirCallback &callBack, + const Utils::FileFilter &filter) const override; + void iterateDirectory(const Utils::FilePath &filePath, + const Utils::FilePath::IterateDirWithInfoCallback &callBack, const Utils::FileFilter &filter) const override; std::optional fileContents(const Utils::FilePath &filePath, qint64 limit, @@ -61,6 +64,7 @@ public: bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data, qint64 offset) const override; + Utils::FilePathInfo filePathInfo(const Utils::FilePath &filePath) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override; Utils::ProcessInterface *createProcessInterface() const override; ProjectExplorer::FileTransferInterface *createFileTransferInterface(