From 6902ddc535c6478d835117b3d84a8db53472047f Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 22 Jun 2021 07:09:00 +0200 Subject: [PATCH] Utils: add FilePath::isWritableFile Change-Id: Ic6ced87fcee92deadf5a117ea7e987f1c877f83a Reviewed-by: hjk --- src/libs/utils/fileutils.cpp | 10 ++++++++++ src/libs/utils/fileutils.h | 2 ++ src/plugins/docker/dockerdevice.cpp | 16 ++++++++++++++++ src/plugins/docker/dockerdevice.h | 1 + .../devicesupport/devicemanager.cpp | 6 ++++++ .../projectexplorer/devicesupport/idevice.cpp | 7 +++++++ .../projectexplorer/devicesupport/idevice.h | 1 + 7 files changed, 43 insertions(+) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 7af7f413479..46395830f33 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -875,6 +875,16 @@ bool FilePath::isWritableDir() const return exists() && fi.isDir() && fi.isWritable(); } +bool FilePath::isWritableFile() const +{ + if (needsDevice()) { + QTC_ASSERT(s_deviceHooks.isWritableFile, return false); + return s_deviceHooks.isWritableFile(*this); + } + const QFileInfo fi{m_data}; + return fi.exists() && fi.isWritable() && !fi.isDir(); +} + bool FilePath::ensureWritableDir() const { if (needsDevice()) { diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 17bc3e7a142..b02b7f095f9 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -73,6 +73,7 @@ public: std::function isReadableFile; std::function isReadableDir; std::function isWritableDir; + std::function isWritableFile; std::function ensureWritableDir; std::function createDir; std::function exists; @@ -130,6 +131,7 @@ public: bool isWritablePath() const { return isWritableDir(); } // Remove. bool isWritableDir() const; + bool isWritableFile() const; bool ensureWritableDir() const; bool isExecutableFile() const; bool isReadableFile() const; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 22d64ef07d1..a9e85d74b87 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -774,6 +774,22 @@ bool DockerDevice::isReadableFile(const FilePath &filePath) const return exitCode == 0; } +bool DockerDevice::isWritableFile(const Utils::FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return false); + tryCreateLocalFileAccess(); + if (hasLocalFileAccess()) { + const FilePath localAccess = mapToLocalAccess(filePath); + const bool res = localAccess.isWritableFile(); + LOG("WritableFile? " << filePath.toUserOutput() << localAccess.toUserOutput() << res); + return res; + } + const QString path = filePath.path(); + const CommandLine cmd("test", {"-w", path, "-a", "-f", path}); + const int exitCode = d->runSynchronously(cmd); + return exitCode == 0; +} + bool DockerDevice::isReadableDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index ea59ca1cd16..9e6f856d1cf 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -76,6 +76,7 @@ public: bool handlesFile(const Utils::FilePath &filePath) const override; bool isExecutableFile(const Utils::FilePath &filePath) const override; bool isReadableFile(const Utils::FilePath &filePath) const override; + bool isWritableFile(const Utils::FilePath &filePath) const override; bool isReadableDirectory(const Utils::FilePath &filePath) const override; bool isWritableDirectory(const Utils::FilePath &filePath) const override; bool createDirectory(const Utils::FilePath &filePath) const override; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index a18d9068807..abdd4f446cb 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -399,6 +399,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniqueisWritableDirectory(filePath); }; + deviceHooks.isWritableFile = [](const FilePath &filePath) { + auto device = DeviceManager::deviceForPath(filePath); + QTC_ASSERT(device, return false); + return device->isWritableFile(filePath); + }; + deviceHooks.ensureWritableDir = [](const FilePath &filePath) { auto device = DeviceManager::deviceForPath(filePath); QTC_ASSERT(device, return false); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 5cee1ffad3b..1528590a785 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -232,6 +232,13 @@ bool IDevice::isReadableFile(const FilePath &filePath) const return false; } +bool IDevice::isWritableFile(const Utils::FilePath &filePath) const +{ + Q_UNUSED(filePath); + QTC_CHECK(false); + return false; +} + bool IDevice::isReadableDirectory(const FilePath &filePath) const { Q_UNUSED(filePath); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 433f6d94645..1ec53b63e4a 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -238,6 +238,7 @@ public: virtual bool handlesFile(const Utils::FilePath &filePath) const; virtual bool isExecutableFile(const Utils::FilePath &filePath) const; virtual bool isReadableFile(const Utils::FilePath &filePath) const; + virtual bool isWritableFile(const Utils::FilePath &filePath) const; virtual bool isReadableDirectory(const Utils::FilePath &filePath) const; virtual bool isWritableDirectory(const Utils::FilePath &filePath) const; virtual bool ensureWritableDirectory(const Utils::FilePath &filePath) const;