aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/environment.cpp39
-rw-r--r--src/libs/utils/environment.h3
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;