diff --git a/tools/projmgr/src/ProjMgrWorker.cpp b/tools/projmgr/src/ProjMgrWorker.cpp index f9bdfd1d0..d6a843532 100644 --- a/tools/projmgr/src/ProjMgrWorker.cpp +++ b/tools/projmgr/src/ProjMgrWorker.cpp @@ -572,14 +572,28 @@ 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); 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 diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index 370e40cda..0a8c75473 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'\nReview 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";