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..633549f09 100644 --- a/tools/projmgr/test/src/ProjMgrRpcTests.cpp +++ b/tools/projmgr/test/src/ProjMgrRpcTests.cpp @@ -1182,6 +1182,56 @@ 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"); + + 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[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")); + 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";