diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index db178852676..2d3d6edf3b4 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -136,8 +136,10 @@ void Environment::setupEnglishOutput() set("LANGUAGE", "en_US:en"); } -FilePath Environment::searchInDirectory(const QStringList &execs, const FilePath &directory, - QSet &alreadyChecked) +static FilePath searchInDirectory(const Environment &env, + const QStringList &execs, + const FilePath &directory, + QSet &alreadyChecked) { const int checkedCount = alreadyChecked.count(); alreadyChecked.insert(directory); @@ -199,17 +201,19 @@ QString Environment::expandedValueForKey(const QString &key) const return expandVariables(value(key)); } -FilePath Environment::searchInPath(const QString &executable, - const FilePaths &additionalDirs, - const PathFilter &func) const +static FilePath searchInDirectoriesHelper(const Environment &env, + const QString &executable, + const FilePaths &dirs, + const Environment::PathFilter &func, + bool usePath) { if (executable.isEmpty()) return FilePath(); - const QString exec = QDir::cleanPath(expandVariables(executable)); + const QString exec = QDir::cleanPath(env.expandVariables(executable)); const QFileInfo fi(exec); - const QStringList execs = appendExeExtensions(exec); + const QStringList execs = env.appendExeExtensions(exec); if (fi.isAbsolute()) { for (const QString &path : execs) { @@ -221,23 +225,38 @@ FilePath Environment::searchInPath(const QString &executable, } QSet alreadyChecked; - for (const FilePath &dir : additionalDirs) { - FilePath tmp = searchInDirectory(execs, dir, alreadyChecked); + for (const FilePath &dir : dirs) { + FilePath tmp = searchInDirectory(env, execs, dir, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) return tmp; } - if (executable.contains('/')) - return FilePath(); + if (usePath) { + if (executable.contains('/')) + return FilePath(); - for (const FilePath &p : path()) { - FilePath tmp = searchInDirectory(execs, p, alreadyChecked); - if (!tmp.isEmpty() && (!func || func(tmp))) - return tmp; + for (const FilePath &p : env.path()) { + FilePath tmp = searchInDirectory(env, execs, p, alreadyChecked); + if (!tmp.isEmpty() && (!func || func(tmp))) + return tmp; + } } return FilePath(); } +FilePath Environment::searchInDirectories(const QString &executable, + const FilePaths &dirs) const +{ + return searchInDirectoriesHelper(*this, executable, dirs, {}, false); +} + +FilePath Environment::searchInPath(const QString &executable, + const FilePaths &additionalDirs, + const PathFilter &func) const +{ + return searchInDirectoriesHelper(*this, executable, additionalDirs, func, true); +} + FilePaths Environment::findAllInPath(const QString &executable, const FilePaths &additionalDirs, const Environment::PathFilter &func) const @@ -262,14 +281,14 @@ FilePaths Environment::findAllInPath(const QString &executable, QSet result; QSet alreadyChecked; for (const FilePath &dir : additionalDirs) { - FilePath tmp = searchInDirectory(execs, dir, alreadyChecked); + FilePath tmp = searchInDirectory(*this, 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); + FilePath tmp = searchInDirectory(*this, execs, p, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) result << tmp; } diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index c20ed67f7df..9cfa64faba4 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -63,6 +63,8 @@ public: FilePath searchInPath(const QString &executable, const FilePaths &additionalDirs = FilePaths(), const PathFilter &func = PathFilter()) const; + FilePath searchInDirectories(const QString &executable, + const FilePaths &dirs) const; FilePaths findAllInPath(const QString &executable, const FilePaths &additionalDirs = FilePaths(), const PathFilter &func = PathFilter()) const; @@ -80,10 +82,6 @@ public: static void modifySystemEnvironment(const EnvironmentItems &list); // use with care!!! static void setSystemEnvironment(const Environment &environment); // don't use at all!!! - -private: - static FilePath searchInDirectory(const QStringList &execs, const FilePath &directory, - QSet &alreadyChecked); }; class QTCREATOR_UTILS_EXPORT EnvironmentChange final diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 3602a6c304f..fd68683acee 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -1208,7 +1208,7 @@ FilePath FilePath::searchInDirectories(const FilePaths &dirs) const QTC_ASSERT(s_deviceHooks.searchInPath, return {}); return s_deviceHooks.searchInPath(*this, dirs); } - return Environment::systemEnvironment().searchInPath(path(), dirs); + return Environment::systemEnvironment().searchInDirectories(path(), dirs); } FilePath FilePath::searchInPath(const QList &additionalDirs) const