diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index c739b74ec31..87ffc501492 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -1374,17 +1374,17 @@ FilePath FilePath::onDevice(const FilePath &deviceTemplate) const Example usage: \code binary = FilePath::fromUrl("docker://123/./make); - fullPath = binary.onDeviceSearchInPath(); + fullPath = binary.searchOnDevice(); assert(fullPath == FilePath::fromUrl("docker://123/usr/bin/make")) \endcode */ -FilePath FilePath::onDeviceSearchInPath(const FilePaths &additionalDirs) const +FilePath FilePath::searchOnDevice(const FilePaths &dirs) const { if (needsDevice()) { QTC_ASSERT(s_deviceHooks.searchInPath, return {}); - return s_deviceHooks.searchInPath(*this, additionalDirs); + return s_deviceHooks.searchInPath(*this, dirs); } - return Environment::systemEnvironment().searchInPath(path(), additionalDirs); + return Environment::systemEnvironment().searchInPath(path(), dirs); } Environment FilePath::deviceEnvironment() const diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 24da9d380d1..70988a3002d 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -216,7 +216,7 @@ public: static void setDeviceFileHooks(const DeviceFileHooks &hooks); - FilePath onDeviceSearchInPath(const QList &additionalDirs = {}) const; + FilePath searchOnDevice(const QList &dirs) const; Environment deviceEnvironment() const; private: diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index d90c83ee485..6136591de93 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -500,7 +500,7 @@ QList KitDetectorPrivate::autoDetectQtVersions() const emit q->logOutput('\n' + tr("Searching Qt installations...")); for (const QString &candidate : candidates) { emit q->logOutput(tr("Searching for %1 executable...").arg(candidate)); - const FilePath qmake = m_device->searchInPath(FilePath::fromString(candidate)); + const FilePath qmake = m_device->searchExecutableInPath(candidate); if (qmake.isEmpty()) continue; BaseQtVersion *qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake, false, m_sharedId, &error); @@ -546,8 +546,8 @@ void KitDetectorPrivate::autoDetectCMake() QString error; const QStringList candidates = {"cmake"}; for (const QString &candidate : candidates) { - const FilePath cmake = m_device->searchInPath(FilePath::fromString(candidate)); - if (cmake.isExecutableFile()) { + const FilePath cmake = m_device->searchExecutableInPath(candidate); + if (!cmake.isEmpty()) { emit q->logOutput(tr("Found CMake binary: %1").arg(cmake.toUserOutput())); const bool res = QMetaObject::invokeMethod(cmakeManager, "registerCMakeByPath", @@ -1046,35 +1046,6 @@ FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const return {}; } -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.start(); - proc.waitForFinished(); - - LOG("Run sync:" << dcmd.toUserOutput() << " result: " << proc.exitCode()); - if (proc.exitCode() == 0) { - 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, const QStringList &nameFilters, QDir::Filters filters, diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 0c994e73082..471d5f80273 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -88,8 +88,6 @@ 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 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/nim/project/nimtoolchainfactory.cpp b/src/plugins/nim/project/nimtoolchainfactory.cpp index 7876cd30a68..b55a9e9119b 100644 --- a/src/plugins/nim/project/nimtoolchainfactory.cpp +++ b/src/plugins/nim/project/nimtoolchainfactory.cpp @@ -58,7 +58,7 @@ QList NimToolChainFactory::autoDetect(const QList &alr QList result; IDevice::ConstPtr dev = device ? device : DeviceManager::defaultDesktopDevice(); - const FilePath compilerPath = dev->searchInPath(FilePath::fromString("nim")); + const FilePath compilerPath = dev->searchExecutableInPath("nim"); if (compilerPath.isEmpty()) return result; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 3d7439522dd..6bf8249695c 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, const FilePaths &additionalDirs) { + deviceHooks.searchInPath = [](const FilePath &filePath, const FilePaths &dirs) { auto device = DeviceManager::deviceForPath(filePath); QTC_ASSERT(device, return FilePath{}); - return device->searchInPath(filePath, additionalDirs); + return device->searchExecutable(filePath.path(), dirs); }; deviceHooks.symLinkTarget = [](const FilePath &filePath) { diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index d51040d5862..1913d786f74 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -311,9 +311,24 @@ bool IDevice::renameFile(const FilePath &filePath, const FilePath &target) const return false; } -FilePath IDevice::searchInPath(const FilePath &filePath, const FilePaths &additionalDirs) const +FilePath IDevice::searchExecutableInPath(const QString &fileName) const { - return Environment::systemEnvironment().searchInPath(filePath.path()); + FilePaths paths; + for (const FilePath &path : systemEnvironment().path()) + paths.append(mapToGlobalPath(path)); + return searchExecutable(fileName, paths); +} + +FilePath IDevice::searchExecutable(const QString &fileName, const FilePaths &dirs) const +{ + for (const FilePath &dir : dirs) { + QTC_CHECK(handlesFile(dir)); + const FilePath candidate = dir / fileName; + if (isExecutableFile(candidate)) + return candidate; + } + + return {}; } FilePath IDevice::symLinkTarget(const FilePath &filePath) const diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index d5ad9858ad0..9e323e21944 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -249,8 +249,9 @@ 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 QList &additionalDirs = {}) const; + virtual Utils::FilePath searchExecutableInPath(const QString &fileName) const; + virtual Utils::FilePath searchExecutable(const QString &fileName, + const QList &dirs) const; virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const; virtual QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters,