AbstractProcessStep: Move process done handler from QMakeStep

The done handler is going to be used for other processes, too.

Change-Id: I3c60ec75656aa45bd57ec3ca8336cf310c78bd3e
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2023-07-11 19:35:16 +02:00
parent 8ba6f11e9c
commit ae01e13d32
3 changed files with 36 additions and 42 deletions

View File

@@ -185,7 +185,14 @@ void AbstractProcessStep::doRun()
d->m_process.reset(new Process); d->m_process.reset(new Process);
setupProcess(d->m_process.get()); setupProcess(d->m_process.get());
connect(d->m_process.get(), &Process::done, this, &AbstractProcessStep::handleProcessDone); connect(d->m_process.get(), &Process::done, this, [this] {
if (d->m_process->error() == QProcess::FailedToStart) {
processStartupFailed();
d->m_process.release()->deleteLater();
return;
}
d->cleanUp(d->m_process->exitCode(), d->m_process->exitStatus());
});
d->m_process->start(); d->m_process->start();
} }
@@ -241,6 +248,29 @@ void AbstractProcessStep::setupProcess(Process *process)
}); });
} }
void AbstractProcessStep::handleProcessDone(const Process &process)
{
const QString command = displayedParameters()->effectiveCommand().toUserOutput();
if (process.result() == ProcessResult::FinishedWithSuccess) {
emit addOutput(Tr::tr("The process \"%1\" exited normally.").arg(command),
OutputFormat::NormalMessage);
} else if (process.result() == ProcessResult::FinishedWithError) {
emit addOutput(Tr::tr("The process \"%1\" exited with code %2.")
.arg(command, QString::number(process.exitCode())),
OutputFormat::ErrorMessage);
} else if (process.result() == ProcessResult::StartFailed) {
emit addOutput(Tr::tr("Could not start process \"%1\" %2.")
.arg(command, displayedParameters()->prettyArguments()),
OutputFormat::ErrorMessage);
const QString errorString = process.errorString();
if (!errorString.isEmpty())
emit addOutput(errorString, OutputFormat::ErrorMessage);
} else {
emit addOutput(Tr::tr("The process \"%1\" crashed.").arg(command),
OutputFormat::ErrorMessage);
}
}
void AbstractProcessStep::runTaskTree(const Group &recipe) void AbstractProcessStep::runTaskTree(const Group &recipe)
{ {
setupStreams(); setupStreams();
@@ -375,15 +405,4 @@ void AbstractProcessStep::finish(ProcessResult result)
emit finished(isSuccess(result)); emit finished(isSuccess(result));
} }
void AbstractProcessStep::handleProcessDone()
{
QTC_ASSERT(d->m_process.get(), return);
if (d->m_process->error() == QProcess::FailedToStart) {
processStartupFailed();
d->m_process.release()->deleteLater();
return;
}
d->cleanUp(d->m_process->exitCode(), d->m_process->exitStatus());
}
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -52,13 +52,13 @@ protected:
bool checkWorkingDirectory(); bool checkWorkingDirectory();
void setupProcess(Utils::Process *process); void setupProcess(Utils::Process *process);
void handleProcessDone(const Utils::Process &process);
void runTaskTree(const Tasking::Group &recipe); void runTaskTree(const Tasking::Group &recipe);
ProcessParameters *displayedParameters() const; ProcessParameters *displayedParameters() const;
private: private:
void setupStreams(); void setupStreams();
void processStartupFailed(); void processStartupFailed();
void handleProcessDone();
class Private; class Private;
Private *d; Private *d;

View File

@@ -281,8 +281,6 @@ void QMakeStep::doRun()
if (!checkWorkingDirectory()) if (!checkWorkingDirectory())
return; return;
m_needToRunQMake = false;
using namespace Tasking; using namespace Tasking;
const auto setupQMake = [this](Process &process) { const auto setupQMake = [this](Process &process) {
@@ -301,39 +299,16 @@ void QMakeStep::doRun()
setupProcess(&process); setupProcess(&process);
}; };
const auto onProcessDone = [this](const Process &) { const auto onProcessDone = [this](const Process &process) { handleProcessDone(process); };
const QString command = displayedParameters()->effectiveCommand().toUserOutput();
emit addOutput(Tr::tr("The process \"%1\" exited normally.").arg(command),
OutputFormat::NormalMessage);
};
const auto onProcessError = [this](const Process &process) {
const QString command = displayedParameters()->effectiveCommand().toUserOutput();
if (process.result() == ProcessResult::FinishedWithError) {
emit addOutput(Tr::tr("The process \"%1\" exited with code %2.")
.arg(command, QString::number(process.exitCode())),
OutputFormat::ErrorMessage);
} else if (process.result() == ProcessResult::StartFailed) {
emit addOutput(Tr::tr("Could not start process \"%1\" %2.")
.arg(command, displayedParameters()->prettyArguments()),
OutputFormat::ErrorMessage);
const QString errorString = process.errorString();
if (!errorString.isEmpty())
emit addOutput(errorString, OutputFormat::ErrorMessage);
} else {
emit addOutput(Tr::tr("The process \"%1\" crashed.").arg(command),
OutputFormat::ErrorMessage);
}
m_needToRunQMake = true;
};
const auto onDone = [this] { const auto onDone = [this] {
emit buildConfiguration()->buildDirectoryInitialized(); emit buildConfiguration()->buildDirectoryInitialized();
m_needToRunQMake = false;
}; };
QList<GroupItem> processList = {ProcessTask(setupQMake, onProcessDone, onProcessError)}; QList<GroupItem> processList = {ProcessTask(setupQMake, onProcessDone, onProcessDone)};
if (m_runMakeQmake) if (m_runMakeQmake)
processList << ProcessTask(setupMakeQMake, onProcessDone, onProcessError); processList << ProcessTask(setupMakeQMake, onProcessDone, onProcessDone);
processList << onGroupDone(onDone); processList << onGroupDone(onDone);
runTaskTree(Group(processList)); runTaskTree(Group(processList));