diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index a4704bf696d..c739b74ec31 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -1378,13 +1378,13 @@ FilePath FilePath::onDevice(const FilePath &deviceTemplate) const assert(fullPath == FilePath::fromUrl("docker://123/usr/bin/make")) \endcode */ -FilePath FilePath::onDeviceSearchInPath() const +FilePath FilePath::onDeviceSearchInPath(const FilePaths &additionalDirs) const { if (needsDevice()) { QTC_ASSERT(s_deviceHooks.searchInPath, return {}); - return s_deviceHooks.searchInPath(*this); + return s_deviceHooks.searchInPath(*this, additionalDirs); } - return Environment::systemEnvironment().searchInPath(path()); + return Environment::systemEnvironment().searchInPath(path(), additionalDirs); } Environment FilePath::deviceEnvironment() const diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 07792a7faca..24da9d380d1 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -85,7 +85,7 @@ public: std::function removeRecursively; std::function copyFile; std::function renameFile; - std::function searchInPath; + std::function &)> searchInPath; std::function symLinkTarget; std::function(const FilePath &, const QStringList &, QDir::Filters, QDir::SortFlags)> dirEntries; @@ -216,7 +216,7 @@ public: static void setDeviceFileHooks(const DeviceFileHooks &hooks); - FilePath onDeviceSearchInPath() const; + FilePath onDeviceSearchInPath(const QList &additionalDirs = {}) const; Environment deviceEnvironment() const; private: diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index b2a7af5c985..515b3ad5bd4 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1045,23 +1045,33 @@ FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const return {}; } -FilePath DockerDevice::searchInPath(const FilePath &filePath) const +FilePath DockerDevice::searchInPath(const FilePath &filePath, const FilePaths &additionalDirs) const { + QTC_ASSERT(handlesFile(filePath), return {}); + tryCreateLocalFileAccess(); + const QString path = filePath.path(); + // FIXME: Check whether local search via deviceEnvironment/PATH is faster? CommandLine dcmd{"docker", {"exec", d->m_container, "which", path}}; QtcProcess proc; proc.setCommand(dcmd); - proc.setWorkingDirectory(QDir::tempPath()); proc.start(); proc.waitForFinished(); LOG("Run sync:" << dcmd.toUserOutput() << " result: " << proc.exitCode()); - if (proc.exitCode() != 0) - return {}; + if (proc.exitCode() == 0) { + const QString output = proc.stdOut().trimmed(); + return mapToGlobalPath(FilePath::fromString(output)); + } - const QString output = proc.stdOut().trimmed(); - return mapToGlobalPath(FilePath::fromString(output)); + for (const FilePath &dir : additionalDirs) { + const FilePath candidate = dir / filePath.path(); + if (candidate.exists()) + return candidate; + } + + return {}; } FilePaths DockerDevice::directoryEntries(const FilePath &filePath, diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 509bd2deeeb..0c994e73082 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -88,7 +88,8 @@ public: bool removeRecursively(const Utils::FilePath &filePath) 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; - Utils::FilePath searchInPath(const Utils::FilePath &filePath) const override; + Utils::FilePath searchInPath(const Utils::FilePath &filePath, + const Utils::FilePaths &additionalDirs) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters, diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 32ff16cf3a0..3d7439522dd 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -458,10 +458,10 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniquerenameFile(filePath, target); }; - deviceHooks.searchInPath = [](const FilePath &filePath) { + deviceHooks.searchInPath = [](const FilePath &filePath, const FilePaths &additionalDirs) { auto device = DeviceManager::deviceForPath(filePath); QTC_ASSERT(device, return FilePath{}); - return device->searchInPath(filePath); + return device->searchInPath(filePath, additionalDirs); }; deviceHooks.symLinkTarget = [](const FilePath &filePath) { diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 8983576c033..d51040d5862 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -311,7 +311,7 @@ bool IDevice::renameFile(const FilePath &filePath, const FilePath &target) const return false; } -FilePath IDevice::searchInPath(const FilePath &filePath) const +FilePath IDevice::searchInPath(const FilePath &filePath, const FilePaths &additionalDirs) const { return Environment::systemEnvironment().searchInPath(filePath.path()); } diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 46122f0144b..d5ad9858ad0 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -249,7 +249,8 @@ public: virtual bool removeRecursively(const Utils::FilePath &filePath) 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 Utils::FilePath searchInPath(const Utils::FilePath &filePath) const; + virtual Utils::FilePath searchInPath(const Utils::FilePath &filePath, + const QList &additionalDirs = {}) const; virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const; virtual QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters,