Skip to content

Commit e543c21

Browse files
committed
Purge explicit packs on solution load
1 parent 2054682 commit e543c21

7 files changed

Lines changed: 124 additions & 87 deletions

File tree

libs/rtemodel/src/RteKernel.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -477,11 +477,7 @@ bool RteKernel::LoadAndInsertPacks(std::list<RtePackage*>& packs, std::list<std:
477477
if(!pack) {
478478
return false;
479479
}
480-
// pack with explicit path must override installed pack
481-
auto loadedPack = RtePackage::GetPackFromList(pack->GetID(), packs);
482-
if(!loadedPack || (loadedPack->GetPackageState() == PS_INSTALLED && pack->GetPackageState() == PS_EXPLICIT_PATH)) {
483-
newPacks.push_back(pack);
484-
}
480+
newPacks.push_back(pack);
485481
}
486482
globalModel->InsertPacks(newPacks);
487483

libs/rtemodel/src/RteModel.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -392,17 +392,9 @@ void RteModel::InsertPack(RtePackage* package)
392392
}
393393
auto state = package->GetPackageState();
394394
if(insertedPack->GetPackageState() == state) {
395-
string pdscPath = RteFsUtils::MakePathCanonical(package->GetAbsolutePackagePath());
396-
if(pdscPath.find(m_rtePath) == 0) { // regular installed pack => error
397395
// duplicate, kept it in a temporary collection till validate;
398-
m_packageDuplicates.push_back(package);
399-
return;
400-
}
401-
string insertedPdscPath = RteFsUtils::MakePathCanonical(insertedPack->GetAbsolutePackagePath());
402-
if(insertedPdscPath.find(m_rtePath) == string::npos) { // inserted pack is also from outside => error
403-
m_packageDuplicates.push_back(package);
404-
return;
405-
}
396+
m_packageDuplicates.push_back(package);
397+
return;
406398
} else if(state != PS_EXPLICIT_PATH) {
407399
return; // pack with explicit path must override installed pack
408400
}

libs/rtemodel/src/RtePackage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ bool RtePackRegistry::PurgePacks() {
15311531
set<string> toErase;
15321532
// collect packs that no longer exist
15331533
for(auto& [pdscFile, pack] : m_loadedPacks) {
1534-
if(!pack || !pack->Exists()) {
1534+
if(!pack || pack->GetPackageState() == PackageState::PS_EXPLICIT_PATH || !pack->Exists()) {
15351535
toErase.insert(pdscFile);
15361536
}
15371537
}

tools/projmgr/src/ProjMgrRpcServer.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,17 @@ RpcArgs::SuccessResult RpcHandler::LoadSolution(const string& solution, const st
320320
m_bUseAllPacks = false; // loading solution will first use only listed packs
321321
m_packReferences.clear(); // will be updated
322322
m_solutionLoaded = false; // assume not loaded yet
323-
// clear only projects, global RTE data and packs stay loaded
324-
ProjMgrKernel::Get()->GetGlobalModel()->ClearProjects();
323+
auto globalModel = ProjMgrKernel::Get()->GetGlobalModel();
324+
// remove non-existing and explicit packs
325+
bool purged = globalModel->GetPackRegistry()->PurgePacks();
326+
if(purged) {
327+
// clear project AND global RTE data, packs stay loaded
328+
globalModel->Clear();
329+
} else {
330+
// clear only projects, global RTE data and packs stay loaded
331+
globalModel->ClearProjects();
332+
}
333+
325334
RpcArgs::SuccessResult result = {false};
326335
const auto csolutionFile = RteFsUtils::MakePathCanonical(solution);
327336
if(!regex_match(csolutionFile, regex(".*\\.csolution\\.(yml|yaml)"))) {

tools/projmgr/src/ProjMgrWorker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ bool ProjMgrWorker::LoadAllRelevantPacks() {
548548
return false;
549549
}
550550
// Get installed packs
551-
if (pdscFiles.empty() || (m_loadPacksPolicy == LoadPacksPolicy::ALL) || (m_loadPacksPolicy == LoadPacksPolicy::LATEST)) {
551+
if (m_rpcMode || pdscFiles.empty() || (m_loadPacksPolicy == LoadPacksPolicy::ALL) || (m_loadPacksPolicy == LoadPacksPolicy::LATEST)) {
552552
const bool latest = (m_loadPacksPolicy == LoadPacksPolicy::LATEST) || (m_loadPacksPolicy == LoadPacksPolicy::DEFAULT);
553553
if (!m_kernel->GetEffectivePdscFiles(pdscFiles, latest)) {
554554
ProjMgrLogger::Get().Error("parsing installed packs failed");

tools/projmgr/test/src/ProjMgrRpcTests.cpp

Lines changed: 98 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,17 @@ class ProjMgrRpcTests : public ProjMgr, public ::testing::Test {
3333

3434
string CreateLoadRequests(const string& solution,
3535
const string& activeTarget = RteUtils::EMPTY_STRING,
36-
const vector<string>& contextList = RteUtils::EMPTY_STRING_VECTOR
36+
const vector<string>& contextList = RteUtils::EMPTY_STRING_VECTOR,
37+
bool loadPacks = true
3738
);
39+
40+
string FormatPackInfoRequests(const string& solution, const string& context, bool loadPacks);
41+
42+
vector<json> RunPackInfoRequests(const string& solution, const string& context, bool loadPacks);
43+
3844
bool CompareRpcResponse(const json& response, const string& ref);
3945

46+
int m_id = 0;
4047
};
4148

4249
string ProjMgrRpcTests::FormatRequest(const int id, const string& method, const json& params = json()) {
@@ -50,12 +57,18 @@ string ProjMgrRpcTests::FormatRequest(const int id, const string& method, const
5057
return request.dump();
5158
}
5259

53-
string ProjMgrRpcTests::CreateLoadRequests(const string& solution, const string& activeTarget, const vector<string>& contextList)
60+
string ProjMgrRpcTests::CreateLoadRequests(const string& solution, const string& activeTarget, const vector<string>& contextList, bool loadPacks)
5461
{
55-
string loadSolutionRequest;
62+
63+
string requests;
64+
if(loadPacks) {
65+
m_id = 0;
66+
requests = FormatRequest(++m_id, "LoadPacks");
67+
}
5668
if(!solution.empty()) {
69+
string loadSolutionRequest;
5770
auto csolutionPath = testinput_folder + solution;
58-
loadSolutionRequest = FormatRequest(2, "LoadSolution", json({{ "solution", csolutionPath }, { "activeTarget", activeTarget }}));
71+
loadSolutionRequest = FormatRequest(++m_id, "LoadSolution", json({{ "solution", csolutionPath }, { "activeTarget", activeTarget }}));
5972
if(!contextList.empty()) {
6073
YAML::Node cbuildset;
6174
cbuildset["cbuild-set"]["generated-by"] = "ProjMrgUnitTests";
@@ -70,8 +83,24 @@ string ProjMgrRpcTests::CreateLoadRequests(const string& solution, const string&
7083
cbuildsetFile << cbuildset << std::endl;
7184
cbuildsetFile.close();
7285
}
86+
requests += loadSolutionRequest;
7387
}
74-
return FormatRequest(1, "LoadPacks") + loadSolutionRequest;
88+
return requests;
89+
}
90+
91+
string ProjMgrRpcTests::FormatPackInfoRequests(const string& solution, const string& context, bool loadPacks) {
92+
vector<string> contextList = {
93+
context
94+
};
95+
auto requests = CreateLoadRequests(solution, "", contextList, loadPacks);
96+
requests += FormatRequest(++m_id, "GetUsedItems", json({{ "context", context }}));
97+
requests += FormatRequest(++m_id, "GetPacksInfo", json({{ "context", context }, {"all", false}}));
98+
requests += FormatRequest(++m_id, "GetPacksInfo", json({{ "context", context }, {"all", true}}));
99+
return requests;
100+
}
101+
102+
vector<json> ProjMgrRpcTests::RunPackInfoRequests(const string& solution, const string& context, bool loadPacks = true) {
103+
return RunRpcMethods( FormatPackInfoRequests(solution, context, loadPacks));
75104
}
76105

77106
bool ProjMgrRpcTests::CompareRpcResponse(const json& response, const string& ref) {
@@ -92,6 +121,7 @@ vector<json> ProjMgrRpcTests::RunRpcMethods(const string& strIn) {
92121
while(getline(iss, line)) {
93122
responses.push_back(json::parse(line));
94123
}
124+
m_id = 0;
95125
return responses;
96126
}
97127

@@ -1122,7 +1152,7 @@ TEST_F(ProjMgrRpcTests, PackReferenceMissing) {
11221152
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
11231153
const auto& responses = RunRpcMethods(requests);
11241154
EXPECT_TRUE(responses[2]["result"]["success"]);
1125-
auto packs = responses[2]["result"]["packs"];
1155+
auto packs = responses[2]["result"]["packs"];
11261156
// Verify missing field for unresolved packs
11271157
for(const auto& pack : packs) {
11281158
if(!pack.contains("resolvedPack")) {
@@ -1135,16 +1165,8 @@ TEST_F(ProjMgrRpcTests, PackReferenceMissing) {
11351165

11361166
TEST_F(ProjMgrRpcTests, RpcGetPacksInfoSimple) {
11371167
string context = "selectable+CM0";
1138-
vector<string> contextList = {
1139-
context
1140-
};
11411168

1142-
auto requests = CreateLoadRequests("/Validation/dependencies.csolution.yml", "", contextList);
1143-
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
1144-
requests += FormatRequest(4, "GetPacksInfo", json({{ "context", context }, {"all", false}}));
1145-
requests += FormatRequest(5, "GetPacksInfo", json({{ "context", context }, {"all", true}}));
1146-
1147-
const auto& responses = RunRpcMethods(requests);
1169+
const auto& responses = RunPackInfoRequests("/Validation/dependencies.csolution.yml", context);
11481170

11491171
EXPECT_TRUE(responses[2]["result"]["success"]);
11501172
auto packs = responses[2]["result"]["packs"];
@@ -1174,16 +1196,7 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoSimple) {
11741196

11751197
TEST_F(ProjMgrRpcTests, RpcGetPacksInfo) {
11761198
string context = "test1.Release+CM0";
1177-
vector<string> contextList = {
1178-
context
1179-
};
1180-
1181-
auto requests = CreateLoadRequests("/TestSolution/test_pack_requirements.csolution.yml", "", contextList);
1182-
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
1183-
requests += FormatRequest(4, "GetPacksInfo", json({{ "context", context }, {"all", false}}));
1184-
requests += FormatRequest(5, "GetPacksInfo", json({{ "context", context }, {"all", true}}));
1185-
1186-
const auto& responses = RunRpcMethods(requests);
1199+
const auto& responses = RunPackInfoRequests("/TestSolution/test_pack_requirements.csolution.yml", context);
11871200

11881201
EXPECT_TRUE(responses[2]["result"]["success"]);
11891202
auto packs = responses[2]["result"]["packs"];
@@ -1203,17 +1216,65 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfo) {
12031216
EXPECT_FALSE(packInfos[7].contains("used"));
12041217
}
12051218

1206-
TEST_F(ProjMgrRpcTests, RpcGetPacksInfoMissing) {
1207-
string context = "project+Miss";
1208-
vector<string> contextList = {
1209-
context
1210-
};
12111219

1212-
auto requests = CreateLoadRequests("/TestSolution/PackMissing/missing_pack.csolution.yml", "", contextList);
1213-
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
1214-
requests += FormatRequest(4, "GetPacksInfo", json({{ "context", context }, {"all", false}}));
1220+
TEST_F(ProjMgrRpcTests, RpcGetPacksInfoPackPath) {
1221+
string context = "pack_path+CM0";
12151222

1216-
const auto& responses = RunRpcMethods(requests);
1223+
// first solution
1224+
auto requests = FormatPackInfoRequests("/TestSolution/pack_path.csolution.yml", context, true);
1225+
// second solution, same pack in a different directory
1226+
requests += FormatPackInfoRequests("/TestSolution/pack_path1.csolution.yml", context, false);
1227+
1228+
auto responses = RunRpcMethods(requests);
1229+
1230+
// first solution
1231+
auto expectedPackPath = testinput_folder + "/SolutionSpecificPack";
1232+
auto expectedDoc = testinput_folder + "/SolutionSpecificPack" + "/Doc/overview.md";
1233+
1234+
EXPECT_TRUE(responses[2]["result"]["success"]);
1235+
auto packs = responses[2]["result"]["packs"];
1236+
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
1237+
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP");
1238+
EXPECT_EQ(packs[0]["path"], expectedPackPath);
1239+
EXPECT_FALSE(packs[0].contains("upgrade"));
1240+
1241+
EXPECT_TRUE(responses[3]["result"]["success"]); // get pack infos
1242+
auto packInfos = responses[3]["result"]["packs"];
1243+
EXPECT_EQ(packInfos.size(), 1);
1244+
EXPECT_EQ(packInfos[0]["id"], "ARM::RteTest_DFP@0.2.0");
1245+
EXPECT_EQ(packInfos[0]["doc"], expectedDoc);
1246+
EXPECT_TRUE(packInfos[0]["used"]);
1247+
1248+
packInfos = responses[4]["result"]["packs"];
1249+
EXPECT_EQ(packInfos.size(), 8);
1250+
1251+
// second solution
1252+
1253+
expectedPackPath = testinput_folder + "/SolutionSpecificPack1";
1254+
expectedDoc = testinput_folder + "/SolutionSpecificPack1" + "/Doc/overview.md";
1255+
1256+
EXPECT_TRUE(responses[6]["result"]["success"]);
1257+
packs = responses[6]["result"]["packs"];
1258+
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
1259+
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP");
1260+
EXPECT_EQ(packs[0]["path"], expectedPackPath);
1261+
EXPECT_FALSE(packs[0].contains("upgrade"));
1262+
1263+
EXPECT_TRUE(responses[7]["result"]["success"]); // get pack infos
1264+
packInfos = responses[7]["result"]["packs"];
1265+
EXPECT_EQ(packInfos.size(), 1);
1266+
EXPECT_EQ(packInfos[0]["id"], "ARM::RteTest_DFP@0.2.0");
1267+
EXPECT_EQ(packInfos[0]["doc"], expectedDoc);
1268+
EXPECT_TRUE(packInfos[0]["used"]);
1269+
1270+
packInfos = responses[8]["result"]["packs"];
1271+
EXPECT_EQ(packInfos.size(), 8);
1272+
}
1273+
1274+
1275+
TEST_F(ProjMgrRpcTests, RpcGetPacksInfoMissing) {
1276+
string context = "project+Miss";
1277+
const auto& responses = RunPackInfoRequests("/TestSolution/PackMissing/missing_pack.csolution.yml", context);
12171278

12181279
EXPECT_TRUE(responses[2]["result"]["success"]);
12191280
auto packs = responses[2]["result"]["packs"];
@@ -1230,8 +1291,6 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoMissing) {
12301291
EXPECT_EQ(packs[3]["pack"], "ARM::RteTest_DFP");
12311292
EXPECT_EQ(packs[3]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
12321293

1233-
1234-
12351294
EXPECT_TRUE(responses[3]["result"]["success"]); // get pack infos
12361295
auto packInfos = responses[3]["result"]["packs"];
12371296
EXPECT_EQ(packInfos.size(), 4);
@@ -1242,20 +1301,9 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoMissing) {
12421301
EXPECT_EQ(packInfos[3]["id"], "ARM::RteTest_DFP@0.2.0");
12431302
}
12441303

1245-
1246-
12471304
TEST_F(ProjMgrRpcTests, RpcGetPacksNotLatest) {
12481305
string context = "test1.DebugOldDfp+CM0";
1249-
vector<string> contextList = {
1250-
context
1251-
};
1252-
1253-
auto requests = CreateLoadRequests("/TestSolution/test_pack_requirements.csolution.yml", "", contextList);
1254-
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
1255-
requests += FormatRequest(4, "GetPacksInfo", json({{ "context", context }, {"all", false}}));
1256-
requests += FormatRequest(5, "GetPacksInfo", json({{ "context", context }, {"all", true}}));
1257-
1258-
const auto& responses = RunRpcMethods(requests);
1306+
const auto& responses = RunPackInfoRequests("/TestSolution/test_pack_requirements.csolution.yml", context);
12591307

12601308
EXPECT_TRUE(responses[2]["result"]["success"]);
12611309
auto packs = responses[2]["result"]["packs"];
@@ -1293,16 +1341,7 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksNotLatest) {
12931341

12941342
TEST_F(ProjMgrRpcTests, RpcGetPacksInfoLayer) {
12951343
string context = "packs.CompatibleLayers+RteTest_ARMCM3";
1296-
vector<string> contextList = {
1297-
context
1298-
};
1299-
1300-
auto requests = CreateLoadRequests("/TestLayers/packs.csolution.yml", "", contextList);
1301-
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
1302-
requests += FormatRequest(4, "GetPacksInfo", json({{ "context", context }, {"all", false}}));
1303-
requests += FormatRequest(5, "GetPacksInfo", json({{ "context", context }, {"all", true}}));
1304-
1305-
const auto& responses = RunRpcMethods(requests);
1344+
const auto& responses = RunPackInfoRequests("/TestLayers/packs.csolution.yml", context);
13061345

13071346
EXPECT_TRUE(responses[2]["result"]["success"]);
13081347
auto packs = responses[2]["result"]["packs"];
@@ -1329,15 +1368,7 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoLayer) {
13291368

13301369
TEST_F(ProjMgrRpcTests, RpcGetPacksInfoLocal) {
13311370
string context = "incompatible.Debug+CM0";
1332-
vector<string> contextList = {
1333-
context
1334-
};
1335-
1336-
auto requests = CreateLoadRequests("/TestSolution/PackRequirements/incompatible.csolution.yml", "", contextList);
1337-
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
1338-
requests += FormatRequest(4, "GetPacksInfo", json({{ "context", context }, {"all", false}}));
1339-
1340-
const auto& responses = RunRpcMethods(requests);
1371+
const auto& responses = RunPackInfoRequests("/TestSolution/PackRequirements/incompatible.csolution.yml", context);
13411372

13421373
EXPECT_TRUE(responses[2]["result"]["success"]);
13431374
auto packs = responses[2]["result"]["packs"];

tools/projmgr/test/src/ProjMgrTestEnv.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ void ProjMgrTestEnv::SetUp() {
125125
}
126126
RteFsUtils::CreateDirectories(destPackPath);
127127
fs::copy(fs::path(srcPackPath), fs::path(destPackPath), fs::copy_options::recursive, ec);
128+
129+
destPackPath = testinput_folder + "/SolutionSpecificPack1";
130+
if (RteFsUtils::Exists(destPackPath)) {
131+
RteFsUtils::RemoveDir(destPackPath);
132+
}
133+
RteFsUtils::CreateDirectories(destPackPath);
134+
fs::copy(fs::path(srcPackPath), fs::path(destPackPath), fs::copy_options::recursive, ec);
135+
136+
128137
srcPackPath = testcmsispack_folder + "/ARM/RteTest/0.1.0";
129138
destPackPath = testinput_folder + "/SolutionSpecificPack2";
130139
if (RteFsUtils::Exists(destPackPath)) {
@@ -243,7 +252,7 @@ std::map<std::string, std::string, RtePackageComparator> ProjMgrTestEnv::GetEffe
243252
rteKernel.SetCmsisPackRoot(GetCmsisPackRoot());
244253
std::list<std::string> pdscFiles;
245254
std::list<RtePackage*> packs;
246-
rteKernel.GetEffectivePdscFiles(pdscFiles, bLatestsOnly);
255+
rteKernel.GetEffectivePdscFiles(pdscFiles, bLatestsOnly);
247256
rteKernel.LoadAndInsertPacks(packs, pdscFiles);
248257
for (const auto& pack : packs) {
249258
pdscMap[pack->GetID()] = pack->GetPackageFileName();

0 commit comments

Comments
 (0)