Utils: Allow additional directories for FilePath::searchInPath

This mimics Environment::searchInPath().

Change-Id: I8c772ed31c31c74b09c7aa0e4912de8586dd2468
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2021-07-06 15:56:30 +02:00
parent d2aa0f4ed9
commit d7062b5b92
7 changed files with 28 additions and 16 deletions

View File

@@ -1378,13 +1378,13 @@ FilePath FilePath::onDevice(const FilePath &deviceTemplate) const
assert(fullPath == FilePath::fromUrl("docker://123/usr/bin/make")) assert(fullPath == FilePath::fromUrl("docker://123/usr/bin/make"))
\endcode \endcode
*/ */
FilePath FilePath::onDeviceSearchInPath() const FilePath FilePath::onDeviceSearchInPath(const FilePaths &additionalDirs) const
{ {
if (needsDevice()) { if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.searchInPath, return {}); 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 Environment FilePath::deviceEnvironment() const

View File

@@ -85,7 +85,7 @@ public:
std::function<bool(const FilePath &)> removeRecursively; std::function<bool(const FilePath &)> removeRecursively;
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 &, const QList<FilePath> &)> searchInPath;
std::function<FilePath(const FilePath &)> symLinkTarget; 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;
@@ -216,7 +216,7 @@ public:
static void setDeviceFileHooks(const DeviceFileHooks &hooks); static void setDeviceFileHooks(const DeviceFileHooks &hooks);
FilePath onDeviceSearchInPath() const; FilePath onDeviceSearchInPath(const QList<FilePath> &additionalDirs = {}) const;
Environment deviceEnvironment() const; Environment deviceEnvironment() const;
private: private:

View File

@@ -1045,23 +1045,33 @@ FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const
return {}; 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(); const QString path = filePath.path();
// FIXME: Check whether local search via deviceEnvironment/PATH is faster?
CommandLine dcmd{"docker", {"exec", d->m_container, "which", path}}; CommandLine dcmd{"docker", {"exec", d->m_container, "which", path}};
QtcProcess proc; QtcProcess proc;
proc.setCommand(dcmd); proc.setCommand(dcmd);
proc.setWorkingDirectory(QDir::tempPath());
proc.start(); proc.start();
proc.waitForFinished(); proc.waitForFinished();
LOG("Run sync:" << dcmd.toUserOutput() << " result: " << proc.exitCode()); LOG("Run sync:" << dcmd.toUserOutput() << " result: " << proc.exitCode());
if (proc.exitCode() != 0) if (proc.exitCode() == 0) {
return {};
const QString output = proc.stdOut().trimmed(); const QString output = proc.stdOut().trimmed();
return mapToGlobalPath(FilePath::fromString(output)); 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, FilePaths DockerDevice::directoryEntries(const FilePath &filePath,

View File

@@ -88,7 +88,8 @@ public:
bool removeRecursively(const Utils::FilePath &filePath) const override; bool removeRecursively(const Utils::FilePath &filePath) const override;
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 Utils::FilePaths &additionalDirs) const override;
Utils::FilePath symLinkTarget(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,

View File

@@ -458,10 +458,10 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
return device->renameFile(filePath, target); return device->renameFile(filePath, target);
}; };
deviceHooks.searchInPath = [](const FilePath &filePath) { deviceHooks.searchInPath = [](const FilePath &filePath, const FilePaths &additionalDirs) {
auto device = DeviceManager::deviceForPath(filePath); auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return FilePath{}); QTC_ASSERT(device, return FilePath{});
return device->searchInPath(filePath); return device->searchInPath(filePath, additionalDirs);
}; };
deviceHooks.symLinkTarget = [](const FilePath &filePath) { deviceHooks.symLinkTarget = [](const FilePath &filePath) {

View File

@@ -311,7 +311,7 @@ bool IDevice::renameFile(const FilePath &filePath, const FilePath &target) const
return false; 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()); return Environment::systemEnvironment().searchInPath(filePath.path());
} }

View File

@@ -249,7 +249,8 @@ public:
virtual bool removeRecursively(const Utils::FilePath &filePath) const; virtual bool removeRecursively(const Utils::FilePath &filePath) const;
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 QList<Utils::FilePath> &additionalDirs = {}) const;
virtual Utils::FilePath symLinkTarget(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,