diff options
Diffstat (limited to 'src/plugins/remotelinux/rsyncdeploystep.cpp')
-rw-r--r-- | src/plugins/remotelinux/rsyncdeploystep.cpp | 131 |
1 files changed, 59 insertions, 72 deletions
diff --git a/src/plugins/remotelinux/rsyncdeploystep.cpp b/src/plugins/remotelinux/rsyncdeploystep.cpp index b20eaf90499..84eb47b8cc1 100644 --- a/src/plugins/remotelinux/rsyncdeploystep.cpp +++ b/src/plugins/remotelinux/rsyncdeploystep.cpp @@ -16,21 +16,21 @@ #include <projectexplorer/target.h> #include <utils/algorithm.h> +#include <utils/process.h> #include <utils/processinterface.h> -#include <utils/qtcprocess.h> using namespace ProjectExplorer; +using namespace Tasking; using namespace Utils; -using namespace Utils::Tasking; namespace RemoteLinux { -class RsyncDeployService : public AbstractRemoteLinuxDeployService +// RsyncDeployStep + +class RsyncDeployStep : public AbstractRemoteLinuxDeployStep { public: - void setDeployableFiles(const QList<DeployableFile> &files); - void setIgnoreMissingFiles(bool ignore) { m_ignoreMissingFiles = ignore; } - void setFlags(const QString &flags) { m_flags = flags; } + RsyncDeployStep(BuildStepList *bsl, Id id); private: bool isDeploymentNecessary() const final; @@ -43,23 +43,51 @@ private: QString m_flags; }; -void RsyncDeployService::setDeployableFiles(const QList<DeployableFile> &files) +RsyncDeployStep::RsyncDeployStep(BuildStepList *bsl, Id id) + : AbstractRemoteLinuxDeployStep(bsl, id) { - m_files.clear(); - for (const DeployableFile &f : files) - m_files.append({f.localFilePath(), deviceConfiguration()->filePath(f.remoteFilePath())}); + auto flags = addAspect<StringAspect>(); + flags->setDisplayStyle(StringAspect::LineEditDisplay); + flags->setSettingsKey("RemoteLinux.RsyncDeployStep.Flags"); + flags->setLabelText(Tr::tr("Flags:")); + flags->setValue(FileTransferSetupData::defaultRsyncFlags()); + + auto ignoreMissingFiles = addAspect<BoolAspect>(); + ignoreMissingFiles->setSettingsKey("RemoteLinux.RsyncDeployStep.IgnoreMissingFiles"); + ignoreMissingFiles->setLabel(Tr::tr("Ignore missing files:"), + BoolAspect::LabelPlacement::InExtraLabel); + ignoreMissingFiles->setValue(false); + + setInternalInitializer([this, ignoreMissingFiles, flags] { + if (BuildDeviceKitAspect::device(kit()) == DeviceKitAspect::device(kit())) { + // rsync transfer on the same device currently not implemented + // and typically not wanted. + return CheckResult::failure( + Tr::tr("rsync is only supported for transfers between different devices.")); + } + m_ignoreMissingFiles = ignoreMissingFiles->value(); + m_flags = flags->value(); + return isDeploymentPossible(); + }); + + setRunPreparer([this] { + const QList<DeployableFile> files = target()->deploymentData().allFiles(); + m_files.clear(); + for (const DeployableFile &f : files) + m_files.append({f.localFilePath(), deviceConfiguration()->filePath(f.remoteFilePath())}); + }); } -bool RsyncDeployService::isDeploymentNecessary() const +bool RsyncDeployStep::isDeploymentNecessary() const { if (m_ignoreMissingFiles) Utils::erase(m_files, [](const FileToTransfer &file) { return !file.m_source.exists(); }); return !m_files.empty(); } -TaskItem RsyncDeployService::mkdirTask() +TaskItem RsyncDeployStep::mkdirTask() { - const auto setupHandler = [this](QtcProcess &process) { + const auto setupHandler = [this](Process &process) { QStringList remoteDirs; for (const FileToTransfer &file : std::as_const(m_files)) remoteDirs << file.m_target.parentDir().path(); @@ -67,11 +95,11 @@ TaskItem RsyncDeployService::mkdirTask() remoteDirs.removeDuplicates(); process.setCommand({deviceConfiguration()->filePath("mkdir"), QStringList("-p") + remoteDirs}); - connect(&process, &QtcProcess::readyReadStandardError, this, [this, proc = &process] { - emit stdErrData(QString::fromLocal8Bit(proc->readAllRawStandardError())); + connect(&process, &Process::readyReadStandardError, this, [this, proc = &process] { + handleStdErrData(QString::fromLocal8Bit(proc->readAllRawStandardError())); }); }; - const auto errorHandler = [this](const QtcProcess &process) { + const auto errorHandler = [this](const Process &process) { QString finalMessage = process.errorString(); const QString stdErr = process.cleanedStdErr(); if (!stdErr.isEmpty()) { @@ -79,87 +107,46 @@ TaskItem RsyncDeployService::mkdirTask() finalMessage += '\n'; finalMessage += stdErr; } - emit errorMessage(Tr::tr("Deploy via rsync: failed to create remote directories:") - + '\n' + finalMessage); + addErrorMessage(Tr::tr("Deploy via rsync: failed to create remote directories:") + + '\n' + finalMessage); }; - return Process(setupHandler, {}, errorHandler); + return ProcessTask(setupHandler, {}, errorHandler); } -TaskItem RsyncDeployService::transferTask() +TaskItem RsyncDeployStep::transferTask() { const auto setupHandler = [this](FileTransfer &transfer) { transfer.setTransferMethod(FileTransferMethod::Rsync); transfer.setRsyncFlags(m_flags); transfer.setFilesToTransfer(m_files); connect(&transfer, &FileTransfer::progress, - this, &AbstractRemoteLinuxDeployService::stdOutData); + this, &AbstractRemoteLinuxDeployStep::handleStdOutData); }; const auto errorHandler = [this](const FileTransfer &transfer) { const ProcessResultData result = transfer.resultData(); if (result.m_error == QProcess::FailedToStart) { - emit errorMessage(Tr::tr("rsync failed to start: %1").arg(result.m_errorString)); + addErrorMessage(Tr::tr("rsync failed to start: %1").arg(result.m_errorString)); } else if (result.m_exitStatus == QProcess::CrashExit) { - emit errorMessage(Tr::tr("rsync crashed.")); + addErrorMessage(Tr::tr("rsync crashed.")); } else if (result.m_exitCode != 0) { - emit errorMessage(Tr::tr("rsync failed with exit code %1.").arg(result.m_exitCode) - + "\n" + result.m_errorString); + addErrorMessage(Tr::tr("rsync failed with exit code %1.").arg(result.m_exitCode) + + "\n" + result.m_errorString); } }; - return Transfer(setupHandler, {}, errorHandler); + return FileTransferTask(setupHandler, {}, errorHandler); } -Group RsyncDeployService::deployRecipe() +Group RsyncDeployStep::deployRecipe() { return Group { mkdirTask(), transferTask() }; } -// RsyncDeployStep - -RsyncDeployStep::RsyncDeployStep(BuildStepList *bsl, Id id) - : AbstractRemoteLinuxDeployStep(bsl, id) -{ - auto service = new RsyncDeployService; - setDeployService(service); - - auto flags = addAspect<StringAspect>(); - flags->setDisplayStyle(StringAspect::LineEditDisplay); - flags->setSettingsKey("RemoteLinux.RsyncDeployStep.Flags"); - flags->setLabelText(Tr::tr("Flags:")); - flags->setValue(FileTransferSetupData::defaultRsyncFlags()); - - auto ignoreMissingFiles = addAspect<BoolAspect>(); - ignoreMissingFiles->setSettingsKey("RemoteLinux.RsyncDeployStep.IgnoreMissingFiles"); - ignoreMissingFiles->setLabel(Tr::tr("Ignore missing files:"), - BoolAspect::LabelPlacement::InExtraLabel); - ignoreMissingFiles->setValue(false); - - setInternalInitializer([this, service, flags, ignoreMissingFiles] { - if (BuildDeviceKitAspect::device(kit()) == DeviceKitAspect::device(kit())) { - // rsync transfer on the same device currently not implemented - // and typically not wanted. - return CheckResult::failure( - Tr::tr("rsync is only supported for transfers between different devices.")); - } - service->setIgnoreMissingFiles(ignoreMissingFiles->value()); - service->setFlags(flags->value()); - return service->isDeploymentPossible(); - }); - - setRunPreparer([this, service] { - service->setDeployableFiles(target()->deploymentData().allFiles()); - }); -} - -RsyncDeployStep::~RsyncDeployStep() = default; - -Utils::Id RsyncDeployStep::stepId() -{ - return Constants::RsyncDeployStepId; -} +// Factory -QString RsyncDeployStep::displayName() +RsyncDeployStepFactory::RsyncDeployStepFactory() { - return Tr::tr("Deploy files via rsync"); + registerStep<RsyncDeployStep>(Constants::RsyncDeployStepId); + setDisplayName(Tr::tr("Deploy files via rsync")); } } // RemoteLinux |