diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 296a4f398e3..1f5a7b7cbc1 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -391,13 +391,6 @@ FilePath FilePath::resolvePath(const QString &fileName) const return FilePath::fromString(QDir::cleanPath(toString() + QLatin1Char('/') + fileName)); } -FilePath FilePath::resolveSymlinkTarget() const -{ - // FIXME: implement - QTC_CHECK(false); - return *this; -} - FilePath FilePath::cleanPath() const { FilePath result = *this; @@ -1009,6 +1002,19 @@ bool FilePath::needsDevice() const 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. diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 585f2dcf2e7..6a67aaedd4a 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -83,6 +83,7 @@ public: std::function copyFile; std::function renameFile; std::function searchInPath; + std::function symLinkTarget; std::function(const FilePath &, const QStringList &, QDir::Filters, QDir::SortFlags)> dirEntries; std::function fileContents; @@ -188,6 +189,7 @@ public: FilePath cleanPath() const; FilePath canonicalPath() const; + FilePath symLinkTarget() const; FilePath operator/(const QString &str) const; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 271ab489e7f..5bb48d1310f 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1002,6 +1002,22 @@ QDateTime DockerDevice::lastModified(const FilePath &filePath) const 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 { const QString path = filePath.path(); diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 05d42199f9f..1bed2eb9ce4 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -89,6 +89,7 @@ public: bool copyFile(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 symLinkTarget(const Utils::FilePath &filePath) const override; QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters, diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 5b497f8eb57..9390b0e740a 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -459,6 +459,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniquesearchInPath(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, QDir::Filters filters, QDir::SortFlags sort) { auto device = DeviceManager::deviceForPath(filePath); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index a8c1da91f87..8983576c033 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -316,6 +316,13 @@ FilePath IDevice::searchInPath(const FilePath &filePath) const return Environment::systemEnvironment().searchInPath(filePath.path()); } +FilePath IDevice::symLinkTarget(const FilePath &filePath) const +{ + Q_UNUSED(filePath); + QTC_CHECK(false); + return {}; +} + QList IDevice::directoryEntries(const FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters, diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 5cb097e13f1..46122f0144b 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -250,6 +250,7 @@ public: 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 Utils::FilePath searchInPath(const Utils::FilePath &filePath) const; + virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const; virtual QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters, QDir::Filters filters,