From 465259eb3b7ab8949d7f4f6281f3409902feb5c2 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 7 Dec 2023 15:11:30 +0100 Subject: [PATCH] RemoteLinux: Make chmod a part of sftp transfer Task-number: QTCREATORBUG-29971 Change-Id: Icee46c0442f58a054cf15021f64595765909a586 Reviewed-by: Reviewed-by: Christian Kandeler --- .../devicesupport/filetransferinterface.h | 6 +++ src/plugins/remotelinux/genericdeploystep.cpp | 10 +++-- .../remotelinux/genericdirectuploadstep.cpp | 44 ++----------------- src/plugins/remotelinux/linuxdevice.cpp | 10 +++-- 4 files changed, 23 insertions(+), 47 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/filetransferinterface.h b/src/plugins/projectexplorer/devicesupport/filetransferinterface.h index ce4e662db43..d21b22c5080 100644 --- a/src/plugins/projectexplorer/devicesupport/filetransferinterface.h +++ b/src/plugins/projectexplorer/devicesupport/filetransferinterface.h @@ -18,11 +18,17 @@ enum class FileTransferMethod { Default = Sftp }; +enum class FilePermissions { + Default, + ForceExecutable +}; + class PROJECTEXPLORER_EXPORT FileToTransfer { public: Utils::FilePath m_source; Utils::FilePath m_target; + FilePermissions m_targetPermissions = FilePermissions::Default; }; using FilesToTransfer = QList; diff --git a/src/plugins/remotelinux/genericdeploystep.cpp b/src/plugins/remotelinux/genericdeploystep.cpp index df1fcf572f3..1649654ab7e 100644 --- a/src/plugins/remotelinux/genericdeploystep.cpp +++ b/src/plugins/remotelinux/genericdeploystep.cpp @@ -186,9 +186,13 @@ GroupItem GenericDeployStep::deployRecipe() const auto onSetup = [this, storage] { const QList deployableFiles = target()->deploymentData().allFiles(); FilesToTransfer &files = *storage; - for (const DeployableFile &f : deployableFiles) { - if (!ignoreMissingFiles() || f.localFilePath().exists()) - files.append({f.localFilePath(), deviceConfiguration()->filePath(f.remoteFilePath())}); + for (const DeployableFile &file : deployableFiles) { + if (!ignoreMissingFiles() || file.localFilePath().exists()) { + const FilePermissions permissions = file.isExecutable() + ? FilePermissions::ForceExecutable : FilePermissions::Default; + files.append({file.localFilePath(), + deviceConfiguration()->filePath(file.remoteFilePath()), permissions}); + } } if (files.isEmpty()) { addSkipDeploymentMessage(); diff --git a/src/plugins/remotelinux/genericdirectuploadstep.cpp b/src/plugins/remotelinux/genericdirectuploadstep.cpp index 97a8dcd1bb7..9817ce3f0af 100644 --- a/src/plugins/remotelinux/genericdirectuploadstep.cpp +++ b/src/plugins/remotelinux/genericdirectuploadstep.cpp @@ -67,8 +67,6 @@ public: GroupItem statTree(const Storage &storage, FilesToStat filesToStat, StatEndHandler statEndHandler); GroupItem uploadTask(const Storage &storage); - GroupItem chmodTask(const DeployableFile &file); - GroupItem chmodTree(const Storage &storage); BoolAspect incremental{this}; BoolAspect ignoreMissingFiles{this}; @@ -185,8 +183,10 @@ GroupItem GenericDirectUploadStep::uploadTask(const Storage &stor addErrorMessage(message); return SetupResult::StopWithError; } + const FilePermissions permissions = file.isExecutable() + ? FilePermissions::ForceExecutable : FilePermissions::Default; files.append({file.localFilePath(), - deviceConfiguration()->filePath(file.remoteFilePath())}); + deviceConfiguration()->filePath(file.remoteFilePath()), permissions}); } if (files.isEmpty()) { addProgressMessage(Tr::tr("No files need to be uploaded.")); @@ -204,43 +204,6 @@ GroupItem GenericDirectUploadStep::uploadTask(const Storage &stor return FileTransferTask(onSetup, onError, CallDoneIf::Error); } -GroupItem GenericDirectUploadStep::chmodTask(const DeployableFile &file) -{ - const auto onSetup = [=](Process &process) { - process.setCommand({deviceConfiguration()->filePath("chmod"), - {"a+x", Utils::ProcessArgs::quoteArgUnix(file.remoteFilePath())}}); - }; - const auto onError = [=](const Process &process) { - const QString error = process.errorString(); - if (!error.isEmpty()) { - addWarningMessage(Tr::tr("Remote chmod failed for file \"%1\": %2") - .arg(file.remoteFilePath(), error)); - } else if (process.exitCode() != 0) { - addWarningMessage(Tr::tr("Remote chmod failed for file \"%1\": %2") - .arg(file.remoteFilePath(), process.cleanedStdErr())); - } - }; - return ProcessTask(onSetup, onError, CallDoneIf::Error); -} - -GroupItem GenericDirectUploadStep::chmodTree(const Storage &storage) -{ - const auto onSetup = [this, storage](TaskTree &tree) { - QList filesToChmod; - for (const DeployableFile &file : std::as_const(storage->filesToUpload)) { - if (file.isExecutable()) - filesToChmod << file; - } - QList chmodList{finishAllAndSuccess, parallelLimit(MaxConcurrentStatCalls)}; - for (const DeployableFile &file : std::as_const(filesToChmod)) { - QTC_ASSERT(file.isValid(), continue); - chmodList.append(chmodTask(file)); - } - tree.setRecipe({chmodList}); - }; - return TaskTreeTask(onSetup); -} - GroupItem GenericDirectUploadStep::deployRecipe() { const Storage storage; @@ -295,7 +258,6 @@ GroupItem GenericDirectUploadStep::deployRecipe() onGroupSetup(setupHandler), statTree(storage, preFilesToStat, preStatEndHandler), uploadTask(storage), - chmodTree(storage), statTree(storage, postFilesToStat, postStatEndHandler), onGroupDone(doneHandler, CallDoneIf::Success) }; diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index e6239b5db25..6a1ac9aa9fe 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -1327,9 +1327,13 @@ private: sourceFileOrLinkTarget.withNewPath(fi.dir().relativeFilePath(fi.symLinkTarget())); } - batchData += transferCommand(link) + ' ' - + ProcessArgs::quoteArgUnix(sourceFileOrLinkTarget.path()).toLocal8Bit() + ' ' - + ProcessArgs::quoteArgUnix(file.m_target.path()).toLocal8Bit() + '\n'; + const QByteArray source = ProcessArgs::quoteArgUnix(sourceFileOrLinkTarget.path()) + .toLocal8Bit(); + const QByteArray target = ProcessArgs::quoteArgUnix(file.m_target.path()).toLocal8Bit(); + + batchData += transferCommand(link) + ' ' + source + ' ' + target + '\n'; + if (file.m_targetPermissions == FilePermissions::ForceExecutable) + batchData += "chmod 1775 " + target + '\n'; } process().setCommand({sftpBinary, fullConnectionOptions() << "-b" << "-" << host()}); process().setWriteData(batchData);