diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 15503abec47..3de179f8091 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -493,6 +493,11 @@ void SshProcessInterface::handleReadyReadStandardOutput(const QByteArray &output emit readyRead(outputData, {}); } +void SshProcessInterface::handleReadyReadStandardError(const QByteArray &errorData) +{ + emit readyRead({}, errorData); +} + void SshProcessInterface::emitStarted(qint64 processId) { d->m_processId = processId; @@ -641,10 +646,20 @@ void LinuxProcessInterface::handleReadyReadStandardOutput(const QByteArray &outp emitStarted(processId); - if (!m_output.isEmpty()) - emit readyRead(m_output, {}); + if (!m_output.isEmpty() || !m_error.isEmpty()) + emit readyRead(m_output, m_error); m_output.clear(); + m_error.clear(); +} + +void LinuxProcessInterface::handleReadyReadStandardError(const QByteArray &errorData) +{ + if (m_pidParsed) { + emit readyRead({}, errorData); + return; + } + m_error.append(errorData); } SshProcessInterfacePrivate::SshProcessInterfacePrivate(SshProcessInterface *sshInterface, @@ -721,12 +736,16 @@ void SshProcessInterfacePrivate::handleDone() void SshProcessInterfacePrivate::handleReadyReadStandardOutput() { - q->handleReadyReadStandardOutput(m_process.readAllStandardOutput()); // by default emits signal. linux impl does custom parsing for processId and emits delayed start() - only when terminal is off + // By default emits signal. LinuxProcessImpl does custom parsing for processId + // and emits delayed start() - only when terminal is off. + q->handleReadyReadStandardOutput(m_process.readAllStandardOutput()); } void SshProcessInterfacePrivate::handleReadyReadStandardError() { - emit q->readyRead({}, m_process.readAllStandardError()); + // By default emits signal. LinuxProcessImpl buffers the error channel until + // it emits delayed start() - only when terminal is off. + q->handleReadyReadStandardError(m_process.readAllStandardError()); } void SshProcessInterfacePrivate::clearForStart() diff --git a/src/plugins/remotelinux/linuxprocessinterface.h b/src/plugins/remotelinux/linuxprocessinterface.h index 57572f9dbc7..85ea19d4c01 100644 --- a/src/plugins/remotelinux/linuxprocessinterface.h +++ b/src/plugins/remotelinux/linuxprocessinterface.h @@ -45,10 +45,12 @@ private: void handleStarted(qint64 processId) final; void handleReadyReadStandardOutput(const QByteArray &outputData) final; + void handleReadyReadStandardError(const QByteArray &errorData) final; QString fullCommandLine(const Utils::CommandLine &commandLine) const final; QByteArray m_output; + QByteArray m_error; bool m_pidParsed = false; }; diff --git a/src/plugins/remotelinux/sshprocessinterface.h b/src/plugins/remotelinux/sshprocessinterface.h index 1ea9c296fa1..241b4c0c87e 100644 --- a/src/plugins/remotelinux/sshprocessinterface.h +++ b/src/plugins/remotelinux/sshprocessinterface.h @@ -51,6 +51,7 @@ protected: private: virtual void handleStarted(qint64 processId); virtual void handleReadyReadStandardOutput(const QByteArray &outputData); + virtual void handleReadyReadStandardError(const QByteArray &errorData); virtual QString fullCommandLine(const Utils::CommandLine &commandLine) const = 0;