QbsCleanStep: Employ task tree for running

Task-number: QTCREATORBUG-29168
Change-Id: I68e097747f8383d319d5c14eeb5bb9f1a94353a5
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Jarek Kobus
2023-07-14 21:55:52 +02:00
parent 4997a23f15
commit aab5b73a31
3 changed files with 38 additions and 119 deletions

View File

@@ -4,8 +4,6 @@
#include "qbsbuildconfiguration.h" #include "qbsbuildconfiguration.h"
#include "qbsbuildstep.h" #include "qbsbuildstep.h"
#include "qbscleanstep.h"
#include "qbsinstallstep.h"
#include "qbsproject.h" #include "qbsproject.h"
#include "qbsprojectmanagerconstants.h" #include "qbsprojectmanagerconstants.h"
#include "qbsprojectmanagertr.h" #include "qbsprojectmanagertr.h"
@@ -144,10 +142,6 @@ QbsBuildConfiguration::~QbsBuildConfiguration()
if (const auto qbs = qobject_cast<QbsBuildStep *>(bs)) if (const auto qbs = qobject_cast<QbsBuildStep *>(bs))
qbs->dropSession(); qbs->dropSession();
} }
for (BuildStep * const cs : cleanSteps()->steps()) {
if (const auto qcs = qobject_cast<QbsCleanStep *>(cs))
qcs->dropSession();
}
delete m_buildSystem; delete m_buildSystem;
} }

View File

@@ -4,32 +4,27 @@
#include "qbscleanstep.h" #include "qbscleanstep.h"
#include "qbsbuildconfiguration.h" #include "qbsbuildconfiguration.h"
#include "qbsproject.h"
#include "qbsprojectmanagerconstants.h" #include "qbsprojectmanagerconstants.h"
#include "qbsprojectmanagertr.h" #include "qbsprojectmanagertr.h"
#include "qbsrequest.h"
#include "qbssession.h" #include "qbssession.h"
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/kit.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/buildmanager.h>
#include <projectexplorer/target.h>
#include <utils/qtcassert.h>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonObject> #include <QJsonObject>
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Tasking;
using namespace Utils; using namespace Utils;
namespace QbsProjectManager { namespace QbsProjectManager::Internal {
namespace Internal {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// QbsCleanStep: // QbsCleanStep:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
QbsCleanStep::QbsCleanStep(BuildStepList *bsl, Utils::Id id) QbsCleanStep::QbsCleanStep(BuildStepList *bsl, Id id)
: BuildStep(bsl, id) : BuildStep(bsl, id)
{ {
setDisplayName(Tr::tr("Qbs Clean")); setDisplayName(Tr::tr("Qbs Clean"));
@@ -55,25 +50,11 @@ QbsCleanStep::QbsCleanStep(BuildStepList *bsl, Utils::Id id)
}); });
} }
QbsCleanStep::~QbsCleanStep()
{
doCancel();
if (m_session)
m_session->disconnect(this);
}
void QbsCleanStep::dropSession()
{
if (m_session) {
doCancel();
m_session->disconnect(this);
m_session = nullptr;
}
}
bool QbsCleanStep::init() bool QbsCleanStep::init()
{ {
if (buildSystem()->isParsing() || m_session) if (!BuildStep::init())
return false;
if (buildSystem()->isParsing())
return false; return false;
const auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); const auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration());
if (!bc) if (!bc)
@@ -82,64 +63,36 @@ bool QbsCleanStep::init()
return true; return true;
} }
void QbsCleanStep::doRun() GroupItem QbsCleanStep::runRecipe()
{ {
m_session = static_cast<QbsBuildSystem*>(buildSystem())->session(); const auto onSetup = [this](QbsRequest &request) {
if (!m_session) { QbsSession *session = static_cast<QbsBuildSystem*>(buildSystem())->session();
emit addOutput(Tr::tr("No qbs session exists for this target."), OutputFormat::ErrorMessage); if (!session) {
emit finished(false); emit addOutput(Tr::tr("No qbs session exists for this target."),
return; OutputFormat::ErrorMessage);
return SetupResult::StopWithError;
} }
QJsonObject requestData;
QJsonObject request; requestData.insert("type", "clean-project");
request.insert("type", "clean-project");
if (!m_products.isEmpty()) if (!m_products.isEmpty())
request.insert("products", QJsonArray::fromStringList(m_products)); requestData.insert("products", QJsonArray::fromStringList(m_products));
request.insert("dry-run", dryRun()); requestData.insert("dry-run", dryRun());
request.insert("keep-going", keepGoing()); requestData.insert("keep-going", keepGoing());
m_session->sendRequest(request);
m_maxProgress = 0; request.setSession(session);
connect(m_session, &QbsSession::projectCleaned, this, &QbsCleanStep::cleaningDone); request.setRequestData(requestData);
connect(m_session, &QbsSession::taskStarted, this, &QbsCleanStep::handleTaskStarted); connect(&request, &QbsRequest::progressChanged, this, &BuildStep::progress);
connect(m_session, &QbsSession::taskProgress, this, &QbsCleanStep::handleProgress); connect(&request, &QbsRequest::outputAdded, this,
connect(m_session, &QbsSession::errorOccurred, this, [this] { [this](const QString &output, OutputFormat format) {
cleaningDone(ErrorInfo(Tr::tr("Cleaning canceled: Qbs session failed."))); emit addOutput(output, format);
}); });
} connect(&request, &QbsRequest::taskAdded, this, [this](const Task &task) {
emit addTask(task, 1);
});
return SetupResult::Continue;
};
void QbsCleanStep::doCancel() return QbsRequestTask(onSetup);
{
if (m_session)
m_session->cancelCurrentJob();
}
void QbsCleanStep::cleaningDone(const ErrorInfo &error)
{
m_session->disconnect(this);
m_session = nullptr;
for (const ErrorInfoItem &item : error.items)
createTaskAndOutput(Task::Error, item.description, item.filePath, item.line);
emit finished(!error.hasError());
}
void QbsCleanStep::handleTaskStarted(const QString &desciption, int max)
{
Q_UNUSED(desciption)
m_maxProgress = max;
}
void QbsCleanStep::handleProgress(int value)
{
if (m_maxProgress > 0)
emit progress(value * 100 / m_maxProgress, m_description);
}
void QbsCleanStep::createTaskAndOutput(Task::TaskType type, const QString &message,
const FilePath &file, int line)
{
emit addOutput(message, OutputFormat::Stdout);
emit addTask(CompileTask(type, message, file, line), 1);
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@@ -154,5 +107,4 @@ QbsCleanStepFactory::QbsCleanStepFactory()
setDisplayName(Tr::tr("Qbs Clean")); setDisplayName(Tr::tr("Qbs Clean"));
} }
} // namespace Internal } // namespace QbsProjectManager::Internal
} // namespace QbsProjectManager

View File

@@ -3,18 +3,9 @@
#pragma once #pragma once
#include "qbsbuildconfiguration.h"
#include <projectexplorer/buildstep.h> #include <projectexplorer/buildstep.h>
#include <projectexplorer/task.h>
#include <utils/aspects.h> namespace QbsProjectManager::Internal {
namespace QbsProjectManager {
namespace Internal {
class ErrorInfo;
class QbsSession;
class QbsCleanStep final : public ProjectExplorer::BuildStep class QbsCleanStep final : public ProjectExplorer::BuildStep
{ {
@@ -22,33 +13,16 @@ class QbsCleanStep final : public ProjectExplorer::BuildStep
public: public:
QbsCleanStep(ProjectExplorer::BuildStepList *bsl, Utils::Id id); QbsCleanStep(ProjectExplorer::BuildStepList *bsl, Utils::Id id);
~QbsCleanStep() override;
QbsBuildStepData stepData() const;
void dropSession();
private: private:
bool init() override; bool init() override;
void doRun() override; Tasking::GroupItem runRecipe() final;
void doCancel() override;
void cleaningDone(const ErrorInfo &error);
void handleTaskStarted(const QString &desciption, int max);
void handleProgress(int value);
void createTaskAndOutput(ProjectExplorer::Task::TaskType type,
const QString &message, const Utils::FilePath &file, int line);
Utils::BoolAspect dryRun{this}; Utils::BoolAspect dryRun{this};
Utils::BoolAspect keepGoing{this}; Utils::BoolAspect keepGoing{this};
Utils::StringAspect effectiveCommand{this}; Utils::StringAspect effectiveCommand{this};
QStringList m_products; QStringList m_products;
QbsSession *m_session = nullptr;
QString m_description;
int m_maxProgress;
bool m_showCompilerOutput = true;
}; };
class QbsCleanStepFactory : public ProjectExplorer::BuildStepFactory class QbsCleanStepFactory : public ProjectExplorer::BuildStepFactory
@@ -57,5 +31,4 @@ public:
QbsCleanStepFactory(); QbsCleanStepFactory();
}; };
} // namespace Internal } // namespace QbsProjectManager::Internal
} // namespace QbsProjectManager