From 0d8985ae8056f2a9e33bc4c9fa81e659e51af7f3 Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Mon, 27 Apr 2026 17:58:47 +0200 Subject: [PATCH 1/3] [projmgr] Throw warning when multiple packs versions are simultaneously selected --- tools/projmgr/src/ProjMgrWorker.cpp | 17 ++++++++++++++++- tools/projmgr/test/src/ProjMgrUnitTests.cpp | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/tools/projmgr/src/ProjMgrWorker.cpp b/tools/projmgr/src/ProjMgrWorker.cpp index f9bdfd1d0..8cfcf295c 100644 --- a/tools/projmgr/src/ProjMgrWorker.cpp +++ b/tools/projmgr/src/ProjMgrWorker.cpp @@ -572,18 +572,33 @@ bool ProjMgrWorker::LoadPacks(ContextItem& context) { } // Filter context specific packs set selectedPacks; + map> selectedPackVersions; const bool allOrLatest = (m_loadPacksPolicy == LoadPacksPolicy::ALL) || (m_loadPacksPolicy == LoadPacksPolicy::LATEST); for (const auto& pack : m_loadedPacks) { if (context.pdscFiles.find(pack->GetPackageFileName()) != context.pdscFiles.end()) { selectedPacks.insert(pack->GetPackageID()); + selectedPackVersions[pack->GetPackageID(false)].insert(pack->GetVersionString()); + } + } + // check if multiple versions are selected + for (const auto& [pack, versions] : selectedPackVersions) { + if (versions.size() > 1) { + string msg = "selected multiple versions of pack '" + pack + "':"; + for (const auto& version : versions) { + msg += " '" + version + "',"; + } + msg.pop_back(); + msg += "\nReview pack requirements"; + ProjMgrLogger::Get().Warn(msg, context.name); } } RtePackageFilter filter; - // use all packs is enabled by default, by default policy it should be disabled if selectedPacks is not empty + // use all packs is enabled by default, by default policy it should be disabled if selectedPacks is not empty filter.SetUseAllPacks(allOrLatest || selectedPacks.empty()); filter.SetSelectedPackages(selectedPacks); context.rteActiveTarget->SetPackageFilter(filter); context.rteActiveTarget->UpdateFilterModel(); + context.rteFilteredModel->GetPackages(); return CheckRteErrors(); } diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index 370e40cda..247de86fd 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -3778,6 +3778,21 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_Local_Pack_File_Not_Found) { EXPECT_TRUE(regex_search(errStr, regex(errExpected))); } +TEST_F(ProjMgrUnitTests, MultiplePackVersions) { + char* argv[5]; + StdStreamRedirect streamRedirect; + const string expected = "warning csolution: selected multiple versions of pack 'ARM::RteTest_DFP': '0.1.1+metadata', '0.2.0'\n\Review pack requirements"; + const string& csolution = testinput_folder + "/TestSolution/pack_multiple_versions.csolution.yml"; + argv[1] = (char*)"convert"; + argv[2] = (char*)csolution.c_str(); + argv[3] = (char*)"-o"; + argv[4] = (char*)testoutput_folder.c_str(); + EXPECT_EQ(0, RunProjMgr(5, argv, 0)); + + auto errStr = streamRedirect.GetErrorString(); + EXPECT_NE(string::npos, errStr.find(expected)); +} + TEST_F(ProjMgrUnitTests, RunProjMgrSolution_List_Board_Pack) { char* argv[7]; const string& csolution = testinput_folder + "/TestSolution/test_list_board_package.csolution.yml"; From 55879cf5c4446cb4ddbd95eb5cf2a3b0f3b06e2d Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Tue, 28 Apr 2026 09:21:11 +0200 Subject: [PATCH 2/3] Clean-up left overs --- tools/projmgr/src/ProjMgrWorker.cpp | 1 - tools/projmgr/test/src/ProjMgrUnitTests.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/projmgr/src/ProjMgrWorker.cpp b/tools/projmgr/src/ProjMgrWorker.cpp index 8cfcf295c..d6a843532 100644 --- a/tools/projmgr/src/ProjMgrWorker.cpp +++ b/tools/projmgr/src/ProjMgrWorker.cpp @@ -598,7 +598,6 @@ bool ProjMgrWorker::LoadPacks(ContextItem& context) { filter.SetSelectedPackages(selectedPacks); context.rteActiveTarget->SetPackageFilter(filter); context.rteActiveTarget->UpdateFilterModel(); - context.rteFilteredModel->GetPackages(); return CheckRteErrors(); } diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index 247de86fd..0a8c75473 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -3781,7 +3781,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_Local_Pack_File_Not_Found) { TEST_F(ProjMgrUnitTests, MultiplePackVersions) { char* argv[5]; StdStreamRedirect streamRedirect; - const string expected = "warning csolution: selected multiple versions of pack 'ARM::RteTest_DFP': '0.1.1+metadata', '0.2.0'\n\Review pack requirements"; + const string expected = "warning csolution: selected multiple versions of pack 'ARM::RteTest_DFP': '0.1.1+metadata', '0.2.0'\nReview pack requirements"; const string& csolution = testinput_folder + "/TestSolution/pack_multiple_versions.csolution.yml"; argv[1] = (char*)"convert"; argv[2] = (char*)csolution.c_str(); From 18740edb8f1c2c9cfc10f6c338959e7317e8e93d Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Tue, 28 Apr 2026 10:16:14 +0200 Subject: [PATCH 3/3] Add test data --- .../pack_multiple_versions.csolution.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tools/projmgr/test/data/TestSolution/pack_multiple_versions.csolution.yml diff --git a/tools/projmgr/test/data/TestSolution/pack_multiple_versions.csolution.yml b/tools/projmgr/test/data/TestSolution/pack_multiple_versions.csolution.yml new file mode 100644 index 000000000..382be2e4b --- /dev/null +++ b/tools/projmgr/test/data/TestSolution/pack_multiple_versions.csolution.yml @@ -0,0 +1,14 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/Open-CMSIS-Pack/devtools/main/tools/projmgr/schemas/csolution.schema.json + +solution: + target-types: + - type: CM0 + device: RteTest_ARMCM0 + + packs: + - pack: ARM::RteTest_DFP@0.1.1 + - pack: ARM::RteTest_DFP + path: ../SolutionSpecificPack # 0.2.0 + + projects: + - project: pack_path.cproject.yml