forked from qt-creator/qt-creator
MesonProcess: Reuse ProcessProgress
Change-Id: I59c9c7a238731d50e1a6a4a60ee2aef6f2728d74 Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user