aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/filepath.cpp23
-rw-r--r--src/libs/utils/filepath.h25
-rw-r--r--src/libs/utils/fileutils.cpp94
-rw-r--r--src/libs/utils/fileutils.h13
-rw-r--r--src/plugins/docker/dockerdevice.cpp13
-rw-r--r--src/plugins/docker/dockerdevice.h10
-rw-r--r--src/plugins/projectexplorer/devicesupport/desktopdevice.cpp7
-rw-r--r--src/plugins/projectexplorer/devicesupport/desktopdevice.h7
-rw-r--r--src/plugins/projectexplorer/devicesupport/devicemanager.cpp8
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.cpp9
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.h11
-rw-r--r--src/plugins/remotelinux/linuxdevice.cpp9
-rw-r--r--src/plugins/remotelinux/linuxdevice.h3
-rw-r--r--tests/auto/utils/fsengine/tst_fsengine.cpp20
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 &current,
@@ -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,