diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 71bfd96aff5..a735bc3fa14 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -832,7 +832,10 @@ void FilePath::setHost(const QString &host) /// FilePath exists. bool FilePath::exists() const { - QTC_ASSERT(!needsDevice(), return false); + if (needsDevice()) { + QTC_ASSERT(s_deviceHooks.exists, return false); + return s_deviceHooks.exists(*this); + } return !isEmpty() && QFileInfo::exists(m_data); } diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 431e9ec0c66..b2400c5bc2d 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -75,6 +75,7 @@ public: std::function isWritableDir; std::function ensureWritableDir; std::function createDir; + std::function exists; std::function(const FilePath &, const QStringList &, QDir::Filters)> dirEntries; std::function fileContents; }; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 92aa80a74af..5a89d915d96 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -688,6 +688,22 @@ bool DockerDevice::createDirectory(const FilePath &filePath) const return exitCode == 0; } +bool DockerDevice::exists(const FilePath &filePath) const +{ + QTC_ASSERT(handlesFile(filePath), return false); + tryCreateLocalFileAccess(); + if (hasLocalFileAccess()) { + const FilePath localAccess = mapToLocalAccess(filePath); + const bool res = localAccess.exists(); + LOG("Exists? " << filePath.toUserOutput() << localAccess.toUserOutput() << res); + return res; + } + const QString path = filePath.path(); + const CommandLine cmd("test", {"-e", path}); + const int exitCode = d->runSynchronously(cmd); + return exitCode == 0; +} + QList DockerDevice::directoryEntries(const FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters) const diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index ee9b6a90eb1..572af3d6288 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -78,6 +78,7 @@ public: bool isReadableDirectory(const Utils::FilePath &filePath) const override; bool isWritableDirectory(const Utils::FilePath &filePath) const override; bool createDirectory(const Utils::FilePath &filePath) const override; + bool exists(const Utils::FilePath &filePath) const override; QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters) const override; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 2f022773586..cc41b13188b 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -401,6 +401,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniquecreateDirectory(filePath); }; + deviceHooks.exists = [](const FilePath &filePath) { + auto device = DeviceManager::deviceForPath(filePath); + QTC_ASSERT(device, return false); + return device->exists(filePath); + }; + deviceHooks.dirEntries = [](const FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters) { auto device = DeviceManager::deviceForPath(filePath); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index dab6d5618fa..c9b3338097d 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -259,6 +259,13 @@ bool IDevice::createDirectory(const Utils::FilePath &filePath) const return false; } +bool IDevice::exists(const Utils::FilePath &filePath) const +{ + Q_UNUSED(filePath); + QTC_CHECK(false); + return false; +} + QList IDevice::directoryEntries(const FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters) const diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 9c628517586..61f9a982da5 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -242,6 +242,7 @@ public: 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 bool exists(const Utils::FilePath &filePath) const; virtual QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters) const;