@@ -305,7 +305,10 @@ RpcArgs::SuccessResult RpcHandler::LoadPacks(void) {
305305 m_manager.Clear ();
306306 m_solutionLoaded = false ;
307307 // clear project and global RTE data, packs stay loaded
308- ProjMgrKernel::Get ()->GetGlobalModel ()->Clear ();
308+ auto globalModel = ProjMgrKernel::Get ()->GetGlobalModel ();
309+ globalModel->Clear ();
310+ globalModel->PurgeModel (true ); // clears also explicit and non-existing packs
311+
309312 m_worker.InitializeModel ();
310313 m_worker.SetLoadPacksPolicy (LoadPacksPolicy::ALL );
311314 result.success = m_worker.LoadAllRelevantPacks ();
@@ -319,15 +322,30 @@ RpcArgs::SuccessResult RpcHandler::LoadPacks(void) {
319322RpcArgs::SuccessResult RpcHandler::LoadSolution (const string& solution, const string& activeTarget) {
320323 m_bUseAllPacks = false ; // loading solution will first use only listed packs
321324 m_packReferences.clear (); // will be updated
325+ m_manager.Clear ();
322326 m_solutionLoaded = false ; // assume not loaded yet
323- // clear only projects, global RTE data and packs stay loaded
324- ProjMgrKernel::Get ()->GetGlobalModel ()->ClearProjects ();
327+ auto globalModel = ProjMgrKernel::Get ()->GetGlobalModel ();
328+ // remove non-existing and explicit packs
329+ // clear model and projects if at least one pack is deleted
330+ bool purged = globalModel->PurgeModel (true );
331+ if (!purged) {
332+ // only projects, global RTE data and packs stay loaded
333+ globalModel->ClearProjects ();
334+ }
335+
325336 RpcArgs::SuccessResult result = {false };
326337 const auto csolutionFile = RteFsUtils::MakePathCanonical (solution);
327338 if (!regex_match (csolutionFile, regex (" .*\\ .csolution\\ .(yml|yaml)" ))) {
328339 result.message = solution + " is not a *.csolution.yml file" ;
329340 return result;
330341 }
342+ if (purged) {
343+ // we need to add available packs to model again (the packs are already loaded)
344+ m_worker.InitializeModel ();
345+ m_worker.SetLoadPacksPolicy (LoadPacksPolicy::ALL );
346+ result.success = m_worker.LoadAllRelevantPacks ();
347+ m_worker.SetLoadPacksPolicy (LoadPacksPolicy::DEFAULT );
348+ }
331349 // we disregard return value of m_manager.LoadSolution() here, because we tolerate some errors
332350 m_manager.LoadSolution (csolutionFile, activeTarget);
333351 map<string, ContextItem>* contexts = nullptr ;
@@ -870,8 +888,15 @@ RpcArgs::ConvertSolutionResult RpcHandler::ConvertSolution(const string& solutio
870888 m_bUseAllPacks = false ; // loading solution will first use only listed packs
871889 m_packReferences.clear (); // will be updated
872890 m_solutionLoaded = false ; // assume not loaded
873- // clear only projects, RTE data and packs stay loaded
874- ProjMgrKernel::Get ()->GetGlobalModel ()->ClearProjects ();
891+ m_manager.Clear ();
892+ auto globalModel = ProjMgrKernel::Get ()->GetGlobalModel ();
893+ // remove non-existing and explicit packs
894+ // clear model and projects if at least one pack is deleted
895+ bool purged = globalModel->PurgeModel (true );
896+ if (!purged) {
897+ // only projects, global RTE data and packs stay loaded
898+ globalModel->ClearProjects ();
899+ }
875900
876901 if (!m_manager.RunConvert (csolutionFile, activeTarget, updateRte) || !ProjMgrLogger::Get ().GetErrors ().empty ()) {
877902 if (m_worker.HasVarDefineError ()) {
0 commit comments