diff options
author | David Schulz <david.schulz@qt.io> | 2019-07-09 09:02:02 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2019-07-15 13:01:25 +0000 |
commit | 5da5116cb1a7995550b7c347866dcfd9d8976ae0 (patch) | |
tree | eb88f4b02648e7bc1e6824be756f4ea3d42e3c8c /src/libs | |
parent | b4708181c77656fc41cac17cfdd9c716e6e19a41 (diff) |
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 <christian.stenger@qt.io>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/utils/environment.cpp | 39 | ||||
-rw-r--r-- | src/libs/utils/environment.h | 3 |
2 files changed, 42 insertions, 0 deletions
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<FilePath> result; + QSet<FilePath> 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; |