BuildManager: Reuse TaskTreeRunner

Change-Id: I533d92272a69f96df3efa578960803f81e712072
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Jarek Kobus
2024-01-13 18:41:31 +01:00
parent d86ec67f31
commit de5f75292d

View File

@@ -31,6 +31,7 @@
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <solutions/tasking/tasktree.h> #include <solutions/tasking/tasktree.h>
#include <solutions/tasking/tasktreerunner.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/outputformatter.h> #include <utils/outputformatter.h>
@@ -276,7 +277,7 @@ public:
QFutureWatcher<void> m_progressWatcher; QFutureWatcher<void> m_progressWatcher;
QPointer<FutureProgress> m_futureProgress; QPointer<FutureProgress> m_futureProgress;
std::unique_ptr<TaskTree> m_taskTree; TaskTreeRunner m_taskTreeRunner;
QElapsedTimer m_elapsed; QElapsedTimer m_elapsed;
}; };
@@ -309,6 +310,28 @@ BuildManager::BuildManager(QObject *parent, QAction *cancelBuildAction)
this, &BuildManager::cancel); this, &BuildManager::cancel);
connect(&d->m_progressWatcher, &QFutureWatcherBase::finished, connect(&d->m_progressWatcher, &QFutureWatcherBase::finished,
this, &BuildManager::finish); this, &BuildManager::finish);
connect(&d->m_taskTreeRunner, &TaskTreeRunner::done, this, [](DoneWith result) {
const bool success = result == DoneWith::Success;
if (!success && d->m_progressFutureInterface)
d->m_progressFutureInterface->reportCanceled();
cleanupBuild();
if (d->m_pendingQueue.isEmpty()) {
d->m_poppedUpTaskWindow = false;
d->m_isDeploying = false;
}
emit m_instance->buildQueueFinished(success);
if (!d->m_pendingQueue.isEmpty()) {
d->m_buildQueue = d->m_pendingQueue;
d->m_pendingQueue.clear();
startBuildQueue();
}
});
} }
BuildManager *BuildManager::instance() BuildManager *BuildManager::instance()
@@ -520,10 +543,10 @@ void BuildManager::cleanupBuild()
void BuildManager::cancel() void BuildManager::cancel()
{ {
if (!d->m_taskTree) if (!d->m_taskTreeRunner.isRunning())
return; return;
d->m_taskTree.reset(); d->m_taskTreeRunner.reset();
const QList<BuildItem> pendingQueue = d->m_pendingQueue; const QList<BuildItem> pendingQueue = d->m_pendingQueue;
d->m_pendingQueue.clear(); d->m_pendingQueue.clear();
@@ -679,31 +702,6 @@ void BuildManager::startBuildQueue()
if (!targetTasks.isEmpty()) if (!targetTasks.isEmpty())
topLevel.append(Group(targetTasks)); topLevel.append(Group(targetTasks));
d->m_taskTree.reset(new TaskTree(Group{topLevel}));
const auto onDone = [](DoneWith result) {
const bool success = result == DoneWith::Success;
d->m_taskTree.release()->deleteLater();
if (!success && d->m_progressFutureInterface)
d->m_progressFutureInterface->reportCanceled();
cleanupBuild();
if (d->m_pendingQueue.isEmpty()) {
d->m_poppedUpTaskWindow = false;
d->m_isDeploying = false;
}
emit m_instance->buildQueueFinished(success);
if (!d->m_pendingQueue.isEmpty()) {
d->m_buildQueue = d->m_pendingQueue;
d->m_pendingQueue.clear();
startBuildQueue();
}
};
connect(d->m_taskTree.get(), &TaskTree::done, instance(), onDone);
// Progress Reporting // Progress Reporting
d->m_progressFutureInterface = new QFutureInterface<void>; d->m_progressFutureInterface = new QFutureInterface<void>;
d->m_progressWatcher.setFuture(d->m_progressFutureInterface->future()); d->m_progressWatcher.setFuture(d->m_progressFutureInterface->future());
@@ -720,7 +718,7 @@ void BuildManager::startBuildQueue()
d->m_progressFutureInterface->reportStarted(); d->m_progressFutureInterface->reportStarted();
d->m_elapsed.start(); d->m_elapsed.start();
d->m_taskTree->start(); d->m_taskTreeRunner.start(topLevel);
} }
void BuildManager::showBuildResults() void BuildManager::showBuildResults()
@@ -761,7 +759,7 @@ void BuildManager::progressChanged(int percent, const QString &text)
bool BuildManager::buildQueueAppend(const QList<BuildItem> &items, const QStringList &preambleMessage) bool BuildManager::buildQueueAppend(const QList<BuildItem> &items, const QStringList &preambleMessage)
{ {
if (!d->m_taskTree) { if (!d->m_taskTreeRunner.isRunning()) {
d->m_outputWindow->clearContents(); d->m_outputWindow->clearContents();
if (ProjectExplorerPlugin::projectExplorerSettings().clearIssuesOnRebuild) { if (ProjectExplorerPlugin::projectExplorerSettings().clearIssuesOnRebuild) {
TaskHub::clearTasks(Constants::TASK_CATEGORY_COMPILE); TaskHub::clearTasks(Constants::TASK_CATEGORY_COMPILE);
@@ -797,7 +795,7 @@ bool BuildManager::buildQueueAppend(const QList<BuildItem> &items, const QString
return false; return false;
} }
if (d->m_taskTree) if (d->m_taskTreeRunner.isRunning())
d->m_pendingQueue << items; d->m_pendingQueue << items;
else else
d->m_buildQueue = items; d->m_buildQueue = items;
@@ -812,7 +810,7 @@ bool BuildManager::buildQueueAppend(const QList<BuildItem> &items, const QString
for (const BuildItem &item : items) for (const BuildItem &item : items)
incrementActiveBuildSteps(item.buildStep); incrementActiveBuildSteps(item.buildStep);
if (!d->m_taskTree) if (!d->m_taskTreeRunner.isRunning())
startBuildQueue(); startBuildQueue();
return true; return true;
} }