MesonProcess: Reuse ProcessProgress

Change-Id: I59c9c7a238731d50e1a6a4a60ee2aef6f2728d74
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Jarek Kobus
2022-10-11 13:40:17 +02:00
parent 8e4cdf2a69
commit caa013b8e8
2 changed files with 28 additions and 53 deletions

View File

@@ -4,18 +4,21 @@
#include "mesonprocess.h" #include "mesonprocess.h"
#include "mesonprojectmanagertr.h" #include "mesonprojectmanagertr.h"
#include "toolwrapper.h"
#include <coreplugin/messagemanager.h> #include <coreplugin/messagemanager.h>
#include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/progressmanager/processprogress.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/taskhub.h> #include <projectexplorer/taskhub.h>
#include <utils/environment.h>
#include <utils/qtcprocess.h> #include <utils/qtcprocess.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <QLoggingCategory> #include <QLoggingCategory>
using namespace Core;
using namespace Utils; using namespace Utils;
namespace MesonProjectManager { namespace MesonProjectManager {
@@ -23,11 +26,7 @@ namespace Internal {
static Q_LOGGING_CATEGORY(mesonProcessLog, "qtc.meson.buildsystem", QtWarningMsg); static Q_LOGGING_CATEGORY(mesonProcessLog, "qtc.meson.buildsystem", QtWarningMsg);
MesonProcess::MesonProcess() MesonProcess::~MesonProcess() = default;
{
connect(&m_cancelTimer, &QTimer::timeout, this, &MesonProcess::checkForCancelled);
m_cancelTimer.setInterval(500);
}
bool MesonProcess::run(const Command &command, bool MesonProcess::run(const Command &command,
const Environment &env, const Environment &env,
@@ -37,17 +36,10 @@ bool MesonProcess::run(const Command &command,
if (!sanityCheck(command)) if (!sanityCheck(command))
return false; return false;
m_stdo.clear(); m_stdo.clear();
m_future = decltype(m_future){};
ProjectExplorer::TaskHub::clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM); ProjectExplorer::TaskHub::clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM);
setupProcess(command, env, captureStdo); setupProcess(command, env, projectName, captureStdo);
m_future.setProgressRange(0, 1);
Core::ProgressManager::addTimedTask(m_future,
Tr::tr("Configuring \"%1\".").arg(projectName),
"Meson.Configure",
10);
m_elapsed.start(); m_elapsed.start();
m_process->start(); m_process->start();
m_cancelTimer.start(500);
qCDebug(mesonProcessLog()) << "Starting:" << command.toUserOutput(); qCDebug(mesonProcessLog()) << "Starting:" << command.toUserOutput();
return true; return true;
} }
@@ -58,32 +50,15 @@ void MesonProcess::handleProcessDone()
ProjectExplorer::TaskHub::addTask(ProjectExplorer::BuildSystemTask{ ProjectExplorer::TaskHub::addTask(ProjectExplorer::BuildSystemTask{
ProjectExplorer::Task::TaskType::Error, m_process->exitMessage()}); ProjectExplorer::Task::TaskType::Error, m_process->exitMessage()});
} }
m_cancelTimer.stop();
m_stdo = m_process->readAllStandardOutput(); m_stdo = m_process->readAllStandardOutput();
m_stderr = m_process->readAllStandardError(); m_stderr = m_process->readAllStandardError();
if (m_process->exitStatus() == QProcess::NormalExit) {
m_future.setProgressValue(1);
m_future.reportFinished();
} else {
m_future.reportCanceled();
m_future.reportFinished();
}
const QString elapsedTime = formatElapsedTime(m_elapsed.elapsed()); const QString elapsedTime = formatElapsedTime(m_elapsed.elapsed());
Core::MessageManager::writeSilently(elapsedTime); MessageManager::writeSilently(elapsedTime);
emit finished(m_process->exitCode(), m_process->exitStatus()); emit finished(m_process->exitCode(), m_process->exitStatus());
} }
void MesonProcess::checkForCancelled() void MesonProcess::setupProcess(const Command &command, const Environment &env,
{ const QString &projectName, bool captureStdo)
if (m_future.isCanceled()) {
m_cancelTimer.stop();
m_process->close();
}
}
void MesonProcess::setupProcess(const Command &command,
const Environment env,
bool captureStdo)
{ {
m_process.reset(new QtcProcess); m_process.reset(new QtcProcess);
connect(m_process.get(), &QtcProcess::done, this, &MesonProcess::handleProcessDone); connect(m_process.get(), &QtcProcess::done, this, &MesonProcess::handleProcessDone);
@@ -96,9 +71,12 @@ void MesonProcess::setupProcess(const Command &command,
m_process->setWorkingDirectory(command.workDir()); m_process->setWorkingDirectory(command.workDir());
m_process->setEnvironment(env); m_process->setEnvironment(env);
Core::MessageManager::writeFlashing( MessageManager::writeFlashing(Tr::tr("Running %1 in %2.")
Tr::tr("Running %1 in %2.").arg(command.toUserOutput()).arg(command.workDir().toUserOutput())); .arg(command.toUserOutput(), command.workDir().toUserOutput()));
m_process->setCommand(command.cmdLine()); m_process->setCommand(command.cmdLine());
m_process->setTimeoutS(10);
ProcessProgress *progress = new ProcessProgress(m_process.get());
progress->setDisplayName(Tr::tr("Configuring \"%1\".").arg(projectName));
} }
bool MesonProcess::sanityCheck(const Command &command) const bool MesonProcess::sanityCheck(const Command &command) const
@@ -125,13 +103,13 @@ bool MesonProcess::sanityCheck(const Command &command) const
void MesonProcess::processStandardOutput() void MesonProcess::processStandardOutput()
{ {
const auto data = m_process->readAllStandardOutput(); const auto data = m_process->readAllStandardOutput();
Core::MessageManager::writeSilently(QString::fromLocal8Bit(data)); MessageManager::writeSilently(QString::fromLocal8Bit(data));
emit readyReadStandardOutput(data); emit readyReadStandardOutput(data);
} }
void MesonProcess::processStandardError() void MesonProcess::processStandardError()
{ {
Core::MessageManager::writeSilently(QString::fromLocal8Bit(m_process->readAllStandardError())); MessageManager::writeSilently(QString::fromLocal8Bit(m_process->readAllStandardError()));
} }
} // namespace Internal } // namespace Internal

View File

@@ -3,31 +3,31 @@
#pragma once #pragma once
#include "mesonwrapper.h"
#include <QByteArray> #include <QByteArray>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QFutureInterface>
#include <QObject> #include <QObject>
#include <QProcess> #include <QProcess>
#include <QTimer>
#include <memory> #include <memory>
namespace Utils { class QtcProcess; } namespace Utils {
class Environment;
class QtcProcess;
}
namespace MesonProjectManager { namespace MesonProjectManager {
namespace Internal { namespace Internal {
class Command;
class MesonProcess final : public QObject class MesonProcess final : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
MesonProcess(); MesonProcess() = default;
bool run(const Command &command, ~MesonProcess();
const Utils::Environment &env, bool run(const Command &command, const Utils::Environment &env,
const QString &projectName, const QString &projectName, bool captureStdo = false);
bool captureStdo = false);
const QByteArray &stdOut() const { return m_stdo; } const QByteArray &stdOut() const { return m_stdo; }
const QByteArray &stdErr() const { return m_stderr; } const QByteArray &stdErr() const { return m_stderr; }
@@ -37,17 +37,14 @@ signals:
private: private:
void handleProcessDone(); void handleProcessDone();
void checkForCancelled(); void setupProcess(const Command &command, const Utils::Environment &env,
void setupProcess(const Command &command, const Utils::Environment env, bool captureStdo); const QString &projectName, bool captureStdo);
bool sanityCheck(const Command &command) const; bool sanityCheck(const Command &command) const;
void processStandardOutput(); void processStandardOutput();
void processStandardError(); void processStandardError();
std::unique_ptr<Utils::QtcProcess> m_process; std::unique_ptr<Utils::QtcProcess> m_process;
QFutureInterface<void> m_future;
QTimer m_cancelTimer;
QElapsedTimer m_elapsed; QElapsedTimer m_elapsed;
QByteArray m_stdo; QByteArray m_stdo;
QByteArray m_stderr; QByteArray m_stderr;