ProjectExplorer: Implement (Docker)Device::exists(filePath)

While the original plan was to use more specific functions like
'isReadableFile' to cut down the number of accesses, it is
unrealistic to re-write all occurrences in reasonable time.
So make the basic building blocks accessible, too.

Change-Id: I2586ebd19e1e7ae2c884fd2a4180869421293e3a
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2021-06-01 09:40:17 +02:00
parent 422409bf26
commit a7cd9bda3a
7 changed files with 36 additions and 1 deletions

View File

@@ -832,7 +832,10 @@ void FilePath::setHost(const QString &host)
/// FilePath exists. /// FilePath exists.
bool FilePath::exists() const 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); return !isEmpty() && QFileInfo::exists(m_data);
} }

View File

@@ -75,6 +75,7 @@ public:
std::function<bool(const FilePath &)> isWritableDir; std::function<bool(const FilePath &)> isWritableDir;
std::function<bool(const FilePath &)> ensureWritableDir; std::function<bool(const FilePath &)> ensureWritableDir;
std::function<bool(const FilePath &)> createDir; std::function<bool(const FilePath &)> createDir;
std::function<bool(const FilePath &)> exists;
std::function<QList<FilePath>(const FilePath &, const QStringList &, QDir::Filters)> dirEntries; std::function<QList<FilePath>(const FilePath &, const QStringList &, QDir::Filters)> dirEntries;
std::function<QByteArray(const FilePath &, int)> fileContents; std::function<QByteArray(const FilePath &, int)> fileContents;
}; };

View File

@@ -688,6 +688,22 @@ bool DockerDevice::createDirectory(const FilePath &filePath) const
return exitCode == 0; 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<FilePath> DockerDevice::directoryEntries(const FilePath &filePath, QList<FilePath> DockerDevice::directoryEntries(const FilePath &filePath,
const QStringList &nameFilters, const QStringList &nameFilters,
QDir::Filters filters) const QDir::Filters filters) const

View File

@@ -78,6 +78,7 @@ public:
bool isReadableDirectory(const Utils::FilePath &filePath) const override; bool isReadableDirectory(const Utils::FilePath &filePath) const override;
bool isWritableDirectory(const Utils::FilePath &filePath) const override; bool isWritableDirectory(const Utils::FilePath &filePath) const override;
bool createDirectory(const Utils::FilePath &filePath) const override; bool createDirectory(const Utils::FilePath &filePath) const override;
bool exists(const Utils::FilePath &filePath) const override;
QList<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath, QList<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath,
const QStringList &nameFilters, const QStringList &nameFilters,
QDir::Filters filters) const override; QDir::Filters filters) const override;

View File

@@ -401,6 +401,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
return device->createDirectory(filePath); return device->createDirectory(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, deviceHooks.dirEntries = [](const FilePath &filePath,
const QStringList &nameFilters, QDir::Filters filters) { const QStringList &nameFilters, QDir::Filters filters) {
auto device = DeviceManager::deviceForPath(filePath); auto device = DeviceManager::deviceForPath(filePath);

View File

@@ -259,6 +259,13 @@ bool IDevice::createDirectory(const Utils::FilePath &filePath) const
return false; return false;
} }
bool IDevice::exists(const Utils::FilePath &filePath) const
{
Q_UNUSED(filePath);
QTC_CHECK(false);
return false;
}
QList<FilePath> IDevice::directoryEntries(const FilePath &filePath, QList<FilePath> IDevice::directoryEntries(const FilePath &filePath,
const QStringList &nameFilters, const QStringList &nameFilters,
QDir::Filters filters) const QDir::Filters filters) const

View File

@@ -242,6 +242,7 @@ public:
virtual bool isWritableDirectory(const Utils::FilePath &filePath) const; virtual bool isWritableDirectory(const Utils::FilePath &filePath) const;
virtual bool ensureWritableDirectory(const Utils::FilePath &filePath) const; virtual bool ensureWritableDirectory(const Utils::FilePath &filePath) const;
virtual bool createDirectory(const Utils::FilePath &filePath) const; virtual bool createDirectory(const Utils::FilePath &filePath) const;
virtual bool exists(const Utils::FilePath &filePath) const;
virtual QList<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath, virtual QList<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath,
const QStringList &nameFilters, const QStringList &nameFilters,
QDir::Filters filters) const; QDir::Filters filters) const;