Coco: Merge cocoinstallation.* into globalsettings.*

This is mechanical so far, the plan is to merge the class together with
the GlobalSettings namespace into a CocoSettings class with the usual
access pattern. Later the m_cocoPathAspect from GlobalSettingsWidget
can be moved there and /probably/ be merged with CocoInstallationPrivate
::cocoPath.

Change-Id: If156a5ea78335e30372414cb1583d8e68f4f90ba
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
hjk
2024-12-13 07:30:33 +01:00
parent b916c6e4d3
commit d175c629aa
9 changed files with 191 additions and 226 deletions

View File

@@ -17,8 +17,6 @@ add_qtc_plugin(Coco
cococmakesettings.h cococmakesettings.h
cococommon.cpp cococommon.cpp
cococommon.h cococommon.h
cocoinstallation.cpp
cocoinstallation.h
cocolanguageclient.cpp cocolanguageclient.cpp
cocolanguageclient.h cocolanguageclient.h
cocoplugin.cpp cocoplugin.cpp

View File

@@ -23,8 +23,6 @@ QtcPlugin {
"cococmakesettings.h", "cococmakesettings.h",
"cococommon.cpp", "cococommon.cpp",
"cococommon.h", "cococommon.h",
"cocoinstallation.cpp",
"cocoinstallation.h",
"cocolanguageclient.cpp", "cocolanguageclient.cpp",
"cocolanguageclient.h", "cocolanguageclient.h",
"cocoplugin.cpp", "cocoplugin.cpp",

View File

@@ -3,9 +3,9 @@
#include "cocobuildstep.h" #include "cocobuildstep.h"
#include "cocoinstallation.h"
#include "cocopluginconstants.h" #include "cocopluginconstants.h"
#include "cocotr.h" #include "cocotr.h"
#include "globalsettings.h"
#include <cmakeprojectmanager/cmakeprojectconstants.h> #include <cmakeprojectmanager/cmakeprojectconstants.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>

View File

@@ -1,177 +0,0 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "cocoinstallation.h"
#include "cococommon.h"
#include "cocotr.h"
#include "globalsettings.h"
#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
#include <QProcess>
#include <QStandardPaths>
#include <QRegularExpression>
namespace Coco::Internal {
struct CocoInstallationPrivate
{
Utils::FilePath cocoPath;
bool isValid = false;
QString errorMessage = Tr::tr("Error: Coco installation directory not set. (This can't happen.)");
};
CocoInstallationPrivate *CocoInstallation::d = nullptr;
CocoInstallation::CocoInstallation()
{
if (!d)
d = new CocoInstallationPrivate;
}
Utils::FilePath CocoInstallation::directory() const
{
return d->cocoPath;
}
Utils::FilePath CocoInstallation::coverageBrowserPath() const
{
QString browserPath;
if (Utils::HostOsInfo::isAnyUnixHost() || Utils::HostOsInfo::isMacHost())
browserPath = "bin/coveragebrowser";
else
browserPath = "coveragebrowser.exe";
return d->cocoPath.resolvePath(browserPath);
}
void CocoInstallation::setDirectory(const Utils::FilePath &dir)
{
if (isCocoDirectory(dir)) {
d->cocoPath = dir;
d->isValid = true;
d->errorMessage = "";
verifyCocoDirectory();
}
else {
d->cocoPath = Utils::FilePath();
d->isValid = false;
d->errorMessage
= Tr::tr("Error: Coco installation directory not found at \"%1\".").arg(dir.nativePath());
}
}
Utils::FilePath CocoInstallation::coverageScannerPath(const Utils::FilePath &cocoDir) const
{
QString scannerPath;
if (Utils::HostOsInfo::isAnyUnixHost() || Utils::HostOsInfo::isMacHost())
scannerPath = "bin/coveragescanner";
else
scannerPath = "coveragescanner.exe";
return cocoDir.resolvePath(scannerPath);
}
bool CocoInstallation::isCocoDirectory(const Utils::FilePath &cocoDir) const
{
return coverageScannerPath(cocoDir).exists();
}
void CocoInstallation::logError(const QString &msg)
{
logFlashing(msg);
d->isValid = false;
d->errorMessage = msg;
}
bool CocoInstallation::verifyCocoDirectory()
{
QString coveragescanner = coverageScannerPath(d->cocoPath).nativePath();
QProcess proc;
proc.setProgram(coveragescanner);
proc.setArguments({"--cs-help"});
proc.start();
if (!proc.waitForStarted()) {
logError(Tr::tr("Error: Coveragescanner at \"%1\" did not start.").arg(coveragescanner));
return false;
}
if (!proc.waitForFinished()) {
logError(Tr::tr("Error: Coveragescanner at \"%1\" did not finish.").arg(coveragescanner));
return false;
}
QString result = QString::fromLatin1(proc.readAll());
static const QRegularExpression linebreak("\n|\r\n|\r");
QStringList lines = result.split(linebreak, Qt::SkipEmptyParts);
const qsizetype n = lines.size();
if (n >= 2 && lines[n - 2].startsWith("Version:") && lines[n - 1].startsWith("Date:")) {
logSilently(Tr::tr("Valid CoverageScanner found at \"%1\":").arg(coveragescanner));
logSilently(" " + lines[n - 2]);
logSilently(" " + lines[n - 1]);
return true;
} else {
logError(
Tr::tr("Error: Coveragescanner at \"%1\" did not run correctly.").arg(coveragescanner));
for (const QString &l : lines) {
logSilently(l);
}
return false;
}
}
bool CocoInstallation::isValid() const
{
return d->isValid;
}
QString CocoInstallation::errorMessage() const
{
return d->errorMessage;
}
void CocoInstallation::tryPath(const QString &path)
{
if (d->isValid)
return;
const auto fpath = Utils::FilePath::fromString(path);
const QString nativePath = fpath.nativePath();
if (isCocoDirectory(fpath)) {
logSilently(Tr::tr("Found Coco directory \"%1\".").arg(nativePath));
setDirectory(fpath);
GlobalSettings::save();
} else
logSilently(Tr::tr("Checked Coco directory \"%1\".").arg(nativePath));
}
QString CocoInstallation::envVar(const QString &var) const
{
return QProcessEnvironment::systemEnvironment().value(var);
}
void CocoInstallation::findDefaultDirectory()
{
if (Utils::HostOsInfo::isMacHost())
tryPath("/Applications/SquishCoco");
else if (Utils::HostOsInfo::isAnyUnixHost()) {
tryPath((Utils::FileUtils::homePath() / "SquishCoco").nativePath());
tryPath("/opt/SquishCoco");
} else {
tryPath(envVar("SQUISHCOCO"));
QStringList homeDirs = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
if (!homeDirs.isEmpty())
tryPath(homeDirs[0] + "/squishcoco");
tryPath(envVar("ProgramFiles") + "\\squishcoco");
tryPath(envVar("ProgramFiles(x86)") + "\\squishcoco");
}
}
} // namespace Coco::Internal

View File

@@ -1,39 +0,0 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <utils/filepath.h>
class QString;
namespace Coco::Internal {
struct CocoInstallationPrivate;
// Borg pattern: There are many instances of this class, but all are the same.
class CocoInstallation
{
public:
CocoInstallation();
Utils::FilePath directory() const;
Utils::FilePath coverageBrowserPath() const;
void setDirectory(const Utils::FilePath &dir);
void findDefaultDirectory();
bool isValid() const;
QString errorMessage() const;
private:
Utils::FilePath coverageScannerPath(const Utils::FilePath &cocoDir) const;
void logError(const QString &msg);
bool isCocoDirectory(const Utils::FilePath &cocoDir) const;
bool verifyCocoDirectory();
void tryPath(const QString &path);
QString envVar(const QString &var) const;
static CocoInstallationPrivate *d;
};
} // namespace Coco::Internal

View File

@@ -4,7 +4,7 @@
#pragma once #pragma once
#include "buildsettings.h" #include "buildsettings.h"
#include "cocoinstallation.h" #include "globalsettings.h"
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <utils/aspects.h> #include <utils/aspects.h>

View File

@@ -5,10 +5,10 @@
#include "buildsettings.h" #include "buildsettings.h"
#include "cococommon.h" #include "cococommon.h"
#include "cocoinstallation.h"
#include "cocopluginconstants.h" #include "cocopluginconstants.h"
#include "cocoprojectwidget.h" #include "cocoprojectwidget.h"
#include "cocotr.h" #include "cocotr.h"
#include "globalsettings.h"
#include "qmakefeaturefile.h" #include "qmakefeaturefile.h"
#include <utils/commandline.h> #include <utils/commandline.h>

View File

@@ -3,7 +3,7 @@
#include "globalsettings.h" #include "globalsettings.h"
#include "cocoinstallation.h" #include "cococommon.h"
#include "cocopluginconstants.h" #include "cocopluginconstants.h"
#include "cocotr.h" #include "cocotr.h"
@@ -11,10 +11,14 @@
#include <utils/fancylineedit.h> #include <utils/fancylineedit.h>
#include <utils/filepath.h> #include <utils/filepath.h>
#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <QProcess> #include <QProcess>
#include <QRegularExpression>
#include <QSettings> #include <QSettings>
#include <QStandardPaths>
namespace Coco::Internal { namespace Coco::Internal {
namespace GlobalSettings { namespace GlobalSettings {
@@ -55,6 +59,163 @@ void save()
} // namespace GlobalSettings } // namespace GlobalSettings
struct CocoInstallationPrivate
{
Utils::FilePath cocoPath;
bool isValid = false;
QString errorMessage = Tr::tr("Error: Coco installation directory not set. (This can't happen.)");
};
CocoInstallationPrivate *CocoInstallation::d = nullptr;
CocoInstallation::CocoInstallation()
{
if (!d)
d = new CocoInstallationPrivate;
}
Utils::FilePath CocoInstallation::directory() const
{
return d->cocoPath;
}
Utils::FilePath CocoInstallation::coverageBrowserPath() const
{
QString browserPath;
if (Utils::HostOsInfo::isAnyUnixHost() || Utils::HostOsInfo::isMacHost())
browserPath = "bin/coveragebrowser";
else
browserPath = "coveragebrowser.exe";
return d->cocoPath.resolvePath(browserPath);
}
void CocoInstallation::setDirectory(const Utils::FilePath &dir)
{
if (isCocoDirectory(dir)) {
d->cocoPath = dir;
d->isValid = true;
d->errorMessage = "";
verifyCocoDirectory();
}
else {
d->cocoPath = Utils::FilePath();
d->isValid = false;
d->errorMessage
= Tr::tr("Error: Coco installation directory not found at \"%1\".").arg(dir.nativePath());
}
}
Utils::FilePath CocoInstallation::coverageScannerPath(const Utils::FilePath &cocoDir) const
{
QString scannerPath;
if (Utils::HostOsInfo::isAnyUnixHost() || Utils::HostOsInfo::isMacHost())
scannerPath = "bin/coveragescanner";
else
scannerPath = "coveragescanner.exe";
return cocoDir.resolvePath(scannerPath);
}
bool CocoInstallation::isCocoDirectory(const Utils::FilePath &cocoDir) const
{
return coverageScannerPath(cocoDir).exists();
}
void CocoInstallation::logError(const QString &msg)
{
logFlashing(msg);
d->isValid = false;
d->errorMessage = msg;
}
bool CocoInstallation::verifyCocoDirectory()
{
QString coveragescanner = coverageScannerPath(d->cocoPath).nativePath();
QProcess proc;
proc.setProgram(coveragescanner);
proc.setArguments({"--cs-help"});
proc.start();
if (!proc.waitForStarted()) {
logError(Tr::tr("Error: Coveragescanner at \"%1\" did not start.").arg(coveragescanner));
return false;
}
if (!proc.waitForFinished()) {
logError(Tr::tr("Error: Coveragescanner at \"%1\" did not finish.").arg(coveragescanner));
return false;
}
QString result = QString::fromLatin1(proc.readAll());
static const QRegularExpression linebreak("\n|\r\n|\r");
QStringList lines = result.split(linebreak, Qt::SkipEmptyParts);
const qsizetype n = lines.size();
if (n >= 2 && lines[n - 2].startsWith("Version:") && lines[n - 1].startsWith("Date:")) {
logSilently(Tr::tr("Valid CoverageScanner found at \"%1\":").arg(coveragescanner));
logSilently(" " + lines[n - 2]);
logSilently(" " + lines[n - 1]);
return true;
} else {
logError(
Tr::tr("Error: Coveragescanner at \"%1\" did not run correctly.").arg(coveragescanner));
for (const QString &l : lines) {
logSilently(l);
}
return false;
}
}
bool CocoInstallation::isValid() const
{
return d->isValid;
}
QString CocoInstallation::errorMessage() const
{
return d->errorMessage;
}
void CocoInstallation::tryPath(const QString &path)
{
if (d->isValid)
return;
const auto fpath = Utils::FilePath::fromString(path);
const QString nativePath = fpath.nativePath();
if (isCocoDirectory(fpath)) {
logSilently(Tr::tr("Found Coco directory \"%1\".").arg(nativePath));
setDirectory(fpath);
GlobalSettings::save();
} else
logSilently(Tr::tr("Checked Coco directory \"%1\".").arg(nativePath));
}
QString CocoInstallation::envVar(const QString &var) const
{
return QProcessEnvironment::systemEnvironment().value(var);
}
void CocoInstallation::findDefaultDirectory()
{
if (Utils::HostOsInfo::isMacHost())
tryPath("/Applications/SquishCoco");
else if (Utils::HostOsInfo::isAnyUnixHost()) {
tryPath((Utils::FileUtils::homePath() / "SquishCoco").nativePath());
tryPath("/opt/SquishCoco");
} else {
tryPath(envVar("SQUISHCOCO"));
QStringList homeDirs = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
if (!homeDirs.isEmpty())
tryPath(homeDirs[0] + "/squishcoco");
tryPath(envVar("ProgramFiles") + "\\squishcoco");
tryPath(envVar("ProgramFiles(x86)") + "\\squishcoco");
}
}
GlobalSettingsWidget::GlobalSettingsWidget(QFrame *parent) GlobalSettingsWidget::GlobalSettingsWidget(QFrame *parent)
: QFrame(parent) : QFrame(parent)
{ {

View File

@@ -3,8 +3,6 @@
#pragma once #pragma once
#include "cocoinstallation.h"
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
#include <QPointer> #include <QPointer>
@@ -17,6 +15,32 @@ void save();
} // GlobalSettings } // GlobalSettings
struct CocoInstallationPrivate;
// Borg pattern: There are many instances of this class, but all are the same.
class CocoInstallation
{
public:
CocoInstallation();
Utils::FilePath directory() const;
Utils::FilePath coverageBrowserPath() const;
void setDirectory(const Utils::FilePath &dir);
void findDefaultDirectory();
bool isValid() const;
QString errorMessage() const;
private:
Utils::FilePath coverageScannerPath(const Utils::FilePath &cocoDir) const;
void logError(const QString &msg);
bool isCocoDirectory(const Utils::FilePath &cocoDir) const;
bool verifyCocoDirectory();
void tryPath(const QString &path);
QString envVar(const QString &var) const;
static CocoInstallationPrivate *d;
};
class GlobalSettingsWidget : public QFrame class GlobalSettingsWidget : public QFrame
{ {