summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/fileutils.cpp20
-rw-r--r--src/libs/utils/fileutils.h2
-rw-r--r--src/plugins/docker/dockerdevice.cpp16
-rw-r--r--src/plugins/docker/dockerdevice.h1
-rw-r--r--src/plugins/projectexplorer/devicesupport/devicemanager.cpp6
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.cpp7
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.h1
7 files changed, 46 insertions, 7 deletions
diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp
index 296a4f398e..1f5a7b7cbc 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 585f2dcf2e..6a67aaedd4 100644
--- a/src/libs/utils/fileutils.h
+++ b/src/libs/utils/fileutils.h
@@ -83,6 +83,7 @@ public:
std::function<bool(const FilePath &, const FilePath &)> copyFile;
std::function<bool(const FilePath &, const FilePath &)> renameFile;
std::function<FilePath(const FilePath &)> searchInPath;
+ std::function<FilePath(const FilePath &)> symLinkTarget;
std::function<QList<FilePath>(const FilePath &, const QStringList &,
QDir::Filters, QDir::SortFlags)> dirEntries;
std::function<QByteArray(const FilePath &, int)> 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 271ab489e7..5bb48d1310 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 05d42199f9..1bed2eb9ce 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<Utils::FilePath> 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 5b497f8eb5..9390b0e740 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_unique<DeviceManager
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,
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 a8c1da91f8..8983576c03 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<FilePath> 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 5cb097e13f..46122f0144 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<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath,
const QStringList &nameFilters,
QDir::Filters filters,