diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index c2c4730f1e3..d219471c871 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -1231,6 +1231,15 @@ QFile::Permissions FilePath::permissions() const return toFileInfo().permissions(); } +bool FilePath::setPermissions(QFile::Permissions permissions) const +{ + if (needsDevice()) { + QTC_ASSERT(s_deviceHooks.setPermissions, return false); + return s_deviceHooks.setPermissions(*this, permissions); + } + return QFile(m_data).setPermissions(permissions); +} + OsType FilePath::osType() const { if (needsDevice()) { diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index f31746ddf7f..46f855365d1 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -137,6 +137,7 @@ public: bool isNewerThan(const QDateTime &timeStamp) const; QDateTime lastModified() const; QFile::Permissions permissions() const; + bool setPermissions(QFile::Permissions permissions) const; OsType osType() const; bool removeFile() const; bool removeRecursively(QString *error = nullptr) const; diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 2a55f28f4a4..2fdc0d86fbb 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -84,6 +84,7 @@ public: std::function writeFileContents; std::function lastModified; std::function permissions; + std::function setPermissions; std::function osType; std::function environment; std::function fileSize; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 256939c4adf..f5abceb6824 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1294,6 +1294,20 @@ QFileDevice::Permissions DockerDevice::permissions(const FilePath &filePath) con return perm; } +bool DockerDevice::setPermissions(const FilePath &filePath, QFileDevice::Permissions permissions) const +{ + QTC_ASSERT(handlesFile(filePath), return {}); + tryCreateLocalFileAccess(); + if (hasLocalFileAccess()) { + const FilePath localAccess = mapToLocalAccess(filePath); + LOG("Set permissions? " << filePath.toUserOutput() << localAccess.toUserOutput() << localAccess.permissions()); + return localAccess.setPermissions(permissions); + } + + QTC_CHECK(false); // FIXME: Implement. + return false; +} + static FilePaths filterEntriesHelper(const FilePath &base, const QStringList &entries, const QStringList &nameFilters, diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index f8e24ff12e4..890bc19aca8 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -101,6 +101,7 @@ public: void runProcess(Utils::QtcProcess &process) const override; qint64 fileSize(const Utils::FilePath &filePath) const override; QFileDevice::Permissions permissions(const Utils::FilePath &filePath) const override; + bool setPermissions(const Utils::FilePath &filePath, QFileDevice::Permissions permissions) const override; Utils::Environment systemEnvironment() const override; diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index 0d2a0f4ad1c..8553f932f46 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -193,6 +193,18 @@ qint64 DesktopDevice::fileSize(const FilePath &filePath) const return filePath.fileSize(); } +QFile::Permissions DesktopDevice::permissions(const FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return {}); + return filePath.permissions(); +} + +bool DesktopDevice::setPermissions(const FilePath &filePath, QFile::Permissions permissions) const +{ + QTC_ASSERT(handlesFile(filePath), return {}); + return filePath.setPermissions(permissions); +} + Environment DesktopDevice::systemEnvironment() const { return Environment::systemEnvironment(); diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.h b/src/plugins/projectexplorer/devicesupport/desktopdevice.h index 30c018812b9..1e0b59d7daf 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.h +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.h @@ -80,6 +80,8 @@ public: QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; qint64 fileSize(const Utils::FilePath &filePath) const override; + QFile::Permissions permissions(const Utils::FilePath &filePath) const override; + bool setPermissions(const Utils::FilePath &filePath, QFile::Permissions) const override; protected: DesktopDevice(); diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 1613644675f..eee62a80eed 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -513,6 +513,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniquepermissions(filePath); }; + deviceHooks.setPermissions = [](const FilePath &filePath, QFile::Permissions permissions) { + auto device = DeviceManager::deviceForPath(filePath); + QTC_ASSERT(device, return false); + return device->setPermissions(filePath, permissions); + }; + deviceHooks.osType = [](const FilePath &filePath) { auto device = DeviceManager::deviceForPath(filePath); QTC_ASSERT(device, return OsTypeOther); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 67b39c18048..a61250272a6 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -397,6 +397,13 @@ QFileDevice::Permissions IDevice::permissions(const FilePath &filePath) const return {}; } +bool IDevice::setPermissions(const FilePath &filePath, QFile::Permissions) const +{ + Q_UNUSED(filePath); + QTC_CHECK(false); + return false; +} + void IDevice::runProcess(QtcProcess &process) const { Q_UNUSED(process); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 2c53818e4f9..4f399d8cc65 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -265,6 +265,7 @@ public: virtual bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const; virtual QDateTime lastModified(const Utils::FilePath &filePath) const; virtual QFile::Permissions permissions(const Utils::FilePath &filePath) const; + virtual bool setPermissions(const Utils::FilePath &filePath, QFile::Permissions) const; virtual void runProcess(Utils::QtcProcess &process) const; virtual Utils::Environment systemEnvironment() const; virtual qint64 fileSize(const Utils::FilePath &filePath) const;