Combine more of local and remote paths in SimpleTarget runner

Change-Id: Ic50d96b582b355807234618884ec45da09e398d4
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
hjk
2022-06-01 17:32:44 +02:00
parent af8f6dc039
commit 3efa0f3961

View File

@@ -1257,7 +1257,6 @@ public:
SimpleTargetRunner *q = nullptr; SimpleTargetRunner *q = nullptr;
bool m_isLocal = true;
bool m_runAsRoot = false; bool m_runAsRoot = false;
QtcProcess m_process; QtcProcess m_process;
@@ -1266,10 +1265,6 @@ public:
QTextCodec::ConverterState m_outputCodecState; QTextCodec::ConverterState m_outputCodecState;
QTextCodec::ConverterState m_errorCodecState; QTextCodec::ConverterState m_errorCodecState;
// Keep track whether we need to emit a finished signal
bool m_processRunning = false;
// Remote
State m_state = Inactive; State m_state = Inactive;
bool m_stopRequested = false; bool m_stopRequested = false;
@@ -1333,7 +1328,9 @@ SimpleTargetRunnerPrivate::~SimpleTargetRunnerPrivate()
void SimpleTargetRunnerPrivate::stop() void SimpleTargetRunnerPrivate::stop()
{ {
m_resultData.m_exitStatus = QProcess::CrashExit; m_resultData.m_exitStatus = QProcess::CrashExit;
if (m_isLocal) {
const bool isLocal = !m_command.executable().needsDevice();
if (isLocal) {
if (!isRunning()) if (!isRunning())
return; return;
m_process.stop(); m_process.stop();
@@ -1346,7 +1343,8 @@ void SimpleTargetRunnerPrivate::stop()
q->appendMessage(tr("User requested stop. Shutting down..."), NormalMessageFormat); q->appendMessage(tr("User requested stop. Shutting down..."), NormalMessageFormat);
switch (m_state) { switch (m_state) {
case Run: case Run:
m_process.terminate(); m_process.stop();
m_process.waitForFinished();
break; break;
case Inactive: case Inactive:
break; break;
@@ -1370,48 +1368,9 @@ qint64 SimpleTargetRunnerPrivate::privateApplicationPID() const
void SimpleTargetRunnerPrivate::handleDone() void SimpleTargetRunnerPrivate::handleDone()
{ {
m_resultData = m_process.resultData(); m_resultData = m_process.resultData();
QTC_ASSERT(m_state == Run, forwardDone(); return);
if (m_isLocal) { m_state = Inactive;
if (m_resultData.m_error == QProcess::UnknownError) {
forwardDone();
return;
}
// TODO: why below handlings are different?
if (m_process.usesTerminal()) {
q->appendMessage(m_process.errorString(), ErrorMessageFormat);
if (m_processRunning && m_process.processId() == 0) {
m_processRunning = false;
m_resultData.m_exitCode = -1; // FIXME: Why?
}
} else {
QString errorString;
switch (m_resultData.m_error) {
case QProcess::FailedToStart:
errorString = tr("Failed to start program. Path or permissions wrong?");
break;
case QProcess::Crashed:
m_resultData.m_exitStatus = QProcess::CrashExit;
break;
default:
errorString = tr("Some error has occurred while running the program.");
}
if (!errorString.isEmpty())
q->appendMessage(errorString, ErrorMessageFormat);
if (m_processRunning && !isRunning()) {
m_processRunning = false;
m_resultData.m_exitCode = -1;
}
}
} else {
QTC_ASSERT(m_state == Run, forwardDone(); return);
if (m_resultData.m_error == QProcess::FailedToStart) {
m_resultData.m_exitStatus = QProcess::CrashExit;
} else if (m_resultData.m_exitStatus == QProcess::CrashExit) {
m_resultData.m_error = QProcess::Crashed;
}
m_state = Inactive;
}
forwardDone(); forwardDone();
} }
@@ -1433,19 +1392,18 @@ void SimpleTargetRunnerPrivate::handleStandardError()
void SimpleTargetRunnerPrivate::start() void SimpleTargetRunnerPrivate::start()
{ {
m_isLocal = !m_command.executable().needsDevice(); const bool isLocal = !m_command.executable().needsDevice();
m_resultData = {}; m_resultData = {};
QTC_ASSERT(m_state == Inactive, return);
if (m_isLocal) { if (isLocal) {
Environment env = m_environment; Environment env = m_environment;
if (m_runAsRoot) if (m_runAsRoot)
RunControl::provideAskPassEntry(env); RunControl::provideAskPassEntry(env);
m_process.setEnvironment(env); m_process.setEnvironment(env);
m_processRunning = true;
WinDebugInterface::startIfNeeded(); WinDebugInterface::startIfNeeded();
CommandLine cmdLine = m_command; CommandLine cmdLine = m_command;
@@ -1458,37 +1416,27 @@ void SimpleTargetRunnerPrivate::start()
m_process.setRunAsRoot(m_runAsRoot); m_process.setRunAsRoot(m_runAsRoot);
m_process.setCommand(cmdLine); m_process.setCommand(cmdLine);
} else {
QTC_ASSERT(m_state == Inactive, return);
const IDevice::ConstPtr device = DeviceManager::deviceForPath(m_command.executable());
if (!device) {
m_resultData.m_errorString = tr("Cannot run: No device.");
m_resultData.m_error = QProcess::FailedToStart;
m_resultData.m_exitStatus = QProcess::CrashExit;
forwardDone();
return;
}
if (!device->isEmptyCommandAllowed() && m_command.isEmpty()) {
m_resultData.m_errorString = tr("Cannot run: No command given.");
m_resultData.m_error = QProcess::FailedToStart;
m_resultData.m_exitStatus = QProcess::CrashExit;
forwardDone();
return;
}
m_state = Run;
m_stopRequested = false;
m_process.setCommand(m_command);
m_process.setEnvironment(m_environment);
m_process.setExtraData(m_extraData);
} }
const IDevice::ConstPtr device = DeviceManager::deviceForPath(m_command.executable());
if (device && !device->isEmptyCommandAllowed() && m_command.isEmpty()) {
m_resultData.m_errorString = tr("Cannot run: No command given.");
m_resultData.m_error = QProcess::FailedToStart;
m_resultData.m_exitStatus = QProcess::CrashExit;
forwardDone();
return;
}
m_stopRequested = false;
m_process.setCommand(m_command);
m_process.setEnvironment(m_environment);
m_process.setExtraData(m_extraData);
m_state = Run;
m_process.setWorkingDirectory(m_workingDirectory); m_process.setWorkingDirectory(m_workingDirectory);
if (m_isLocal) if (isLocal)
m_outputCodec = QTextCodec::codecForLocale(); m_outputCodec = QTextCodec::codecForLocale();
else else
m_outputCodec = QTextCodec::codecForName("utf8"); m_outputCodec = QTextCodec::codecForName("utf8");