diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index d90d01e3ab8..93b93ca416f 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -448,6 +448,11 @@ void SshProcessInterface::handleStarted(qint64 processId) emitStarted(processId); } +void SshProcessInterface::handleDone(const ProcessResultData &resultData) +{ + emit done(resultData); +} + void SshProcessInterface::handleReadyReadStandardOutput(const QByteArray &outputData) { emit readyRead(outputData, {}); @@ -580,6 +585,20 @@ void LinuxProcessInterface::handleStarted(qint64 processId) emitStarted(processId); } +void LinuxProcessInterface::handleDone(const ProcessResultData &resultData) +{ + ProcessResultData finalData = resultData; + if (!m_pidParsed) { + finalData.m_error = QProcess::FailedToStart; + if (!m_error.isEmpty()) { + if (!finalData.m_errorString.isEmpty()) + finalData.m_errorString += "\n"; + finalData.m_errorString += QString::fromLocal8Bit(m_error); + } + } + emit done(finalData); +} + void LinuxProcessInterface::handleReadyReadStandardOutput(const QByteArray &outputData) { if (m_pidParsed) { @@ -690,8 +709,9 @@ void SshProcessInterfacePrivate::handleStarted() void SshProcessInterfacePrivate::handleDone() { - m_connectionHandle.reset(); - emit q->done(m_process.resultData()); + if (m_connectionHandle) // TODO: should it disconnect from signals first? + m_connectionHandle.release()->deleteLater(); + q->handleDone(m_process.resultData()); } void SshProcessInterfacePrivate::handleReadyReadStandardOutput() diff --git a/src/plugins/remotelinux/linuxprocessinterface.h b/src/plugins/remotelinux/linuxprocessinterface.h index 85ea19d4c01..c6ee39384b6 100644 --- a/src/plugins/remotelinux/linuxprocessinterface.h +++ b/src/plugins/remotelinux/linuxprocessinterface.h @@ -44,6 +44,7 @@ private: void sendControlSignal(Utils::ControlSignal controlSignal) override; void handleStarted(qint64 processId) final; + void handleDone(const Utils::ProcessResultData &resultData); void handleReadyReadStandardOutput(const QByteArray &outputData) final; void handleReadyReadStandardError(const QByteArray &errorData) final; diff --git a/src/plugins/remotelinux/rsyncdeploystep.cpp b/src/plugins/remotelinux/rsyncdeploystep.cpp index 99eeaf413cf..b4d9929d76b 100644 --- a/src/plugins/remotelinux/rsyncdeploystep.cpp +++ b/src/plugins/remotelinux/rsyncdeploystep.cpp @@ -51,12 +51,23 @@ public: { connect(&m_mkdir, &QtcProcess::done, this, [this] { if (m_mkdir.result() != ProcessResult::FinishedWithSuccess) { - emit errorMessage(tr("Failed to create remote directories: %1").arg(m_mkdir.stdErr())); + QString finalMessage = m_mkdir.errorString(); + const QString stdErr = m_mkdir.stdErr(); + if (!stdErr.isEmpty()) { + if (!finalMessage.isEmpty()) + finalMessage += '\n'; + finalMessage += stdErr; + } + emit errorMessage(tr("Deploy via rsync: failed to create remote directories:") + + '\n' + finalMessage); setFinished(); return; } deployFiles(); }); + connect(&m_mkdir, &QtcProcess::readyReadStandardError, this, [this] { + emit stdErrData(QString::fromLocal8Bit(m_mkdir.readAllStandardError())); + }); connect(&m_fileTransfer, &FileTransfer::progress, this, &AbstractRemoteLinuxDeployService::stdOutData); connect(&m_fileTransfer, &FileTransfer::done, this, [this](const ProcessResultData &result) { diff --git a/src/plugins/remotelinux/sshprocessinterface.h b/src/plugins/remotelinux/sshprocessinterface.h index 241b4c0c87e..e60009ded2a 100644 --- a/src/plugins/remotelinux/sshprocessinterface.h +++ b/src/plugins/remotelinux/sshprocessinterface.h @@ -50,6 +50,7 @@ protected: private: virtual void handleStarted(qint64 processId); + virtual void handleDone(const Utils::ProcessResultData &resultData); virtual void handleReadyReadStandardOutput(const QByteArray &outputData); virtual void handleReadyReadStandardError(const QByteArray &errorData);