diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index c7ce56ac14f..548e20625e6 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -10,12 +10,13 @@ #include +#include #include #include #include #include -#include #include +#include #include #include #include @@ -129,14 +130,39 @@ FilePath DesktopDevice::rootPath() const return IDevice::rootPath(); } +struct DeployToolsAvailability +{ + bool rsync; + bool sftp; +}; + +static DeployToolsAvailability hostDeployTools() +{ + auto check = [](const QString &tool) { + return FilePath::fromPathPart(tool).searchInPath().isExecutableFile(); + }; + return {check("rsync"), check("sftp")}; +} + void DesktopDevice::fromMap(const Store &map) { IDevice::fromMap(map); - const FilePath rsync = FilePath::fromString("rsync").searchInPath(); - const FilePath sftp = FilePath::fromString("sftp").searchInPath(); - setExtraData(Constants::SUPPORTS_RSYNC, rsync.isExecutableFile()); - setExtraData(Constants::SUPPORTS_SFTP, sftp.isExecutableFile()); + auto updateExtraData = [this](const DeployToolsAvailability &tools) { + setExtraData(Constants::SUPPORTS_RSYNC, tools.rsync); + setExtraData(Constants::SUPPORTS_SFTP, tools.sftp); + }; + + if (HostOsInfo::isWindowsHost()) { + QFutureWatcher *w = new QFutureWatcher(this); + connect(w, &QFutureWatcher::finished, this, [w, updateExtraData]() { + updateExtraData(w->result()); + w->deleteLater(); + }); + w->setFuture(Utils::asyncRun([]() { return hostDeployTools(); })); + } else { + updateExtraData(hostDeployTools()); + } } } // namespace ProjectExplorer