diff --git a/src/plugins/remotelinux/rsyncdeploystep.cpp b/src/plugins/remotelinux/rsyncdeploystep.cpp index 317b08bb77c..83d729108b2 100644 --- a/src/plugins/remotelinux/rsyncdeploystep.cpp +++ b/src/plugins/remotelinux/rsyncdeploystep.cpp @@ -7,6 +7,7 @@ #include "remotelinux_constants.h" #include "remotelinuxtr.h" +#include #include #include #include @@ -16,6 +17,7 @@ #include #include +#include #include #include @@ -87,30 +89,42 @@ bool RsyncDeployStep::isDeploymentNecessary() const GroupItem RsyncDeployStep::mkdirTask() { - const auto setupHandler = [this](Process &process) { - QStringList remoteDirs; - for (const FileToTransfer &file : std::as_const(m_files)) - remoteDirs << file.m_target.parentDir().path(); - remoteDirs.sort(); - remoteDirs.removeDuplicates(); - process.setCommand({deviceConfiguration()->filePath("mkdir"), - QStringList("-p") + remoteDirs}); - connect(&process, &Process::readyReadStandardError, this, [this, proc = &process] { - handleStdErrData(QString::fromLocal8Bit(proc->readAllRawStandardError())); + using ResultType = expected_str; + + const auto onSetup = [files = m_files](Async &async) { + FilePaths remoteDirs; + for (const FileToTransfer &file : std::as_const(files)) + remoteDirs << file.m_target.parentDir(); + + FilePath::sort(remoteDirs); + FilePath::removeDuplicates(remoteDirs); + + async.setConcurrentCallData([remoteDirs](QPromise &promise) { + for (auto dir : remoteDirs) { + const expected_str result = dir.ensureWritableDir(); + promise.addResult(result); + if (!result) + promise.future().cancel(); + } }); }; - const auto errorHandler = [this](const Process &process) { - QString finalMessage = process.errorString(); - const QString stdErr = process.cleanedStdErr(); - if (!stdErr.isEmpty()) { - if (!finalMessage.isEmpty()) - finalMessage += '\n'; - finalMessage += stdErr; + + const auto onError = [this](const Async &async) { + const int numResults = async.future().resultCount(); + if (numResults == 0) { + addErrorMessage( + Tr::tr("Unknown error occurred while trying to create remote directories") + '\n'); + return; + } + + for (int i = 0; i < numResults; ++i) { + const auto result = async.future().resultAt(i); + if (!result.has_value()) + addErrorMessage(result.error()); } - addErrorMessage(Tr::tr("Deploy via rsync: failed to create remote directories:") - + '\n' + finalMessage); }; - return ProcessTask(setupHandler, {}, errorHandler); + + return AsyncTask(onSetup, {}, onError); } GroupItem RsyncDeployStep::transferTask()