forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
@@ -85,7 +85,7 @@ public:
|
||||
std::function<bool(const FilePath &)> removeRecursively;
|
||||
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 &, const QList<FilePath> &)> searchInPath;
|
||||
std::function<FilePath(const FilePath &)> symLinkTarget;
|
||||
std::function<QList<FilePath>(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<FilePath> &additionalDirs = {}) const;
|
||||
Environment deviceEnvironment() const;
|
||||
|
||||
private:
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
for (const FilePath &dir : additionalDirs) {
|
||||
const FilePath candidate = dir / filePath.path();
|
||||
if (candidate.exists())
|
||||
return candidate;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
FilePaths DockerDevice::directoryEntries(const FilePath &filePath,
|
||||
|
@@ -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<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath,
|
||||
const QStringList &nameFilters,
|
||||
|
@@ -458,10 +458,10 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
|
||||
return device->renameFile(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) {
|
||||
|
@@ -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());
|
||||
}
|
||||
|
@@ -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<Utils::FilePath> &additionalDirs = {}) const;
|
||||
virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const;
|
||||
virtual QList<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath,
|
||||
const QStringList &nameFilters,
|
||||
|
Reference in New Issue
Block a user