From 5da5116cb1a7995550b7c347866dcfd9d8976ae0 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 9 Jul 2019 09:02:02 +0200 Subject: Utils: Add path search function to environment In contrast to Environment::searchInPath This function returns _all_ executables found in the path variable. Change-Id: Ic62b8f70d0690ff9a3261db3ead2c919a2486c89 Reviewed-by: Christian Stenger --- src/libs/utils/environment.cpp | 39 +++++++++++++++++++++++++++++++++++++++ src/libs/utils/environment.h | 3 +++ 2 files changed, 42 insertions(+) (limited to 'src/libs') diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 1d8498ef0d..cee6713254 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -273,6 +273,45 @@ FilePath Environment::searchInPath(const QString &executable, return FilePath(); } +FilePathList Environment::findAllInPath(const QString &executable, + const FilePathList &additionalDirs, + const Environment::PathFilter &func) const +{ + if (executable.isEmpty()) + return {}; + + const QString exec = QDir::cleanPath(expandVariables(executable)); + const QFileInfo fi(exec); + + const QStringList execs = appendExeExtensions(exec); + + if (fi.isAbsolute()) { + for (const QString &path : execs) { + QFileInfo pfi = QFileInfo(path); + if (pfi.isFile() && pfi.isExecutable()) + return {FilePath::fromString(path)}; + } + return {FilePath::fromString(exec)}; + } + + QSet result; + QSet alreadyChecked; + for (const FilePath &dir : additionalDirs) { + FilePath tmp = searchInDirectory(execs, dir, alreadyChecked); + if (!tmp.isEmpty() && (!func || func(tmp))) + result << tmp; + } + + if (!executable.contains('/')) { + for (const FilePath &p : path()) { + FilePath tmp = searchInDirectory(execs, p, alreadyChecked); + if (!tmp.isEmpty() && (!func || func(tmp))) + result << tmp; + } + } + return result.values(); +} + FilePathList Environment::path() const { return pathListValue("PATH"); diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index 73c883268e..a233435c4a 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -66,6 +66,9 @@ public: FilePath searchInPath(const QString &executable, const FilePathList &additionalDirs = FilePathList(), const PathFilter &func = PathFilter()) const; + FilePathList findAllInPath(const QString &executable, + const FilePathList &additionalDirs = FilePathList(), + const PathFilter &func = PathFilter()) const; FilePathList path() const; FilePathList pathListValue(const QString &varName) const; -- cgit v1.2.3