forked from qt-creator/qt-creator
Utils: Move some code from QtcProcess to its only user
This is not really nice/up-to-date either, but I'd rather follow up on the user side. Change-Id: I426fea3251b8984aea19788a16e574dccc3d057d Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
@@ -1348,83 +1348,6 @@ QString QtcProcess::errorString() const
|
|||||||
|
|
||||||
// Path utilities
|
// Path utilities
|
||||||
|
|
||||||
// Locate a binary in a directory, applying all kinds of
|
|
||||||
// extensions the operating system supports.
|
|
||||||
static QString checkBinary(const QDir &dir, const QString &binary)
|
|
||||||
{
|
|
||||||
// naive UNIX approach
|
|
||||||
const QFileInfo info(dir.filePath(binary));
|
|
||||||
if (info.isFile() && info.isExecutable())
|
|
||||||
return info.absoluteFilePath();
|
|
||||||
|
|
||||||
// Does the OS have some weird extension concept or does the
|
|
||||||
// binary have a 3 letter extension?
|
|
||||||
if (HostOsInfo::isAnyUnixHost() && !HostOsInfo::isMacHost())
|
|
||||||
return {};
|
|
||||||
const int dotIndex = binary.lastIndexOf(QLatin1Char('.'));
|
|
||||||
if (dotIndex != -1 && dotIndex == binary.size() - 4)
|
|
||||||
return {};
|
|
||||||
|
|
||||||
switch (HostOsInfo::hostOs()) {
|
|
||||||
case OsTypeLinux:
|
|
||||||
case OsTypeOtherUnix:
|
|
||||||
case OsTypeOther:
|
|
||||||
break;
|
|
||||||
case OsTypeWindows: {
|
|
||||||
static const char *windowsExtensions[] = {".cmd", ".bat", ".exe", ".com"};
|
|
||||||
// Check the Windows extensions using the order
|
|
||||||
const int windowsExtensionCount = sizeof(windowsExtensions)/sizeof(const char*);
|
|
||||||
for (int e = 0; e < windowsExtensionCount; e ++) {
|
|
||||||
const QFileInfo windowsBinary(dir.filePath(binary + QLatin1String(windowsExtensions[e])));
|
|
||||||
if (windowsBinary.isFile() && windowsBinary.isExecutable())
|
|
||||||
return windowsBinary.absoluteFilePath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OsTypeMac: {
|
|
||||||
// Check for Mac app folders
|
|
||||||
const QFileInfo appFolder(dir.filePath(binary + QLatin1String(".app")));
|
|
||||||
if (appFolder.isDir()) {
|
|
||||||
QString macBinaryPath = appFolder.absoluteFilePath();
|
|
||||||
macBinaryPath += QLatin1String("/Contents/MacOS/");
|
|
||||||
macBinaryPath += binary;
|
|
||||||
const QFileInfo macBinary(macBinaryPath);
|
|
||||||
if (macBinary.isFile() && macBinary.isExecutable())
|
|
||||||
return macBinary.absoluteFilePath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QtcProcess::locateBinary(const QString &path, const QString &binary)
|
|
||||||
{
|
|
||||||
// Absolute file?
|
|
||||||
const QFileInfo absInfo(binary);
|
|
||||||
if (absInfo.isAbsolute())
|
|
||||||
return checkBinary(absInfo.dir(), absInfo.fileName());
|
|
||||||
|
|
||||||
// Windows finds binaries in the current directory
|
|
||||||
if (HostOsInfo::isWindowsHost()) {
|
|
||||||
const QString currentDirBinary = checkBinary(QDir::current(), binary);
|
|
||||||
if (!currentDirBinary.isEmpty())
|
|
||||||
return currentDirBinary;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QStringList paths = path.split(HostOsInfo::pathListSeparator());
|
|
||||||
if (paths.empty())
|
|
||||||
return {};
|
|
||||||
const QStringList::const_iterator cend = paths.constEnd();
|
|
||||||
for (QStringList::const_iterator it = paths.constBegin(); it != cend; ++it) {
|
|
||||||
const QDir dir(*it);
|
|
||||||
const QString rc = checkBinary(dir, binary);
|
|
||||||
if (!rc.isEmpty())
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
Environment QtcProcess::systemEnvironmentForBinary(const FilePath &filePath)
|
Environment QtcProcess::systemEnvironmentForBinary(const FilePath &filePath)
|
||||||
{
|
{
|
||||||
if (filePath.needsDevice()) {
|
if (filePath.needsDevice()) {
|
||||||
|
@@ -127,11 +127,8 @@ public:
|
|||||||
// These (or some of them) may be potentially moved outside of the class.
|
// These (or some of them) may be potentially moved outside of the class.
|
||||||
// For some we may aggregate in another public utils class (or subclass of QtcProcess)?
|
// For some we may aggregate in another public utils class (or subclass of QtcProcess)?
|
||||||
|
|
||||||
// TODO: How below 2 methods relate to QtcProcess?
|
// TODO: How below method relates to QtcProcess?
|
||||||
// Action: move/merge them somewhere else, FilePath::searchInPath() ?
|
// Action: move/merge it somewhere else
|
||||||
// Helpers to find binaries. Do not use it for other path variables
|
|
||||||
// and file types.
|
|
||||||
static QString locateBinary(const QString &path, const QString &binary);
|
|
||||||
static QString normalizeNewlines(const QString &text);
|
static QString normalizeNewlines(const QString &text);
|
||||||
|
|
||||||
// TODO: Unused currently? Should it serve as a compartment for contrary of remoteEnvironment?
|
// TODO: Unused currently? Should it serve as a compartment for contrary of remoteEnvironment?
|
||||||
|
@@ -39,6 +39,83 @@ struct Tr {
|
|||||||
Q_DECLARE_TR_FUNCTIONS(::QmakeProjectManager)
|
Q_DECLARE_TR_FUNCTIONS(::QmakeProjectManager)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Locate a binary in a directory, applying all kinds of
|
||||||
|
// extensions the operating system supports.
|
||||||
|
static QString checkBinary(const QDir &dir, const QString &binary)
|
||||||
|
{
|
||||||
|
// naive UNIX approach
|
||||||
|
const QFileInfo info(dir.filePath(binary));
|
||||||
|
if (info.isFile() && info.isExecutable())
|
||||||
|
return info.absoluteFilePath();
|
||||||
|
|
||||||
|
// Does the OS have some weird extension concept or does the
|
||||||
|
// binary have a 3 letter extension?
|
||||||
|
if (HostOsInfo::isAnyUnixHost() && !HostOsInfo::isMacHost())
|
||||||
|
return {};
|
||||||
|
const int dotIndex = binary.lastIndexOf(QLatin1Char('.'));
|
||||||
|
if (dotIndex != -1 && dotIndex == binary.size() - 4)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
switch (HostOsInfo::hostOs()) {
|
||||||
|
case OsTypeLinux:
|
||||||
|
case OsTypeOtherUnix:
|
||||||
|
case OsTypeOther:
|
||||||
|
break;
|
||||||
|
case OsTypeWindows: {
|
||||||
|
static const char *windowsExtensions[] = {".cmd", ".bat", ".exe", ".com"};
|
||||||
|
// Check the Windows extensions using the order
|
||||||
|
const int windowsExtensionCount = sizeof(windowsExtensions)/sizeof(const char*);
|
||||||
|
for (int e = 0; e < windowsExtensionCount; e ++) {
|
||||||
|
const QFileInfo windowsBinary(dir.filePath(binary + QLatin1String(windowsExtensions[e])));
|
||||||
|
if (windowsBinary.isFile() && windowsBinary.isExecutable())
|
||||||
|
return windowsBinary.absoluteFilePath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OsTypeMac: {
|
||||||
|
// Check for Mac app folders
|
||||||
|
const QFileInfo appFolder(dir.filePath(binary + QLatin1String(".app")));
|
||||||
|
if (appFolder.isDir()) {
|
||||||
|
QString macBinaryPath = appFolder.absoluteFilePath();
|
||||||
|
macBinaryPath += QLatin1String("/Contents/MacOS/");
|
||||||
|
macBinaryPath += binary;
|
||||||
|
const QFileInfo macBinary(macBinaryPath);
|
||||||
|
if (macBinary.isFile() && macBinary.isExecutable())
|
||||||
|
return macBinary.absoluteFilePath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
static QString locateBinary(const QString &path, const QString &binary)
|
||||||
|
{
|
||||||
|
// Absolute file?
|
||||||
|
const QFileInfo absInfo(binary);
|
||||||
|
if (absInfo.isAbsolute())
|
||||||
|
return checkBinary(absInfo.dir(), absInfo.fileName());
|
||||||
|
|
||||||
|
// Windows finds binaries in the current directory
|
||||||
|
if (HostOsInfo::isWindowsHost()) {
|
||||||
|
const QString currentDirBinary = checkBinary(QDir::current(), binary);
|
||||||
|
if (!currentDirBinary.isEmpty())
|
||||||
|
return currentDirBinary;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QStringList paths = path.split(HostOsInfo::pathListSeparator());
|
||||||
|
if (paths.empty())
|
||||||
|
return {};
|
||||||
|
const QStringList::const_iterator cend = paths.constEnd();
|
||||||
|
for (QStringList::const_iterator it = paths.constBegin(); it != cend; ++it) {
|
||||||
|
const QDir dir(*it);
|
||||||
|
const QString rc = checkBinary(dir, binary);
|
||||||
|
if (!rc.isEmpty())
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
static QString msgStartFailed(const QString &binary, QStringList arguments)
|
static QString msgStartFailed(const QString &binary, QStringList arguments)
|
||||||
{
|
{
|
||||||
arguments.push_front(binary);
|
arguments.push_front(binary);
|
||||||
@@ -122,7 +199,7 @@ static bool getEditorLaunchData(const CommandForQtVersion &commandForQtVersion,
|
|||||||
// fallback
|
// fallback
|
||||||
if (data->binary.isEmpty()) {
|
if (data->binary.isEmpty()) {
|
||||||
const QString path = qtcEnvironmentVariable("PATH");
|
const QString path = qtcEnvironmentVariable("PATH");
|
||||||
data->binary = QtcProcess::locateBinary(path, commandForQtVersion(nullptr));
|
data->binary = locateBinary(path, commandForQtVersion(nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->binary.isEmpty()) {
|
if (data->binary.isEmpty()) {
|
||||||
|
Reference in New Issue
Block a user