Skip to content

Commit cda5b73

Browse files
edrioukCopilot
andauthored
Use Options Resolve (#2452)
## Fixes <!-- List the issue(s) this PR resolves --> - Open-CMSIS-Pack/vscode-cmsis-solution#213 ## Changes <!-- List the changes this PR introduces --> - make use of options argument for Resolve to set destination layer file ## Checklist <!-- Put an `x` in the boxes. All tasks must be completed and boxes checked before merging. --> - [ ] 🤖 This change is covered by unit tests (if applicable). - [ ] 🤹 Manual testing has been performed (if necessary). - [ ] 🛡️ Security impacts have been considered (if relevant). - [ ] 📖 Documentation updates are complete (if required). - [ ] 🧠 Third-party dependencies and TPIP updated (if required). --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 5a1dce6 commit cda5b73

3 files changed

Lines changed: 100 additions & 21 deletions

File tree

tools/projmgr/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ include(FetchContent)
2424
FetchContent_Declare(
2525
rpc-interface
2626
DOWNLOAD_EXTRACT_TIMESTAMP ON
27-
URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.9/csolution-rpc.zip
28-
URL_HASH SHA256=2be58020a28b7f8cda5da8f6cba8f605f93346beb32805919c5872b8fbc0d541
27+
URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.10/csolution-rpc.zip
28+
URL_HASH SHA256=246e1f6e5c1a6e269aeadf37f6bf62897c5bb9d374b7fbfdf0e19af61449379e
2929
)
3030
FetchContent_MakeAvailable(rpc-interface)
3131

tools/projmgr/src/ProjMgrRpcServer.cpp

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class RpcHandler : public RpcMethods {
8080
RpcArgs::GetVersionResult GetVersion(void) override;
8181
RpcArgs::SuccessResult Shutdown(void) override;
8282
RpcArgs::SuccessResult Apply(const string& context) override;
83-
RpcArgs::SuccessResult Resolve(const string& context) override;
83+
RpcArgs::SuccessResult Resolve(const string& context, const RpcArgs::Options& options) override;
8484
RpcArgs::SuccessResult LoadPacks(void) override;
8585
RpcArgs::SuccessResult LoadSolution(const string& solution, const string& activeTarget) override;
8686
RpcArgs::ContextInfo GetContextInfo(const string& context) override;
@@ -137,6 +137,8 @@ class RpcHandler : public RpcMethods {
137137
const ContextItem& GetContext(const string& context) const;
138138
RteTarget* GetActiveTarget(const string& context) const;
139139
RteComponentAggregate* GetComponentAggregate(const string& context, const string& id) const;
140+
void SetAggregateOptions(const string& context, RteComponentAggregate* rteAggregate, const RpcArgs::Options& options);
141+
void SetOptionsForNewlySelectedAggregates(const string& context, RteTarget* rteTarget, const RpcArgs::Options& options);
140142
bool CheckSolutionArg(string& solution, optional<string>& message) const;
141143
};
142144

@@ -224,6 +226,35 @@ RteComponentAggregate* RpcHandler::GetComponentAggregate(const string& context,
224226
return rteAggregate;
225227
}
226228

229+
void RpcHandler::SetAggregateOptions(const string& context, RteComponentAggregate* rteAggregate, const RpcArgs::Options& options) {
230+
auto& layer = options.layer.has_value() ? options.layer.value() : RteUtils::EMPTY_STRING;
231+
rteAggregate->AddAttribute("layer", layer, false);
232+
233+
const bool explicitVendor = options.explicitVendor.has_value() ? options.explicitVendor.value() : false;
234+
rteAggregate->AddAttribute("explicitVendor", explicitVendor ? "1" : "", false);
235+
236+
auto& explicitVersion = options.explicitVersion.has_value() ? options.explicitVersion.value() : RteUtils::EMPTY_STRING;
237+
// TODO: check if version is plausible
238+
rteAggregate->AddAttribute("explicitVersion", explicitVersion, false);
239+
auto rteComponent = rteAggregate->GetComponent();
240+
// ensure Pack reference is added when component is selected
241+
int count = rteAggregate->IsSelected();
242+
if(count > 0 && rteComponent) {
243+
auto& packId = rteComponent->GetPackage()->GetID();
244+
EnsurePackReferenceForPack(context, packId, layer, !explicitVersion.empty());
245+
}
246+
}
247+
248+
void RpcHandler::SetOptionsForNewlySelectedAggregates(const string& context, RteTarget* rteTarget, const RpcArgs::Options& options) {
249+
const auto& selectedAggregates = rteTarget->CollectSelectedComponentAggregates();
250+
for(const auto& [rteAggregate, _] : selectedAggregates) {
251+
if(!rteAggregate->GetComponentInstance()) {
252+
// only set options to newly selected components
253+
SetAggregateOptions(context, rteAggregate, options);
254+
}
255+
}
256+
}
257+
227258
RpcArgs::GetVersionResult RpcHandler::GetVersion(void) {
228259
RpcArgs::GetVersionResult res = {{true}};
229260
res.message = string("Running ") + INTERNAL_NAME + " " + VERSION_STRING;
@@ -256,18 +287,19 @@ RpcArgs::SuccessResult RpcHandler::Apply(const string& context) {
256287
return result;
257288
}
258289

259-
RpcArgs::SuccessResult RpcHandler::Resolve(const string& context) {
290+
RpcArgs::SuccessResult RpcHandler::Resolve(const string& context, const RpcArgs::Options& options) {
260291
RpcArgs::SuccessResult result = {false};
261292
auto rteTarget = GetActiveTarget(context);
262293
auto rteProject = rteTarget->GetProject();
263294
if(rteProject) {
264295
result.success = rteProject->ResolveDependencies(rteTarget);
296+
SetOptionsForNewlySelectedAggregates(context, rteTarget, options);
297+
265298
Apply(context);
266299
}
267300
return result;
268301
}
269302

270-
271303
RpcArgs::SuccessResult RpcHandler::LoadPacks(void) {
272304
RpcArgs::SuccessResult result = {false};
273305
m_manager.Clear();
@@ -576,21 +608,7 @@ RpcArgs::SuccessResult RpcHandler::SelectComponent(const string& context, const
576608
result.success = activeTarget->SelectComponent(rteAggregate, count, true);
577609
rteComponent = rteAggregate->GetComponent();
578610
}
579-
// set options
580-
auto& layer = options.layer.has_value() ? options.layer.value() : RteUtils::EMPTY_STRING;
581-
rteAggregate->AddAttribute("layer", layer, false);
582-
bool explicitVendor = options.explicitVendor.has_value() ? options.explicitVendor.value() : false;
583-
rteAggregate->AddAttribute("explicitVendor", explicitVendor ? "1" : "", false);
584-
585-
auto& explicitVersion = options.explicitVersion.has_value() ? options.explicitVersion.value() : RteUtils::EMPTY_STRING;
586-
// TODO: check if version is plausible
587-
rteAggregate->AddAttribute("explicitVersion", explicitVersion, false);
588-
589-
// ensure Pack reference is added when component is selected
590-
if(count > 0 && rteComponent) {
591-
auto& packId = rteComponent->GetPackage()->GetID();
592-
EnsurePackReferenceForPack(context, packId, layer, !explicitVersion.empty());
593-
}
611+
SetAggregateOptions(context, rteAggregate, options);
594612
Apply(context);
595613
return result;
596614
}

tools/projmgr/test/src/ProjMgrRpcTests.cpp

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,9 +529,14 @@ TEST_F(ProjMgrRpcTests, RpcResolveComponents) {
529529
vector<string> contextList = {
530530
context
531531
};
532+
RpcArgs::Options opt{""};
533+
json resolveParam;
534+
resolveParam["context"] = context;
535+
RpcArgs::to_json(resolveParam["options"], opt);
536+
532537
auto requests = CreateLoadRequests("/Validation/dependencies.csolution.yml", "", contextList);
533538
requests += FormatRequest(3, "ValidateComponents", json({{ "context", context }}));
534-
requests += FormatRequest(4, "Resolve", json({{ "context", context }}));
539+
requests += FormatRequest(4, "Resolve", resolveParam);
535540
requests += FormatRequest(5, "ValidateComponents", json({{ "context", context }}));
536541

537542
const auto& responses = RunRpcMethods(requests);
@@ -666,7 +671,63 @@ TEST_F(ProjMgrRpcTests, RpcSelectComponentLayer) {
666671
EXPECT_TRUE(components[1]["options"]["explicitVendor"]);
667672
}
668673

674+
TEST_F(ProjMgrRpcTests, RpcResolveComponentLayer) {
675+
string context = "selectable+CM0";
676+
vector<string> contextList = {
677+
context
678+
};
679+
RpcArgs::Options opt{"core.clayer.yml", "@>=0.1.0", true};
680+
json param;
681+
param["context"] = context;
682+
RpcArgs::to_json(param["options"], opt);
683+
684+
auto requests = CreateLoadRequests("/Validation/dependencies.csolution.yml", "", contextList);
685+
requests += FormatRequest(3, "GetUsedItems", json({{ "context", context }}));
686+
requests += FormatRequest(4, "Resolve", param);
687+
requests += FormatRequest(5, "GetComponentsTree", json({{ "context", context }, {"all", false}}));
688+
requests += FormatRequest(6, "GetComponentsTree", json({{ "context", context }, {"all", true}}));
689+
requests += FormatRequest(7, "GetComponentsTree", json({{ "context", context }, {"all", false}}));
690+
requests += FormatRequest(8, "Apply", json({{ "context", context }}));
691+
requests += FormatRequest(9, "GetUsedItems", json({{ "context", context }}));
692+
693+
const auto& responses = RunRpcMethods(requests);
669694

695+
EXPECT_TRUE(responses[2]["result"]["success"]);
696+
auto components = responses[2]["result"]["components"];
697+
auto packs = responses[2]["result"]["packs"];
698+
EXPECT_EQ(packs.size(), 2);
699+
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP@0.2.0");
700+
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
701+
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
702+
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");
703+
704+
EXPECT_TRUE(responses[3]["result"]["success"]); // resolve successful
705+
706+
EXPECT_TRUE(responses[7]["result"]["success"]); // apply successful
707+
708+
components = responses[8]["result"]["components"];
709+
packs = responses[8]["result"]["packs"];
710+
EXPECT_EQ(packs.size(), 3); // added reference to layer file
711+
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP@0.2.0");
712+
string origin = packs[0]["origin"];
713+
EXPECT_TRUE(origin.find(".csolution.yml") != string::npos);
714+
EXPECT_TRUE(!!packs[0]["selected"]);
715+
EXPECT_EQ(packs[2]["pack"], "ARM::RteTest_DFP@0.2.0");
716+
EXPECT_EQ(packs[2]["origin"], "core.clayer.yml");
717+
EXPECT_TRUE(!!packs[2]["selected"]);
718+
719+
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
720+
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");
721+
722+
string id = components[1]["id"];
723+
EXPECT_EQ(id, "ARM::RteTest:CORE@>=0.1.0");
724+
EXPECT_EQ(RteUtils::ExtractPrefix(id, "::"), "ARM");
725+
EXPECT_EQ(RteUtils::ExtractSuffix(id, "@", true), "@>=0.1.0");
726+
EXPECT_EQ(components[1]["resolvedComponent"]["id"], "ARM::RteTest:CORE@0.1.1");
727+
EXPECT_EQ(components[1]["options"]["layer"], "core.clayer.yml");
728+
EXPECT_EQ(components[1]["options"]["explicitVersion"], "@>=0.1.0");
729+
EXPECT_TRUE(components[1]["options"]["explicitVendor"]);
730+
}
670731

671732
TEST_F(ProjMgrRpcTests, RpcSelectComponentMissing) {
672733
string context = "missing-component+CM0";

0 commit comments

Comments
 (0)