Environment: Simplify code a bit

Move duplication check into class and do not duplicate that.

Change-Id: I6fa34fb2e39d47432e87e959d1e5f44d21287bad
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2017-04-19 14:47:48 +02:00
parent 258faf3e96
commit d8533815de
2 changed files with 27 additions and 26 deletions

View File

@@ -23,9 +23,10 @@
**
****************************************************************************/
#include "algorithm.h"
#include "environment.h"
#include "algorithm.h"
#include <QDir>
#include <QProcessEnvironment>
#include <QSet>
@@ -231,19 +232,22 @@ void Environment::clear()
m_values.clear();
}
FileName Environment::searchInDirectory(const QStringList &execs, QString directory) const
FileName Environment::searchInDirectory(const QStringList &execs, QString directory,
QSet<QString> &alreadyChecked) const
{
const QChar slash = '/';
if (directory.isEmpty())
return FileName();
// Avoid turing / into // on windows which triggers windows to check
// for network drives!
if (!directory.endsWith(slash))
directory += slash;
const QString dir = directory.endsWith(slash) ? directory : directory + slash;
foreach (const QString &exec, execs) {
QFileInfo fi(directory + exec);
if (fi.exists() && fi.isFile() && fi.isExecutable())
if (directory.isEmpty() || alreadyChecked.contains(dir))
return {};
alreadyChecked.insert(dir);
for (const QString &exec : execs) {
QFileInfo fi(dir + exec);
if (fi.isFile() && fi.isExecutable())
return FileName::fromString(fi.absoluteFilePath());
}
return FileName();
@@ -286,36 +290,32 @@ FileName Environment::searchInPath(const QString &executable,
if (executable.isEmpty())
return FileName();
QString exec = QDir::cleanPath(expandVariables(executable));
QFileInfo fi(exec);
const QString exec = QDir::cleanPath(expandVariables(executable));
const QFileInfo fi(exec);
QStringList execs = appendExeExtensions(exec);
const QStringList execs = appendExeExtensions(exec);
if (fi.isAbsolute()) {
foreach (const QString &path, execs)
if (QFile::exists(path))
for (const QString &path : execs) {
QFileInfo pfi = QFileInfo(path);
if (pfi.isFile() && pfi.isExecutable())
return FileName::fromString(path);
}
return FileName::fromString(exec);
}
QSet<QString> alreadyChecked;
foreach (const QString &dir, additionalDirs) {
if (alreadyChecked.contains(dir))
continue;
alreadyChecked.insert(dir);
FileName tmp = searchInDirectory(execs, dir);
for (const QString &dir : additionalDirs) {
FileName tmp = searchInDirectory(execs, dir, alreadyChecked);
if (!tmp.isEmpty() && (!func || func(tmp.toString())))
return tmp;
}
if (executable.indexOf('/') != -1)
if (executable.contains('/'))
return FileName();
foreach (const QString &p, path()) {
if (alreadyChecked.contains(p))
continue;
alreadyChecked.insert(p);
FileName tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p));
for (const QString &p : path()) {
FileName tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p), alreadyChecked);
if (!tmp.isEmpty() && (!func || func(tmp.toString())))
return tmp;
}