diff options
-rw-r--r-- | src/libs/utils/filepath.cpp | 23 | ||||
-rw-r--r-- | src/libs/utils/filepath.h | 25 | ||||
-rw-r--r-- | src/libs/utils/fileutils.cpp | 94 | ||||
-rw-r--r-- | src/libs/utils/fileutils.h | 13 | ||||
-rw-r--r-- | src/plugins/docker/dockerdevice.cpp | 13 | ||||
-rw-r--r-- | src/plugins/docker/dockerdevice.h | 10 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/desktopdevice.cpp | 7 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/desktopdevice.h | 7 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/devicemanager.cpp | 8 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/idevice.cpp | 9 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/idevice.h | 11 | ||||
-rw-r--r-- | src/plugins/remotelinux/linuxdevice.cpp | 9 | ||||
-rw-r--r-- | src/plugins/remotelinux/linuxdevice.h | 3 | ||||
-rw-r--r-- | tests/auto/utils/fsengine/tst_fsengine.cpp | 20 |
14 files changed, 83 insertions, 169 deletions
diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 73b414cbac5..22d4d9b42cc 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -523,24 +523,13 @@ void FilePath::iterateDirectory(const IterateDirCallback &callBack, const FileFi QDirIterator it(path(), filter.nameFilters, filter.fileFilters, filter.iteratorFlags); while (it.hasNext()) { - if (!callBack(FilePath::fromString(it.next()))) - return; - } -} - -void FilePath::iterateDirectory(const IterateDirWithInfoCallback &callBack, - const FileFilter &filter) const -{ - if (needsDevice()) { - QTC_ASSERT(s_deviceHooks.iterateDirectoryWithInfo, return); - s_deviceHooks.iterateDirectoryWithInfo(*this, callBack, filter); - return; - } - - QDirIterator it(path(), filter.nameFilters, filter.fileFilters, filter.iteratorFlags); - while (it.hasNext()) { const FilePath path = FilePath::fromString(it.next()); - if (!callBack(path, path.filePathInfo())) + bool res = false; + if (callBack.index() == 0) + res = std::get<0>(callBack)(path); + else + res = std::get<1>(callBack)(path, path.filePathInfo()); + if (!res) return; } } diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index f03d89d4d8b..055e0f135fb 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -154,17 +154,20 @@ public: [[nodiscard]] FilePath onDevice(const FilePath &deviceTemplate) const; [[nodiscard]] FilePath withNewPath(const QString &newPath) const; - using IterateDirCallback = std::function<bool(const FilePath &item)>; - using IterateDirWithInfoCallback - = std::function<bool(const FilePath &item, const FilePathInfo &info)>; + using IterateDirCallback + = std::variant< + std::function<bool(const FilePath &item)>, + std::function<bool(const FilePath &item, const FilePathInfo &info)> + >; - void iterateDirectory(const IterateDirCallback &callBack, const FileFilter &filter) const; - void iterateDirectory(const IterateDirWithInfoCallback &callBack, - const FileFilter &filter) const; + void iterateDirectory( + const IterateDirCallback &callBack, + const FileFilter &filter) const; - static void iterateDirectories(const FilePaths &dirs, - const IterateDirCallback &callBack, - const FileFilter &filter); + static void iterateDirectories( + const FilePaths &dirs, + const IterateDirCallback &callBack, + const FileFilter &filter); enum PathAmending { AppendToPath, PrependToPath }; [[nodiscard]] FilePath searchInPath(const FilePaths &additionalDirs = {}, @@ -270,10 +273,6 @@ public: const FilePath::IterateDirCallback &, // Abort on 'false' return. const FileFilter &)> iterateDirectory; - std::function<void(const FilePath &, - const FilePath::IterateDirWithInfoCallback &, // Abort on 'false' return. - const FileFilter &)> - iterateDirectoryWithInfo; std::function<std::optional<QByteArray>(const FilePath &, qint64, qint64)> fileContents; std::function<bool(const FilePath &, const QByteArray &, qint64)> writeFileContents; std::function<QDateTime(const FilePath &)> lastModified; diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index cb893ff4a46..f5ccc9db43c 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -587,10 +587,10 @@ FilePath FileUtils::getOpenFilePathFromDevice(QWidget *parent, #endif // QT_WIDGETS_LIB // Used on 'ls' output on unix-like systems. -void FileUtils::iterateLsOutput(const FilePath &base, - const QStringList &entries, - const FileFilter &filter, - const std::function<bool (const FilePath &)> &callBack) +static void iterateLsOutput(const FilePath &base, + const QStringList &entries, + const FileFilter &filter, + const FilePath::IterateDirCallback &callBack) { const QList<QRegularExpression> nameRegexps = transform(filter.nameFilters, [](const QString &filter) { @@ -615,7 +615,13 @@ void FileUtils::iterateLsOutput(const FilePath &base, for (const QString &entry : entries) { if (!nameMatches(entry)) continue; - if (!callBack(base.pathAppended(entry))) + const FilePath current = base.pathAppended(entry); + bool res = false; + if (callBack.index() == 0) + res = std::get<0>(callBack)(current); + else + res = std::get<1>(callBack)(current, current.filePathInfo()); + if (!res) break; } } @@ -675,11 +681,12 @@ FilePathInfo FileUtils::filePathInfoFromTriple(const QString &infos) return {size, flags, dt}; } -bool iterateWithFind(const FilePath &filePath, - const FileFilter &filter, - const std::function<RunResult(const CommandLine &)> &runInShell, - const std::function<bool(const QString &)> callBack, - const QString &extraArguments) +static bool iterateWithFindHelper( + const FilePath &filePath, + const FileFilter &filter, + const std::function<RunResult(const CommandLine &)> &runInShell, + const std::function<bool(const QString &)> callBack, + const QString &extraArguments) { QTC_CHECK(filePath.isAbsolutePath()); const QStringList arguments = filter.asFindArguments(filePath.path()); @@ -716,29 +723,16 @@ bool iterateWithFind(const FilePath &filePath, } // returns whether 'find' could be used. -static bool iterateWithFind(const FilePath &filePath, - const FileFilter &filter, - const std::function<RunResult(const CommandLine &)> &runInShell, - const FilePath::IterateDirCallback &callBack) -{ - const auto toFilePath = [&filePath, &callBack](const QString &entry){ - return callBack(filePath.withNewPath(entry)); - }; - - return iterateWithFind(filePath, filter, runInShell, toFilePath, {}); -} - -// returns whether 'find' could be used. -static bool iterateWithFind(const FilePath &filePath, - const FileFilter &filter, - const std::function<RunResult(const CommandLine &)> &runInShell, - const FilePath::IterateDirWithInfoCallback &callBack) +static bool iterateWithFind( + const FilePath &filePath, + const FileFilter &filter, + const std::function<RunResult(const CommandLine &)> &runInShell, + const FilePath::IterateDirCallback &callBack) { - // TODO: Using stat -L will always return the link target, not the link itself. - // We may wan't to add the information that it is a link at some point. - const QString infoArgs(R"(-exec echo -n \"{}\"" " \; -exec stat -L -c "%f %Y %s" "{}" \;)"); + const auto toFilePath = [&filePath, &callBack](const QString &entry) { + if (callBack.index() == 0) + return std::get<0>(callBack)(filePath.withNewPath(entry)); - const auto toFilePathAndInfo = [&filePath, &callBack](const QString &entry) { const QString fileName = entry.mid(1, entry.lastIndexOf('\"') - 1); const QString infos = entry.mid(fileName.length() + 3); @@ -747,10 +741,16 @@ static bool iterateWithFind(const FilePath &filePath, return true; const FilePath fp = filePath.withNewPath(fileName); - return callBack(fp, fi); + return std::get<1>(callBack)(fp, fi); }; - return iterateWithFind(filePath, filter, runInShell, toFilePathAndInfo, infoArgs); + // TODO: Using stat -L will always return the link target, not the link itself. + // We may wan't to add the information that it is a link at some point. + QString infoArgs; + if (callBack.index() == 1) + infoArgs = R"(-exec echo -n \"{}\"" " \; -exec stat -L -c "%f %Y %s" "{}" \;)"; + + return iterateWithFindHelper(filePath, filter, runInShell, toFilePath, infoArgs); } static void findUsingLs(const QString ¤t, @@ -777,30 +777,6 @@ void FileUtils::iterateUnixDirectory(const FilePath &filePath, const std::function<RunResult (const CommandLine &)> &runInShell, const FilePath::IterateDirCallback &callBack) { - QTC_ASSERT(callBack, return); - - // We try to use 'find' first, because that can filter better directly. - // Unfortunately, it's not installed on all devices by default. - if (useFind && *useFind) { - if (iterateWithFind(filePath, filter, runInShell, callBack)) - return; - *useFind = false; // remember the failure for the next time and use the 'ls' fallback below. - } - - // if we do not have find - use ls as fallback - QStringList entries; - findUsingLs(filePath.path(), filter, runInShell, &entries); - FileUtils::iterateLsOutput(filePath, entries, filter, callBack); -} - -void FileUtils::iterateUnixDirectory(const FilePath &filePath, - const FileFilter &filter, - bool *useFind, - const std::function<RunResult(const CommandLine &)> &runInShell, - const FilePath::IterateDirWithInfoCallback &callBack) -{ - QTC_ASSERT(callBack, return); - // We try to use 'find' first, because that can filter better directly. // Unfortunately, it's not installed on all devices by default. if (useFind && *useFind) { @@ -812,9 +788,7 @@ void FileUtils::iterateUnixDirectory(const FilePath &filePath, // if we do not have find - use ls as fallback QStringList entries; findUsingLs(filePath.path(), filter, runInShell, &entries); - FileUtils::iterateLsOutput(filePath, entries, filter, [&callBack](const FilePath & filePath){ - return callBack(filePath, filePath.filePathInfo()); - }); + iterateLsOutput(filePath, entries, filter, callBack); } /*! diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index fe3a388bb0b..5f6452b3650 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -86,12 +86,6 @@ public: static FilePaths toFilePathList(const QStringList &paths); - static void iterateLsOutput( - const FilePath &base, - const QStringList &entries, - const FileFilter &filter, - const std::function<bool(const FilePath &)> &callBack); - static void iterateUnixDirectory( const FilePath &base, const FileFilter &filter, @@ -99,13 +93,6 @@ public: const std::function<RunResult(const CommandLine &)> &runInShell, const FilePath::IterateDirCallback &callBack); - static void iterateUnixDirectory( - const FilePath &base, - const FileFilter &filter, - bool *useFind, - const std::function<RunResult(const CommandLine &)> &runInShell, - const FilePath::IterateDirWithInfoCallback &callBack); - static qint64 bytesAvailableFromDFOutput(const QByteArray &dfOutput); static FilePathInfo filePathInfoFromTriple(const QString &infos); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 87815a7b3fd..bcab94bcb8b 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -948,17 +948,8 @@ bool DockerDevice::ensureReachable(const FilePath &other) const } void DockerDevice::iterateDirectory(const FilePath &filePath, - const FilePath::IterateDirCallback &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); -} - -void DockerDevice::iterateDirectory(const FilePath &filePath, - const FilePath::IterateDirWithInfoCallback &callBack, - const FileFilter &filter) const + const FilePath::IterateDirCallback &callBack, + const FileFilter &filter) const { QTC_ASSERT(handlesFile(filePath), return); auto runInShell = [this](const CommandLine &cmd) { return d->runInShell(cmd); }; diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 8398ee4e235..1382dc7d7b6 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -99,12 +99,10 @@ public: bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override; 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 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; + void iterateDirectory( + const Utils::FilePath &filePath, + const Utils::FilePath::IterateDirCallback &callBack, + const Utils::FileFilter &filter) const override; std::optional<QByteArray> fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index 105e80e34f1..ee5dae12e09 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -136,9 +136,10 @@ bool DesktopDevice::handlesFile(const FilePath &filePath) const return !filePath.needsDevice(); } -void DesktopDevice::iterateDirectory(const FilePath &filePath, - const std::function<bool(const FilePath &)> &callBack, - const FileFilter &filter) const +void DesktopDevice::iterateDirectory( + const FilePath &filePath, + const FilePath::IterateDirCallback &callBack, + const FileFilter &filter) const { QTC_CHECK(!filePath.needsDevice()); filePath.iterateDirectory(callBack, filter); diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.h b/src/plugins/projectexplorer/devicesupport/desktopdevice.h index a2a17237ac3..d0d89f7458c 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.h +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.h @@ -50,9 +50,10 @@ public: bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; - void iterateDirectory(const Utils::FilePath &filePath, - const std::function<bool(const Utils::FilePath &)> &callBack, - const Utils::FileFilter &filter) const override; + void iterateDirectory( + const Utils::FilePath &filePath, + const Utils::FilePath::IterateDirCallback &callBack, + const Utils::FileFilter &filter) const override; std::optional<QByteArray> fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index c5a7f4e8102..8a98a11b292 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -528,14 +528,6 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager device->iterateDirectory(filePath, callBack, filter); }; - deviceHooks.iterateDirectoryWithInfo = [](const FilePath &filePath, - const FilePath::IterateDirWithInfoCallback &callBack, - const FileFilter &filter) { - auto device = DeviceManager::deviceForPath(filePath); - QTC_ASSERT(device, return ); - device->iterateDirectory(filePath, callBack, filter); - }; - deviceHooks.fileContents = [](const FilePath &filePath, qint64 maxSize, qint64 offset) -> std::optional<QByteArray> { auto device = DeviceManager::deviceForPath(filePath); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 294be9f18a0..ed6dcc73824 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -365,15 +365,6 @@ void IDevice::iterateDirectory(const FilePath &filePath, QTC_CHECK(false); } -void IDevice::iterateDirectory(const FilePath &filePath, - const FilePath::IterateDirWithInfoCallback &callBack, - const FileFilter &filter) const -{ - iterateDirectory(filePath, [callBack](const FilePath &path) { - return callBack(path, path.filePathInfo()); - }, filter); -} - std::optional<QByteArray> IDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 57f2ba0a3c7..ac46ff77f47 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -237,13 +237,10 @@ public: virtual Utils::FilePath searchExecutable(const QString &fileName, const Utils::FilePaths &dirs) const; virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const; - virtual void iterateDirectory(const Utils::FilePath &filePath, - const Utils::FilePath::IterateDirCallback &callBack, - const Utils::FileFilter &filter) const; - - virtual void iterateDirectory(const Utils::FilePath &filePath, - const Utils::FilePath::IterateDirWithInfoCallback &callBack, - const Utils::FileFilter &filter) const; + virtual void iterateDirectory( + const Utils::FilePath &filePath, + const Utils::FilePath::IterateDirCallback &callBack, + const Utils::FileFilter &filter) const; virtual std::optional<QByteArray> fileContents(const Utils::FilePath &filePath, qint64 limit, diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 60959d99291..f9018e04e78 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -1296,15 +1296,6 @@ 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 {}); diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index 2e9aeee3616..b1e992c024a 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -55,9 +55,6 @@ public: void iterateDirectory(const Utils::FilePath &filePath, 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<QByteArray> fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; diff --git a/tests/auto/utils/fsengine/tst_fsengine.cpp b/tests/auto/utils/fsengine/tst_fsengine.cpp index 09cbe4ac0ec..d431011d47e 100644 --- a/tests/auto/utils/fsengine/tst_fsengine.cpp +++ b/tests/auto/utils/fsengine/tst_fsengine.cpp @@ -117,16 +117,22 @@ void tst_fsengine::initTestCase() return FilePath::fromString(filePath.path()).symLinkTarget(); }; deviceHooks.iterateDirectory = [](const FilePath &filePath, - const std::function<bool(const FilePath &)> &callBack, + const FilePath::IterateDirCallback &callBack, const FileFilter &filter) { - return FilePath::fromString(filePath.path()) - .iterateDirectory( - [&filePath, &callBack](const FilePath &path) -> bool { - const FilePath devicePath = path.onDevice(filePath); - - return callBack(devicePath); + const FilePath fp = FilePath::fromString(filePath.path()); + if (callBack.index() == 0) { + fp.iterateDirectory( + [&filePath, cb = std::get<0>(callBack)](const FilePath &path) { + return cb(path.onDevice(filePath)); + }, + filter); + } else { + fp.iterateDirectory( + [&filePath, cb = std::get<1>(callBack)](const FilePath &path, const FilePathInfo &fpi) { + return cb(path.onDevice(filePath), fpi); }, filter); + } }; deviceHooks.asyncFileContents = [](const Continuation<const std::optional<QByteArray> &> &cont, const FilePath &filePath, |