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 <christian.kandeler@qt.io>
This commit is contained in:
hjk
2021-05-31 13:01:49 +02:00
parent 84b8930c27
commit 18a9df8b4a
4 changed files with 34 additions and 4 deletions

View File

@@ -32,6 +32,7 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h> #include <coreplugin/messagemanager.h>
#include <projectexplorer/devicesupport/devicemanager.h>
#include <projectexplorer/devicesupport/idevicewidget.h> #include <projectexplorer/devicesupport/idevicewidget.h>
#include <projectexplorer/kitinformation.h> #include <projectexplorer/kitinformation.h>
#include <projectexplorer/kitmanager.h> #include <projectexplorer/kitmanager.h>
@@ -139,6 +140,22 @@ void DockerDeviceProcess::start(const Runnable &runnable)
dockerDevice->runProcess(m_process); 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() void DockerDeviceProcess::interrupt()
{ {
device()->signalOperation()->interruptProcess(m_process.processId()); device()->signalOperation()->interruptProcess(m_process.processId());
@@ -363,11 +380,10 @@ const DockerDeviceData &DockerDevice::data() const
BaseQtVersion *DockerDevicePrivate::autoDetectQtVersion() const BaseQtVersion *DockerDevicePrivate::autoDetectQtVersion() const
{ {
QString error; QString error;
QString source = "docker:" + m_data.imageId;
const QStringList candidates = {"/usr/local/bin/qmake", "/usr/bin/qmake"}; const QStringList candidates = {"/usr/local/bin/qmake", "/usr/bin/qmake"};
for (const QString &candidate : candidates) { for (const QString &candidate : candidates) {
const FilePath qmake = q->mapToGlobalPath(FilePath::fromString(candidate)); 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); QtVersionManager::addVersion(qtVersion);
return qtVersion; return qtVersion;
} }
@@ -399,7 +415,6 @@ void DockerDevicePrivate::autoDetectCMake()
return; return;
QString error; QString error;
QString source = "docker:" + m_data.imageId;
const QStringList candidates = {"/usr/local/bin/cmake", "/usr/bin/cmake"}; const QStringList candidates = {"/usr/local/bin/cmake", "/usr/bin/cmake"};
for (const QString &candidate : candidates) { for (const QString &candidate : candidates) {
const FilePath cmake = q->mapToGlobalPath(FilePath::fromString(candidate)); const FilePath cmake = q->mapToGlobalPath(FilePath::fromString(candidate));
@@ -425,7 +440,7 @@ void DockerDevicePrivate::setupKit()
const auto initializeKit = [this, toolChains, qt](Kit *k) { const auto initializeKit = [this, toolChains, qt](Kit *k) {
k->setAutoDetected(false); k->setAutoDetected(false);
k->setAutoDetectionSource("DockerDevice:" + m_data.imageId); k->setAutoDetectionSource(m_data.id());
k->setUnexpandedDisplayName("%{Device:Name}"); k->setUnexpandedDisplayName("%{Device:Name}");
DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DOCKER_DEVICE_TYPE); DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DOCKER_DEVICE_TYPE);

View File

@@ -38,6 +38,8 @@ namespace Internal {
class DockerDeviceData class DockerDeviceData
{ {
public: public:
QString id() const { return "docker:" + imageId; }
QString imageId; QString imageId;
QString repo; QString repo;
QString tag; QString tag;
@@ -100,6 +102,8 @@ private:
void fromMap(const QVariantMap &map) final; void fromMap(const QVariantMap &map) final;
QVariantMap toMap() const final; QVariantMap toMap() const final;
void aboutToBeRemoved() const final;
class DockerDevicePrivate *d = nullptr; class DockerDevicePrivate *d = nullptr;
friend class DockerDeviceSetupWizard; friend class DockerDeviceSetupWizard;
}; };

View File

@@ -97,7 +97,16 @@ int DeviceManager::deviceCount() const
void DeviceManager::replaceInstance() void DeviceManager::replaceInstance()
{ {
const QList<Id> 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); copy(DeviceManagerPrivate::clonedInstance, instance(), false);
emit instance()->deviceListReplaced(); emit instance()->deviceListReplaced();
emit instance()->updated(); emit instance()->updated();
} }

View File

@@ -250,6 +250,8 @@ public:
virtual void runProcess(Utils::QtcProcess &process) const; virtual void runProcess(Utils::QtcProcess &process) const;
virtual Utils::Environment systemEnvironment() const; virtual Utils::Environment systemEnvironment() const;
virtual void aboutToBeRemoved() const {}
protected: protected:
IDevice(); IDevice();