Utils: Add FilePath::symLinkTarget

And implement it for the docker device.

This replaces the previous unused and not really implemented
FilePath::resolveSymLinkTarget.

Change-Id: I9dcb4f8276dbb88b21959276da0d50135742fba0
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2021-06-29 15:57:41 +02:00
parent 4c3bbba75c
commit 4a8c222c18
7 changed files with 46 additions and 7 deletions

View File

@@ -391,13 +391,6 @@ FilePath FilePath::resolvePath(const QString &fileName) const
return FilePath::fromString(QDir::cleanPath(toString() + QLatin1Char('/') + fileName)); return FilePath::fromString(QDir::cleanPath(toString() + QLatin1Char('/') + fileName));
} }
FilePath FilePath::resolveSymlinkTarget() const
{
// FIXME: implement
QTC_CHECK(false);
return *this;
}
FilePath FilePath::cleanPath() const FilePath FilePath::cleanPath() const
{ {
FilePath result = *this; FilePath result = *this;
@@ -1009,6 +1002,19 @@ bool FilePath::needsDevice() const
return !m_scheme.isEmpty(); return !m_scheme.isEmpty();
} }
/// \returns an empty FilePath if this is not a symbolic linl
FilePath FilePath::symLinkTarget() const
{
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.symLinkTarget, return {});
return s_deviceHooks.symLinkTarget(*this);
}
const QFileInfo info(m_data);
if (!info.isSymLink())
return {};
return FilePath::fromString(info.symLinkTarget());
}
/// Find the parent directory of a given directory. /// Find the parent directory of a given directory.

View File

@@ -83,6 +83,7 @@ public:
std::function<bool(const FilePath &, const FilePath &)> copyFile; std::function<bool(const FilePath &, const FilePath &)> copyFile;
std::function<bool(const FilePath &, const FilePath &)> renameFile; std::function<bool(const FilePath &, const FilePath &)> renameFile;
std::function<FilePath(const FilePath &)> searchInPath; std::function<FilePath(const FilePath &)> searchInPath;
std::function<FilePath(const FilePath &)> symLinkTarget;
std::function<QList<FilePath>(const FilePath &, const QStringList &, std::function<QList<FilePath>(const FilePath &, const QStringList &,
QDir::Filters, QDir::SortFlags)> dirEntries; QDir::Filters, QDir::SortFlags)> dirEntries;
std::function<QByteArray(const FilePath &, int)> fileContents; std::function<QByteArray(const FilePath &, int)> fileContents;
@@ -188,6 +189,7 @@ public:
FilePath cleanPath() const; FilePath cleanPath() const;
FilePath canonicalPath() const; FilePath canonicalPath() const;
FilePath symLinkTarget() const;
FilePath operator/(const QString &str) const; FilePath operator/(const QString &str) const;

View File

@@ -1002,6 +1002,22 @@ QDateTime DockerDevice::lastModified(const FilePath &filePath) const
return {}; return {};
} }
FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return {});
tryCreateLocalFileAccess();
if (hasLocalFileAccess()) {
const FilePath localAccess = mapToLocalAccess(filePath);
const FilePath target = localAccess.symLinkTarget();
LOG("SymLinkTarget? " << filePath.toUserOutput() << localAccess.toUserOutput() << target);
if (target.isEmpty())
return {};
return mapToGlobalPath(target);
}
QTC_CHECK(false);
return {};
}
FilePath DockerDevice::searchInPath(const FilePath &filePath) const FilePath DockerDevice::searchInPath(const FilePath &filePath) const
{ {
const QString path = filePath.path(); const QString path = filePath.path();

View File

@@ -89,6 +89,7 @@ public:
bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override; bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override;
bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override; bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override;
Utils::FilePath searchInPath(const Utils::FilePath &filePath) const override; Utils::FilePath searchInPath(const Utils::FilePath &filePath) const override;
Utils::FilePath symLinkTarget(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, QDir::Filters filters,

View File

@@ -459,6 +459,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
return device->searchInPath(filePath); return device->searchInPath(filePath);
}; };
deviceHooks.symLinkTarget = [](const FilePath &filePath) {
auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return FilePath{});
return device->symLinkTarget(filePath);
};
deviceHooks.dirEntries = [](const FilePath &filePath, const QStringList &nameFilters, deviceHooks.dirEntries = [](const FilePath &filePath, const QStringList &nameFilters,
QDir::Filters filters, QDir::SortFlags sort) { QDir::Filters filters, QDir::SortFlags sort) {
auto device = DeviceManager::deviceForPath(filePath); auto device = DeviceManager::deviceForPath(filePath);

View File

@@ -316,6 +316,13 @@ FilePath IDevice::searchInPath(const FilePath &filePath) const
return Environment::systemEnvironment().searchInPath(filePath.path()); return Environment::systemEnvironment().searchInPath(filePath.path());
} }
FilePath IDevice::symLinkTarget(const FilePath &filePath) const
{
Q_UNUSED(filePath);
QTC_CHECK(false);
return {};
}
QList<FilePath> IDevice::directoryEntries(const FilePath &filePath, QList<FilePath> IDevice::directoryEntries(const FilePath &filePath,
const QStringList &nameFilters, const QStringList &nameFilters,
QDir::Filters filters, QDir::Filters filters,

View File

@@ -250,6 +250,7 @@ public:
virtual bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const; virtual bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const;
virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const; virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const;
virtual Utils::FilePath searchInPath(const Utils::FilePath &filePath) const; virtual Utils::FilePath searchInPath(const Utils::FilePath &filePath) const;
virtual Utils::FilePath symLinkTarget(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, QDir::Filters filters,