From 63faccdb7c62327ae80df852ac9e8504a137e810 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 7 Oct 2022 17:25:44 +0200 Subject: [PATCH] Utils: Implement ls-based subdir iteration Needed when 'find' does not work as expected. Change-Id: Ifbe762590ad2a6339152ed728e4d72820b4eae91 Reviewed-by: Marcus Tillmanns Reviewed-by: hjk --- src/libs/utils/fileutils.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index ae83517440b..b4b952166fd 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -648,6 +648,24 @@ static bool iterateWithFind(const FilePath &filePath, return true; } +static void findUsingLs(const QString ¤t, + const FileFilter &filter, + const std::function &runInShell, + QStringList *found) +{ + const RunResult result = runInShell({"ls", {"-1", "-p", "--", current}}); + const QStringList entries = QString::fromUtf8(result.stdOut).split('\n', Qt::SkipEmptyParts); + for (QString entry : entries) { + const QChar last = entry.back(); + if (last == '/') { + entry.chop(1); + if (filter.iteratorFlags.testFlag(QDirIterator::Subdirectories)) + findUsingLs(current + '/' + entry, filter, runInShell, found); + } + found->append(entry); + } +} + void FileUtils::iterateUnixDirectory(const FilePath &filePath, const FileFilter &filter, bool *useFind, @@ -665,9 +683,8 @@ void FileUtils::iterateUnixDirectory(const FilePath &filePath, } // if we do not have find - use ls as fallback - // FIXME: Recursion into subdirectories not implemented! - const RunResult result = runInShell({"ls", {"-1", "-b", "--", filePath.path()}}); - const QStringList entries = QString::fromUtf8(result.stdOut).split('\n', Qt::SkipEmptyParts); + QStringList entries; + findUsingLs(filePath.path(), filter, runInShell, &entries); FileUtils::iterateLsOutput(filePath, entries, filter, callBack); }