diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 97650cb2bbdd9df805f1684780fb6fd783c6755e..f639970b189dca4ba57d93fa8f854b6f9d722b61 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -228,59 +228,60 @@ void Environment::clear() m_values.clear(); } +QString Environment::searchInDirectory(const QStringList &execs, QString directory) const +{ + const QChar slash = QLatin1Char('/'); + if (directory.isEmpty()) + return QString(); + // Avoid turing / into // on windows which triggers windows to check + // for network drives! + if (!directory.endsWith(slash)) + directory += slash; + + foreach (const QString &exec, execs) { + QFileInfo fi(directory + exec); + if (fi.exists() && fi.isFile() && fi.isExecutable()) + return fi.absoluteFilePath(); + } + return QString(); +} + QString Environment::searchInPath(const QString &executable, const QStringList &additionalDirs) const { + QString exec = QDir::cleanPath(expandVariables(executable)); + QFileInfo fi(exec); + if (fi.isAbsolute()) + return exec; + + if (executable.isEmpty()) + return QString(); + QStringList execs; - execs << executable; #ifdef Q_OS_WIN // Check all the executable extensions on windows: - QStringList extensions = value(QLatin1String("PATHEXT")).split(QLatin1Char(';')); + // PATHEXT is only used if the executable has no extension + if (fi.suffix().isEmpty()) { + QStringList extensions = value(QLatin1String("PATHEXT")).split(QLatin1Char(';')); - // .exe.bat is legal (and run when starting new.exe), so always go through the complete list once: - foreach (const QString &ext, extensions) - execs << executable + ext.toLower(); + foreach (const QString &ext, extensions) + execs << executable + ext.toLower(); + } #endif - return searchInPath(execs, additionalDirs); -} -QString Environment::searchInPath(const QStringList &executables, - const QStringList &additionalDirs) const -{ - const QChar slash = QLatin1Char('/'); - foreach (const QString &executable, executables) { - QString exec = QDir::cleanPath(expandVariables(executable)); - - if (exec.isEmpty()) - continue; - - QFileInfo baseFi(exec); - if (baseFi.isAbsolute() && baseFi.exists()) - return exec; - - // Check in directories: - foreach (const QString &dir, additionalDirs) { - if (dir.isEmpty()) - continue; - QFileInfo fi(dir + QLatin1Char('/') + exec); - if (fi.isFile() && fi.isExecutable()) - return fi.absoluteFilePath(); - } + foreach (QString dir, additionalDirs) { + QString tmp = searchInDirectory(execs, dir); + if (!tmp.isEmpty()) + return tmp; + } - // Check in path: - if (exec.indexOf(slash) != -1) - continue; - foreach (const QString &p, path()) { - QString fp = QDir::fromNativeSeparators(p); - // Avoid turing / into // on windows which triggers windows to check - // for network drives! - if (!fp.endsWith(slash)) - fp += slash; - fp += exec; - const QFileInfo fi(fp); - if (fi.exists() && fi.isExecutable() && !fi.isDir()) - return fi.absoluteFilePath(); - } + if (executable.indexOf(QLatin1Char('/')) != -1) + return QString(); + + foreach (const QString &p, path()) { + QString tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p)); + if (!tmp.isEmpty()) + return tmp; } return QString(); } diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index ff491c264b1b04fe3efd1dca1954389b47879e13..1e9e7c045d84b4c1e980187cd6ccf71e805d2e91 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -108,8 +108,7 @@ public: bool operator==(const Environment &other) const; private: - QString searchInPath(const QStringList &executables, - const QStringList &additionalDirs = QStringList()) const; + QString searchInDirectory(const QStringList &execs, QString directory) const; QMap<QString, QString> m_values; };