diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 7353693e16d..03c912e01f7 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -793,6 +793,18 @@ bool FilePath::isWritableDir() const return exists() && fi.isDir() && fi.isWritable(); } +bool FilePath::ensureWritableDir() const +{ + if (needsDevice()) { + QTC_ASSERT(s_deviceHooks.ensureWritableDir, return false); + return s_deviceHooks.ensureWritableDir(*this); + } + const QFileInfo fi{m_data}; + if (exists() && fi.isDir() && fi.isWritable()) + return true; + return QDir().mkpath(m_data); +} + bool FilePath::isExecutableFile() const { if (needsDevice()) { diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 67b40c4eff0..026728bd0b3 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 ensureWritableDir; std::function createDir; std::function(const FilePath &, const QStringList &, QDir::Filters)> dirEntries; std::function fileContents; @@ -117,6 +118,7 @@ public: bool isWritablePath() const { return isWritableDir(); } // Remove. bool isWritableDir() const; + bool ensureWritableDir() const; bool isExecutableFile() const; bool isReadableFile() const; bool isReadableDir() const; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 8ad2ff67f76..2f022773586 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -389,6 +389,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniqueisWritableDirectory(filePath); }; + deviceHooks.ensureWritableDir = [](const FilePath &filePath) { + auto device = DeviceManager::deviceForPath(filePath); + QTC_ASSERT(device, return false); + return device->ensureWritableDirectory(filePath); + }; + deviceHooks.createDir = [](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 17e2616e971..dab6d5618fa 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -245,6 +245,13 @@ bool IDevice::isWritableDirectory(const FilePath &filePath) const return false; } +bool IDevice::ensureWritableDirectory(const FilePath &filePath) const +{ + if (isWritableDirectory(filePath)) + return true; + return createDirectory(filePath); +} + bool IDevice::createDirectory(const Utils::FilePath &filePath) const { Q_UNUSED(filePath); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index ba69c47f9c0..9c628517586 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -240,6 +240,7 @@ public: virtual bool isReadableFile(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; virtual bool createDirectory(const Utils::FilePath &filePath) const; virtual QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters,