From 178cf8041a89caec67d63b1590bd4862321f51ad Mon Sep 17 00:00:00 2001 From: Evgueni Driouk Date: Thu, 2 Apr 2026 16:25:07 +0200 Subject: [PATCH 1/2] Ensure pack reference for solution local pack --- tools/projmgr/src/ProjMgrRpcServer.cpp | 14 +++++---- tools/projmgr/test/src/ProjMgrRpcTests.cpp | 34 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/tools/projmgr/src/ProjMgrRpcServer.cpp b/tools/projmgr/src/ProjMgrRpcServer.cpp index ce8698625..30d7aebd0 100644 --- a/tools/projmgr/src/ProjMgrRpcServer.cpp +++ b/tools/projmgr/src/ProjMgrRpcServer.cpp @@ -128,7 +128,7 @@ class RpcHandler : public RpcMethods { PackReferenceVector& GetPackReferences(const string& context); PackReferenceVector CollectPackReferences(const string& context); - PackReferenceVector GetPackReferencesForPack(const string& context, const string& packId); + PackReferenceVector GetPackReferencesForPack(const string& context, const RtePackage* pack); RpcArgs::PackReference& EnsurePackReferenceForPack(const string& context, const string& packId, const string& origin, bool bVersion); RpcArgs::PackReference& EnsurePackReference(const string& context, const RpcArgs::PackReference& packRef); @@ -411,7 +411,7 @@ PackReferenceVector RpcHandler::CollectPackReferences(const string& context) { packRef.origin = packItem.origin; packRef.path = packItem.path; packRef.selected = true; // initially pack is selected; - if (!contextItem.availablePackVersions[packId].empty()) { + if (packItem.path.empty() && !contextItem.availablePackVersions[packId].empty()) { packRef.upgrade = contextItem.availablePackVersions[packId]; } packRefs.push_back(packRef); @@ -419,10 +419,14 @@ PackReferenceVector RpcHandler::CollectPackReferences(const string& context) { return packRefs; } -PackReferenceVector RpcHandler::GetPackReferencesForPack(const string& context, const string& packId) { +PackReferenceVector RpcHandler::GetPackReferencesForPack(const string& context, const RtePackage* pack) { PackReferenceVector packRefs; + auto& packId = pack->GetID(); + auto path = pack->GetRootFilePath(false); + for(auto& ref : GetPackReferences(context)) { - if(ref.resolvedPack.has_value() && ref.resolvedPack == packId) { + if(ref.resolvedPack.has_value() && ref.resolvedPack == packId || + ref.path.has_value() && RteFsUtils::Equivalent(ref.path.value(), path)) { packRefs.push_back(ref); } } @@ -487,7 +491,7 @@ RpcArgs::PacksInfo RpcHandler::GetPacksInfo(const string& context, const bool& a if(contains_key(usedPacks, p.id)) { p.used = true; } - auto packRefs = GetPackReferencesForPack(context, p.id); + auto packRefs = GetPackReferencesForPack(context, rtePackage); if(!packRefs.empty()) { p.references = packRefs; diff --git a/tools/projmgr/test/src/ProjMgrRpcTests.cpp b/tools/projmgr/test/src/ProjMgrRpcTests.cpp index c0ac7cc95..2dc143f72 100644 --- a/tools/projmgr/test/src/ProjMgrRpcTests.cpp +++ b/tools/projmgr/test/src/ProjMgrRpcTests.cpp @@ -1182,6 +1182,40 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoLayer) { } +TEST_F(ProjMgrRpcTests, RpcGetPacksInfoLocal) { + string context = "incompatible.Debug+CM0"; + vector contextList = { + context + }; + + auto requests = CreateLoadRequests("/TestSolution/PackRequirements/incompatible.csolution.yml", "", contextList); + requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }})); + requests += FormatRequest(4, "GetPacksInfo", json({{ "context", context }, {"all", false}})); + + const auto& responses = RunRpcMethods(requests); + + EXPECT_TRUE(responses[2]["result"]["success"]); + auto packs = responses[2]["result"]["packs"]; + EXPECT_EQ(packs.size(), 2); + EXPECT_EQ(packs[0]["pack"], "ARM::RteTestRequired"); + EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTestRequired"); + EXPECT_EQ(packs[1]["pack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(packs[1]["resolvedPack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(RteUtils::ExtractFileName(packs[0]["origin"]), "incompatible.csolution.yml"); + EXPECT_EQ(RteUtils::ExtractFileName(packs[1]["origin"]), "incompatible.csolution.yml"); + + EXPECT_TRUE(responses[3]["result"]["success"]); // get pack infos + auto packInfos = responses[3]["result"]["packs"]; + EXPECT_EQ(packInfos.size(), 2); + + EXPECT_EQ(packInfos[0]["id"], "ARM::RteTestRequired@1.0.0"); + EXPECT_FALSE(packInfos[0].contains("used")); + + EXPECT_EQ(packInfos[1]["id"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_TRUE(packInfos[1].contains("used")); +} + + TEST_F(ProjMgrRpcTests, RpcSelectPack) { string context = "test1.Release+CM0"; From 026c7f42c3c92797ad17bca88c79d546974c2306 Mon Sep 17 00:00:00 2001 From: Evgueni Driouk Date: Thu, 2 Apr 2026 17:07:09 +0200 Subject: [PATCH 2/2] Address review comments --- tools/projmgr/test/src/ProjMgrRpcTests.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tools/projmgr/test/src/ProjMgrRpcTests.cpp b/tools/projmgr/test/src/ProjMgrRpcTests.cpp index 2dc143f72..633549f09 100644 --- a/tools/projmgr/test/src/ProjMgrRpcTests.cpp +++ b/tools/projmgr/test/src/ProjMgrRpcTests.cpp @@ -1199,9 +1199,14 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoLocal) { EXPECT_EQ(packs.size(), 2); EXPECT_EQ(packs[0]["pack"], "ARM::RteTestRequired"); EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTestRequired"); + + string path = packs[0]["path"]; + RteUtils::ReplaceAll(path, testinput_folder, "TEST"); ; + EXPECT_EQ(path, "TEST/TestSolution/PackRequirements/packs/required"); + EXPECT_EQ(RteUtils::ExtractFileName(packs[0]["origin"]), "incompatible.csolution.yml"); + EXPECT_EQ(packs[1]["pack"], "ARM::RteTest_DFP@0.2.0"); EXPECT_EQ(packs[1]["resolvedPack"], "ARM::RteTest_DFP@0.2.0"); - EXPECT_EQ(RteUtils::ExtractFileName(packs[0]["origin"]), "incompatible.csolution.yml"); EXPECT_EQ(RteUtils::ExtractFileName(packs[1]["origin"]), "incompatible.csolution.yml"); EXPECT_TRUE(responses[3]["result"]["success"]); // get pack infos @@ -1210,13 +1215,24 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoLocal) { EXPECT_EQ(packInfos[0]["id"], "ARM::RteTestRequired@1.0.0"); EXPECT_FALSE(packInfos[0].contains("used")); + auto refs = packInfos[0]["references"]; + EXPECT_EQ(refs.size(), 1); + EXPECT_TRUE(refs[0].contains("path")); + + path = refs[0]["path"]; + RteUtils::ReplaceAll(path, testinput_folder, "TEST"); + + EXPECT_EQ(refs[0]["pack"], "ARM::RteTestRequired"); + EXPECT_EQ(refs[0]["resolvedPack"], "ARM::RteTestRequired"); + EXPECT_EQ(path, "TEST/TestSolution/PackRequirements/packs/required"); EXPECT_EQ(packInfos[1]["id"], "ARM::RteTest_DFP@0.2.0"); EXPECT_TRUE(packInfos[1].contains("used")); + refs = packInfos[1]["references"]; + EXPECT_EQ(refs.size(),1); + EXPECT_FALSE(refs[1].contains("path")); } - - TEST_F(ProjMgrRpcTests, RpcSelectPack) { string context = "test1.Release+CM0"; vector contextList = {