diff --git a/src/plugins/mcusupport/mcukitmanager.cpp b/src/plugins/mcusupport/mcukitmanager.cpp index 793e02b3230..c951158d832 100644 --- a/src/plugins/mcusupport/mcukitmanager.cpp +++ b/src/plugins/mcusupport/mcukitmanager.cpp @@ -721,5 +721,68 @@ void removeOutdatedKits() KitManager::deregisterKit(kit); } +/* +* using kitQmlImportPath of kit found in profile.xml to get the path to Qul +* installation where description file (.json) of the kit is located. +*/ +static const FilePaths kitsFiles(const Kit *kit) +{ + const FilePath qulRoot = kitDependencyPath(kit, Legacy::Constants::QUL_CMAKE_VAR); + return kitsPath(qulRoot).dirEntries(Utils::FileFilter({"*.json"}, QDir::Files)); +} + +/* +* When file description (.json) of a kit exists in the Qul installation that means +* target is installed. +*/ +static bool anyKitDescriptionFileExists(const FilePaths &jsonFiles, + const QStringList &kitsProperties) +{ + static const QRegularExpression re("(\\w+)-(\\w+)-(.+)\\.json"); + for (const FilePath &jsonFile : jsonFiles) { + const QRegularExpressionMatch match = re.match(jsonFile.fileName()); + QStringList kitsPropertiesFromFileName; + if (match.hasMatch()) { + const QString toolchain = match.captured(1).replace( + "gnu", "gcc"); // kitFileName contains gnu while profiles.xml contains gcc + const QString vendor = match.captured(2); + const QString device = match.captured(3); + + kitsPropertiesFromFileName << toolchain << vendor << device; + } + + if (kitsPropertiesFromFileName == kitsProperties) + return true; + } + return false; +} + +const QList findUninstalledTargetsKits() +{ + QList uninstalledTargetsKits; + for (Kit *kit : KitManager::kits()) { + if (!kit->hasValue(Constants::KIT_MCUTARGET_KITVERSION_KEY)) + continue; + + const QStringList kitsProperties = { + kit->value(Constants::KIT_MCUTARGET_TOOLCHAIN_KEY).toString().toLower(), + kit->value(Constants::KIT_MCUTARGET_VENDOR_KEY).toString().toLower(), + kit->value(Constants::KIT_MCUTARGET_MODEL_KEY).toString().toLower(), + }; + + const FilePaths kitsDescriptionFiles = kitsFiles(kit); + if (!anyKitDescriptionFileExists(kitsDescriptionFiles, kitsProperties)) + uninstalledTargetsKits << kit; + } + + return uninstalledTargetsKits; +} + +void removeUninstalledTargetsKits(const QList uninstalledTargetsKits) +{ + for (const auto &kit : uninstalledTargetsKits) + KitManager::deregisterKit(kit); +} + } // namespace McuKitManager } // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcukitmanager.h b/src/plugins/mcusupport/mcukitmanager.h index 6a82033e9e3..7e949d589c1 100644 --- a/src/plugins/mcusupport/mcukitmanager.h +++ b/src/plugins/mcusupport/mcukitmanager.h @@ -56,6 +56,10 @@ void fixExistingKits(const SettingsHandler::Ptr &); // Outdated kits: void removeOutdatedKits(); +// kits for uninstalled targets: +const QList findUninstalledTargetsKits(); +void removeUninstalledTargetsKits(const QList uninstalledTargetsKits); + } // namespace McuKitManager } // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcusupportplugin.cpp b/src/plugins/mcusupport/mcusupportplugin.cpp index f7622318517..6b4e851c476 100644 --- a/src/plugins/mcusupport/mcusupportplugin.cpp +++ b/src/plugins/mcusupport/mcusupportplugin.cpp @@ -135,6 +135,7 @@ void McuSupportPlugin::extensionsInitialized() McuKitManager::createAutomaticKits(dd->m_settingsHandler); McuKitManager::fixExistingKits(dd->m_settingsHandler); askUserAboutMcuSupportKitsSetup(); + askUserAboutRemovingUninstalledTargetsKits(); }); } @@ -188,4 +189,34 @@ void McuSupportPlugin::askUserAboutMcuSupportKitsUpgrade(const SettingsHandler:: ICore::infoBar()->addInfo(info); } -} // McuSupport::Internal +void McuSupportPlugin::askUserAboutRemovingUninstalledTargetsKits() +{ + const char removeUninstalledKits[] = "RemoveUninstalledKits"; + QList uninstalledTargetsKits; + + if (!ICore::infoBar()->canInfoBeAdded(removeUninstalledKits) + || (uninstalledTargetsKits = McuKitManager::findUninstalledTargetsKits()).isEmpty()) + return; + + Utils::InfoBarEntry + info(removeUninstalledKits, + Tr::tr("Detected %n uninstalled MCU target(s). Remove corresponding kits?", + nullptr, + uninstalledTargetsKits.size()), + Utils::InfoBarEntry::GlobalSuppression::Enabled); + + info.addCustomButton(Tr::tr("Keep"), [removeUninstalledKits] { + ICore::infoBar()->removeInfo(removeUninstalledKits); + }); + + info.addCustomButton(Tr::tr("Remove"), [removeUninstalledKits, uninstalledTargetsKits] { + ICore::infoBar()->removeInfo(removeUninstalledKits); + QTimer::singleShot(0, [uninstalledTargetsKits]() { + McuKitManager::removeUninstalledTargetsKits(uninstalledTargetsKits); + }); + }); + + ICore::infoBar()->addInfo(info); +} + +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcusupportplugin.h b/src/plugins/mcusupport/mcusupportplugin.h index 08cfc61f890..cb27b138464 100644 --- a/src/plugins/mcusupport/mcusupportplugin.h +++ b/src/plugins/mcusupport/mcusupportplugin.h @@ -24,6 +24,7 @@ public: void askUserAboutMcuSupportKitsSetup(); static void askUserAboutMcuSupportKitsUpgrade(const SettingsHandler::Ptr &settingsHandler); + static void askUserAboutRemovingUninstalledTargetsKits(); }; } // McuSupport::Internal