From e8521e6fe11f59d0fc816d8b7fa6780dc6469af6 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 14 Jul 2021 07:41:23 +0200 Subject: [PATCH] Utils: Add/fix FilePath::isFile and FilePath::isDir In general, the more specific isReadableFile etc are preferred, but for porting a 1:1 match to QFileInfo functionality is helpful. Change-Id: I5b575ca9a5053f13f63c0fbe0e3dcc222494280f Reviewed-by: David Schulz --- src/libs/utils/fileutils.cpp | 26 +++++++++++---- src/libs/utils/fileutils.h | 5 ++- src/plugins/docker/dockerdevice.cpp | 32 +++++++++++++++++++ src/plugins/docker/dockerdevice.h | 2 ++ .../devicesupport/desktopdevice.cpp | 12 +++++++ .../devicesupport/desktopdevice.h | 2 ++ .../devicesupport/devicemanager.cpp | 12 +++++++ .../projectexplorer/devicesupport/idevice.cpp | 14 ++++++++ .../projectexplorer/devicesupport/idevice.h | 2 ++ 9 files changed, 100 insertions(+), 7 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 95e935272c3..ca397b0c0d4 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -939,6 +939,26 @@ bool FilePath::isReadableDir() const return fi.exists() && fi.isReadable() && fi.isDir(); } +bool FilePath::isFile() const +{ + if (needsDevice()) { + QTC_ASSERT(s_deviceHooks.isFile, return false); + return s_deviceHooks.isFile(*this); + } + const QFileInfo fi{m_data}; + return fi.exists() && fi.isFile(); +} + +bool FilePath::isDir() const +{ + if (needsDevice()) { + QTC_ASSERT(s_deviceHooks.isDir, return false); + return s_deviceHooks.isDir(*this); + } + const QFileInfo fi{m_data}; + return fi.exists() && fi.isDir(); +} + bool FilePath::createDir() const { if (needsDevice()) { @@ -1244,12 +1264,6 @@ bool FilePath::endsWith(const QString &s) const return m_data.endsWith(s, caseSensitivity()); } -bool FilePath::isDir() const -{ - QTC_CHECK(m_scheme.isEmpty()); // FIXME: Not implemented yet. - return QFileInfo(m_data).isDir(); -} - /// \returns the relativeChildPath of FilePath to parent if FilePath is a child of parent /// \note returns a empty FilePath if FilePath is not a child of parent /// That is, this never returns a path starting with "../" diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 20219dec280..3939b5e243b 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -77,6 +77,8 @@ public: std::function isReadableDir; std::function isWritableDir; std::function isWritableFile; + std::function isFile; + std::function isDir; std::function ensureWritableDir; std::function ensureExistingFile; std::function createDir; @@ -149,6 +151,8 @@ public: bool isReadableDir() const; bool isRelativePath() const; bool isAbsolutePath() const { return !isRelativePath(); } + bool isFile() const; + bool isDir() const; bool createDir() const; QList dirEntries(const QStringList &nameFilters, @@ -177,7 +181,6 @@ public: bool startsWith(const QString &s) const; bool endsWith(const QString &s) const; - bool isDir() const; bool isNewerThan(const QDateTime &timeStamp) const; QDateTime lastModified() const; QFile::Permissions permissions() const; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index c4487a23a34..5c3e97e2a31 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -925,6 +925,38 @@ bool DockerDevice::isWritableDirectory(const FilePath &filePath) const return exitCode == 0; } +bool DockerDevice::isFile(const FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return false); + tryCreateLocalFileAccess(); + if (hasLocalFileAccess()) { + const FilePath localAccess = mapToLocalAccess(filePath); + const bool res = localAccess.isFile(); + LOG("IsFile? " << filePath.toUserOutput() << localAccess.toUserOutput() << res); + return res; + } + const QString path = filePath.path(); + const CommandLine cmd("test", {"-f", path}); + const int exitCode = d->runSynchronously(cmd); + return exitCode == 0; +} + +bool DockerDevice::isDirectory(const FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return false); + tryCreateLocalFileAccess(); + if (hasLocalFileAccess()) { + const FilePath localAccess = mapToLocalAccess(filePath); + const bool res = localAccess.isDir(); + LOG("IsDirectory? " << filePath.toUserOutput() << localAccess.toUserOutput() << res); + return res; + } + const QString path = filePath.path(); + const CommandLine cmd("test", {"-d", path}); + const int exitCode = d->runSynchronously(cmd); + return exitCode == 0; +} + bool DockerDevice::createDirectory(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 a0f504fd07e..35ba3f1c87f 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -81,6 +81,8 @@ public: 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 isFile(const Utils::FilePath &filePath) const override; + bool isDirectory(const Utils::FilePath &filePath) const override; bool createDirectory(const Utils::FilePath &filePath) const override; bool exists(const Utils::FilePath &filePath) const override; bool ensureExistingFile(const Utils::FilePath &filePath) const override; diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index bb95f5100ba..bccc42db8af 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -225,6 +225,18 @@ bool DesktopDevice::isWritableDirectory(const FilePath &filePath) const return filePath.isWritableDir(); } +bool DesktopDevice::isFile(const FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return false); + return filePath.isFile(); +} + +bool DesktopDevice::isDirectory(const FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return false); + return filePath.isDir(); +} + bool DesktopDevice::createDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.h b/src/plugins/projectexplorer/devicesupport/desktopdevice.h index 39bc8176640..e8a41339c82 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.h +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.h @@ -66,6 +66,8 @@ public: 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 isFile(const Utils::FilePath &filePath) const override; + bool isDirectory(const Utils::FilePath &filePath) const override; bool ensureExistingFile(const Utils::FilePath &filePath) const override; bool createDirectory(const Utils::FilePath &filePath) const override; bool exists(const Utils::FilePath &filePath) const override; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 85bb517f90e..41ca11cd90e 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -410,6 +410,18 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniqueisWritableFile(filePath); }; + deviceHooks.isFile = [](const FilePath &filePath) { + auto device = DeviceManager::deviceForPath(filePath); + QTC_ASSERT(device, return false); + return device->isFile(filePath); + }; + + deviceHooks.isDir = [](const FilePath &filePath) { + auto device = DeviceManager::deviceForPath(filePath); + QTC_ASSERT(device, return false); + return device->isDirectory(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 280d1fdea11..6999d714ca3 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -253,6 +253,20 @@ bool IDevice::isWritableDirectory(const FilePath &filePath) const return false; } +bool IDevice::isFile(const FilePath &filePath) const +{ + Q_UNUSED(filePath); + QTC_CHECK(false); + return false; +} + +bool IDevice::isDirectory(const FilePath &filePath) const +{ + Q_UNUSED(filePath); + QTC_CHECK(false); + return false; +} + bool IDevice::ensureWritableDirectory(const FilePath &filePath) const { if (isWritableDirectory(filePath)) diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index ad8588f3ce3..b6c75e07cb9 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -241,6 +241,8 @@ public: 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 isFile(const Utils::FilePath &filePath) const; + virtual bool isDirectory(const Utils::FilePath &filePath) const; virtual bool ensureWritableDirectory(const Utils::FilePath &filePath) const; virtual bool ensureExistingFile(const Utils::FilePath &filePath) const; virtual bool createDirectory(const Utils::FilePath &filePath) const;