From 18a9df8b4a577542a346faaf83204109b726a286 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 31 May 2021 13:01:49 +0200 Subject: [PATCH] Docker: De-register some auto-detected items on device removal Kit and QtVersion for now, ToolChains seem to lack easy access. Change-Id: I657cb075dd3b4f6fd8ebfd3d6d20b1cdd4dce831 Reviewed-by: Christian Kandeler --- src/plugins/docker/dockerdevice.cpp | 23 +++++++++++++++---- src/plugins/docker/dockerdevice.h | 4 ++++ .../devicesupport/devicemanager.cpp | 9 ++++++++ .../projectexplorer/devicesupport/idevice.h | 2 ++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 5a89d915d96..a79dcbf9174 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -139,6 +140,22 @@ void DockerDeviceProcess::start(const Runnable &runnable) dockerDevice->runProcess(m_process); } +void DockerDevice::aboutToBeRemoved() const +{ + for (Kit *kit : KitManager::kits()) { + if (kit->autoDetectionSource() == id().toString()) + KitManager::deregisterKit(kit); + }; + for (BaseQtVersion *qtVersion : QtVersionManager::versions()) { + if (qtVersion->autodetectionSource() == id().toString()) + QtVersionManager::removeVersion(qtVersion); + }; + // for (ToolChain *toolChain : ToolChainManager::toolChains()) { + // if (toolChain->autoDetectionSource() == id.toString()) + // // FIXME: Implement + // }; +} + void DockerDeviceProcess::interrupt() { device()->signalOperation()->interruptProcess(m_process.processId()); @@ -363,11 +380,10 @@ const DockerDeviceData &DockerDevice::data() const BaseQtVersion *DockerDevicePrivate::autoDetectQtVersion() const { QString error; - QString source = "docker:" + m_data.imageId; const QStringList candidates = {"/usr/local/bin/qmake", "/usr/bin/qmake"}; for (const QString &candidate : candidates) { const FilePath qmake = q->mapToGlobalPath(FilePath::fromString(candidate)); - if (auto qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake, false, source, &error)) { + if (auto qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake, false, m_data.id(), &error)) { QtVersionManager::addVersion(qtVersion); return qtVersion; } @@ -399,7 +415,6 @@ void DockerDevicePrivate::autoDetectCMake() return; QString error; - QString source = "docker:" + m_data.imageId; const QStringList candidates = {"/usr/local/bin/cmake", "/usr/bin/cmake"}; for (const QString &candidate : candidates) { const FilePath cmake = q->mapToGlobalPath(FilePath::fromString(candidate)); @@ -425,7 +440,7 @@ void DockerDevicePrivate::setupKit() const auto initializeKit = [this, toolChains, qt](Kit *k) { k->setAutoDetected(false); - k->setAutoDetectionSource("DockerDevice:" + m_data.imageId); + k->setAutoDetectionSource(m_data.id()); k->setUnexpandedDisplayName("%{Device:Name}"); DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DOCKER_DEVICE_TYPE); diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 572af3d6288..63b4990f0b3 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -38,6 +38,8 @@ namespace Internal { class DockerDeviceData { public: + QString id() const { return "docker:" + imageId; } + QString imageId; QString repo; QString tag; @@ -100,6 +102,8 @@ private: void fromMap(const QVariantMap &map) final; QVariantMap toMap() const final; + void aboutToBeRemoved() const final; + class DockerDevicePrivate *d = nullptr; friend class DockerDeviceSetupWizard; }; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index cc41b13188b..ded1f27f7d0 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -97,7 +97,16 @@ int DeviceManager::deviceCount() const void DeviceManager::replaceInstance() { + const QList newIds = + Utils::transform(DeviceManagerPrivate::clonedInstance->d->devices, &IDevice::id); + + for (IDevice::Ptr dev : m_instance->d->devices) { + if (!newIds.contains(dev->id())) + dev->aboutToBeRemoved(); + } + copy(DeviceManagerPrivate::clonedInstance, instance(), false); + emit instance()->deviceListReplaced(); emit instance()->updated(); } diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 61f9a982da5..eb00f21d5e1 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -250,6 +250,8 @@ public: virtual void runProcess(Utils::QtcProcess &process) const; virtual Utils::Environment systemEnvironment() const; + virtual void aboutToBeRemoved() const {} + protected: IDevice();