Skip to content

Commit 9f160e8

Browse files
authored
[skip-changelog] Added parsing of pluggable monitors in package_index.json (#1449)
* Added parsing of monitorDependecies field in package index * Added monitor dependencies support in package_manager
1 parent 826adc5 commit 9f160e8

File tree

8 files changed

+179
-13
lines changed

8 files changed

+179
-13
lines changed

arduino/cores/cores.go

+33
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ type PlatformRelease struct {
5151
BoardsManifest []*BoardManifest
5252
ToolDependencies ToolDependencies
5353
DiscoveryDependencies DiscoveryDependencies
54+
MonitorDependencies MonitorDependencies
5455
Help PlatformReleaseHelp `json:"-"`
5556
Platform *Platform `json:"-"`
5657
Properties *properties.Map `json:"-"`
@@ -142,6 +143,30 @@ func (d *DiscoveryDependency) String() string {
142143
return fmt.Sprintf("%s:%s", d.Packager, d.Name)
143144
}
144145

146+
// MonitorDependencies is a list of MonitorDependency
147+
type MonitorDependencies []*MonitorDependency
148+
149+
// Sort the DiscoveryDependencies by name.
150+
func (d MonitorDependencies) Sort() {
151+
sort.Slice(d, func(i, j int) bool {
152+
if d[i].Packager != d[j].Packager {
153+
return d[i].Packager < d[j].Packager
154+
}
155+
return d[i].Name < d[j].Name
156+
})
157+
}
158+
159+
// MonitorDependency identifies a specific monitor, version is omitted
160+
// since the latest version will always be used
161+
type MonitorDependency struct {
162+
Name string
163+
Packager string
164+
}
165+
166+
func (d *MonitorDependency) String() string {
167+
return fmt.Sprintf("%s:%s", d.Packager, d.Name)
168+
}
169+
145170
// GetOrCreateRelease returns the specified release corresponding the provided version,
146171
// or creates a new one if not found.
147172
func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformRelease {
@@ -268,6 +293,14 @@ func (release *PlatformRelease) RequiresToolRelease(toolRelease *ToolRelease) bo
268293
return true
269294
}
270295
}
296+
for _, monitor := range release.MonitorDependencies {
297+
if monitor.Name == toolRelease.Tool.Name &&
298+
monitor.Packager == toolRelease.Tool.Package.Name &&
299+
// We always want the latest monitor version available
300+
toolRelease.Version.Equal(toolRelease.Tool.LatestRelease().Version) {
301+
return true
302+
}
303+
}
271304
return false
272305
}
273306

arduino/cores/packageindex/index.go

+28
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ type indexPlatformRelease struct {
6161
Help indexHelp `json:"help,omitempty"`
6262
ToolDependencies []indexToolDependency `json:"toolsDependencies"`
6363
DiscoveryDependencies []indexDiscoveryDependency `json:"discoveryDependencies"`
64+
MonitorDependencies []indexMonitorDependency `json:"monitorDependencies"`
6465
}
6566

6667
// indexToolDependency represents a single dependency of a core from a tool.
@@ -76,6 +77,12 @@ type indexDiscoveryDependency struct {
7677
Name string `json:"name"`
7778
}
7879

80+
// indexMonitorDependency represents a single dependency of a core from a pluggable monitor tool.
81+
type indexMonitorDependency struct {
82+
Packager string `json:"packager"`
83+
Name string `json:"name"`
84+
}
85+
7986
// indexToolRelease represents a single Tool from package_index.json file.
8087
type indexToolRelease struct {
8188
Name string `json:"name,required"`
@@ -152,6 +159,14 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
152159
})
153160
}
154161

162+
monitors := []indexMonitorDependency{}
163+
for _, m := range pr.MonitorDependencies {
164+
monitors = append(monitors, indexMonitorDependency{
165+
Packager: m.Packager,
166+
Name: m.Name,
167+
})
168+
}
169+
155170
packageTools := []*indexToolRelease{}
156171
for name, tool := range pr.Platform.Package.Tools {
157172
for _, toolRelease := range tool.Releases {
@@ -196,6 +211,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
196211
Help: indexHelp{Online: pr.Help.Online},
197212
ToolDependencies: tools,
198213
DiscoveryDependencies: discoveries,
214+
MonitorDependencies: monitors,
199215
}},
200216
Tools: packageTools,
201217
Help: indexHelp{Online: pr.Platform.Package.Help.Online},
@@ -251,6 +267,7 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core
251267
outPlatformRelease.BoardsManifest = inPlatformRelease.extractBoardsManifest()
252268
outPlatformRelease.ToolDependencies = inPlatformRelease.extractToolDependencies()
253269
outPlatformRelease.DiscoveryDependencies = inPlatformRelease.extractDiscoveryDependencies()
270+
outPlatformRelease.MonitorDependencies = inPlatformRelease.extractMonitorDependencies()
254271
return nil
255272
}
256273

@@ -277,6 +294,17 @@ func (inPlatformRelease indexPlatformRelease) extractDiscoveryDependencies() cor
277294
return res
278295
}
279296

297+
func (inPlatformRelease indexPlatformRelease) extractMonitorDependencies() cores.MonitorDependencies {
298+
res := make(cores.MonitorDependencies, len(inPlatformRelease.MonitorDependencies))
299+
for i, discovery := range inPlatformRelease.MonitorDependencies {
300+
res[i] = &cores.MonitorDependency{
301+
Name: discovery.Name,
302+
Packager: discovery.Packager,
303+
}
304+
}
305+
return res
306+
}
307+
280308
func (inPlatformRelease indexPlatformRelease) extractBoardsManifest() []*cores.BoardManifest {
281309
boards := make([]*cores.BoardManifest, len(inPlatformRelease.Boards))
282310
for i, board := range inPlatformRelease.Boards {

arduino/cores/packageindex/index_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,16 @@ func TestIndexFromPlatformRelease(t *testing.T) {
8181
Name: "serial-discovery",
8282
},
8383
},
84+
MonitorDependencies: cores.MonitorDependencies{
85+
{
86+
Packager: "arduino",
87+
Name: "ble-monitor",
88+
},
89+
{
90+
Packager: "arduino",
91+
Name: "serial-monitor",
92+
},
93+
},
8494
Platform: &cores.Platform{
8595
Name: "Arduino AVR Boards",
8696
Architecture: "avr",
@@ -355,6 +365,16 @@ func TestIndexFromPlatformRelease(t *testing.T) {
355365
Name: "serial-discovery",
356366
},
357367
},
368+
MonitorDependencies: []indexMonitorDependency{
369+
{
370+
Packager: "arduino",
371+
Name: "ble-monitor",
372+
},
373+
{
374+
Packager: "arduino",
375+
Name: "serial-monitor",
376+
},
377+
},
358378
}},
359379
Tools: []*indexToolRelease{
360380
{
@@ -552,6 +572,7 @@ func TestIndexFromPlatformRelease(t *testing.T) {
552572
require.ElementsMatch(t, expectedPlatform.Boards, indexPlatform.Boards)
553573
require.ElementsMatch(t, expectedPlatform.ToolDependencies, indexPlatform.ToolDependencies)
554574
require.ElementsMatch(t, expectedPlatform.DiscoveryDependencies, indexPlatform.DiscoveryDependencies)
575+
require.ElementsMatch(t, expectedPlatform.MonitorDependencies, indexPlatform.MonitorDependencies)
555576
}
556577
}
557578
}

arduino/cores/packagemanager/package_manager.go

+23
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,17 @@ func (pm *PackageManager) FindToolsRequiredFromPlatformRelease(platform *cores.P
481481
delete(foundTools, tool.Tool.Name)
482482
}
483483

484+
platform.MonitorDependencies.Sort()
485+
for _, monitorDep := range platform.MonitorDependencies {
486+
pm.Log.WithField("monitor", monitorDep).Infof("Required monitor")
487+
tool := pm.FindMonitorDependency(monitorDep)
488+
if tool == nil {
489+
return nil, fmt.Errorf(tr("monitor release not found: %s"), monitorDep)
490+
}
491+
requiredTools = append(requiredTools, tool)
492+
delete(foundTools, tool.Tool.Name)
493+
}
494+
484495
for _, toolRel := range foundTools {
485496
requiredTools = append(requiredTools, toolRel)
486497
}
@@ -563,3 +574,15 @@ func (pm *PackageManager) FindDiscoveryDependency(discovery *cores.DiscoveryDepe
563574
return toolRelease.GetLatestInstalled()
564575
}
565576
}
577+
578+
// FindMonitorDependency returns the ToolRelease referenced by the MonitorDepenency or nil if
579+
// the referenced monitor doesn't exists.
580+
func (pm *PackageManager) FindMonitorDependency(discovery *cores.MonitorDependency) *cores.ToolRelease {
581+
if pack := pm.Packages[discovery.Packager]; pack == nil {
582+
return nil
583+
} else if toolRelease := pack.Tools[discovery.Name]; toolRelease == nil {
584+
return nil
585+
} else {
586+
return toolRelease.GetLatestInstalled()
587+
}
588+
}

arduino/cores/packagemanager/package_manager_test.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,24 @@ func TestFindToolsRequiredFromPlatformRelease(t *testing.T) {
389389
toolRelease.InstallDir = fakePath
390390
}
391391

392+
{
393+
// ble-monitor tool
394+
tool := pack.GetOrCreateTool("ble-monitor")
395+
toolRelease := tool.GetOrCreateRelease(semver.ParseRelaxed("1.0.0"))
396+
// We set this to fake the tool is installed
397+
toolRelease.InstallDir = fakePath
398+
tool.GetOrCreateRelease(semver.ParseRelaxed("0.1.0"))
399+
}
400+
401+
{
402+
// serial-monitor tool
403+
tool := pack.GetOrCreateTool("serial-monitor")
404+
tool.GetOrCreateRelease(semver.ParseRelaxed("1.0.0"))
405+
toolRelease := tool.GetOrCreateRelease(semver.ParseRelaxed("0.1.0"))
406+
// We set this to fake the tool is installed
407+
toolRelease.InstallDir = fakePath
408+
}
409+
392410
platform := pack.GetOrCreatePlatform("avr")
393411
release := platform.GetOrCreateRelease(semver.MustParse("1.0.0"))
394412
release.ToolDependencies = append(release.ToolDependencies, &cores.ToolDependency{
@@ -409,12 +427,20 @@ func TestFindToolsRequiredFromPlatformRelease(t *testing.T) {
409427
Name: "serial-discovery",
410428
Packager: "arduino",
411429
})
430+
release.MonitorDependencies = append(release.MonitorDependencies, &cores.MonitorDependency{
431+
Name: "ble-monitor",
432+
Packager: "arduino",
433+
})
434+
release.MonitorDependencies = append(release.MonitorDependencies, &cores.MonitorDependency{
435+
Name: "serial-monitor",
436+
Packager: "arduino",
437+
})
412438
// We set this to fake the platform is installed
413439
release.InstallDir = fakePath
414440

415441
tools, err := pm.FindToolsRequiredFromPlatformRelease(release)
416442
require.NoError(t, err)
417-
require.Len(t, tools, 4)
443+
require.Len(t, tools, 6)
418444
}
419445

420446
func TestLegacyPackageConversionToPluggableDiscovery(t *testing.T) {

arduino/cores/status.go

+27
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,33 @@ func (packages Packages) GetPlatformReleaseDiscoveryDependencies(release *Platfo
127127
return res, nil
128128
}
129129

130+
// GetPlatformReleaseMonitorDependencies returns the monitor releases needed by the specified PlatformRelease
131+
func (packages Packages) GetPlatformReleaseMonitorDependencies(release *PlatformRelease) ([]*ToolRelease, error) {
132+
if release == nil {
133+
return nil, fmt.Errorf(tr("release cannot be nil"))
134+
}
135+
136+
res := []*ToolRelease{}
137+
for _, monitor := range release.MonitorDependencies {
138+
pkg, exists := packages[monitor.Packager]
139+
if !exists {
140+
return nil, fmt.Errorf(tr("package %s not found"), monitor.Packager)
141+
}
142+
tool, exists := pkg.Tools[monitor.Name]
143+
if !exists {
144+
return nil, fmt.Errorf(tr("tool %s not found"), monitor.Name)
145+
}
146+
147+
// We always want to use the latest available release for monitors
148+
latestRelease := tool.LatestRelease()
149+
if latestRelease == nil {
150+
return nil, fmt.Errorf(tr("can't find latest release of %s"), monitor.Name)
151+
}
152+
res = append(res, latestRelease)
153+
}
154+
return res, nil
155+
}
156+
130157
// GetOrCreatePlatform returns the Platform object with the specified architecture
131158
// or creates a new one if not found
132159
func (targetPackage *Package) GetOrCreatePlatform(architecture string) *Platform {

i18n/data/en.po

+13-5
Original file line numberDiff line numberDiff line change
@@ -2398,6 +2398,7 @@ msgid "calling %[1]s: %[2]w"
23982398
msgstr "calling %[1]s: %[2]w"
23992399

24002400
#: arduino/cores/status.go:123
2401+
#: arduino/cores/status.go:150
24012402
msgid "can't find latest release of %s"
24022403
msgstr "can't find latest release of %s"
24032404

@@ -2771,7 +2772,7 @@ msgstr "invalid path creating config dir: %[1]s error: %[2]w"
27712772
msgid "invalid path writing inventory file: %[1]s error: %[2]w"
27722773
msgstr "invalid path writing inventory file: %[1]s error: %[2]w"
27732774

2774-
#: arduino/cores/packageindex/index.go:239
2775+
#: arduino/cores/packageindex/index.go:255
27752776
msgid "invalid platform archive size: %s"
27762777
msgstr "invalid platform archive size: %s"
27772778

@@ -2889,6 +2890,10 @@ msgstr "missing platform %[1]s:%[2]s referenced by board %[3]s"
28892890
msgid "missing platform release %[1]s:%[2]s referenced by board %[3]s"
28902891
msgstr "missing platform release %[1]s:%[2]s referenced by board %[3]s"
28912892

2893+
#: arduino/cores/packagemanager/package_manager.go:489
2894+
msgid "monitor release not found: %s"
2895+
msgstr "monitor release not found: %s"
2896+
28922897
#: arduino/libraries/librariesmanager/install.go:179
28932898
#: arduino/resources/install.go:94
28942899
msgid "moving extracted archive to destination dir: %s"
@@ -2958,14 +2963,15 @@ msgstr "opening target file: %s"
29582963
#: arduino/cores/packagemanager/download.go:73
29592964
#: arduino/cores/status.go:88
29602965
#: arduino/cores/status.go:113
2966+
#: arduino/cores/status.go:140
29612967
msgid "package %s not found"
29622968
msgstr "package %s not found"
29632969

29642970
#: arduino/cores/packagemanager/package_manager.go:259
29652971
msgid "package '%s' not found"
29662972
msgstr "package '%s' not found"
29672973

2968-
#: arduino/cores/status.go:167
2974+
#: arduino/cores/status.go:194
29692975
msgid "package not found"
29702976
msgstr "package not found"
29712977

@@ -3093,10 +3099,11 @@ msgstr "release %[1]s not found for tool %[2]s"
30933099

30943100
#: arduino/cores/status.go:82
30953101
#: arduino/cores/status.go:106
3102+
#: arduino/cores/status.go:133
30963103
msgid "release cannot be nil"
30973104
msgstr "release cannot be nil"
30983105

3099-
#: arduino/cores/status.go:183
3106+
#: arduino/cores/status.go:210
31003107
msgid "release not found"
31013108
msgstr "release not found"
31023109

@@ -3212,6 +3219,7 @@ msgstr "tool %s is not managed by package manager"
32123219

32133220
#: arduino/cores/status.go:92
32143221
#: arduino/cores/status.go:117
3222+
#: arduino/cores/status.go:144
32153223
msgid "tool %s not found"
32163224
msgstr "tool %s not found"
32173225

@@ -3223,7 +3231,7 @@ msgstr "tool '%[1]s' not found in package '%[2]s'"
32233231
msgid "tool not available for your OS"
32243232
msgstr "tool not available for your OS"
32253233

3226-
#: arduino/cores/status.go:171
3234+
#: arduino/cores/status.go:198
32273235
msgid "tool not found"
32283236
msgstr "tool not found"
32293237

@@ -3232,7 +3240,7 @@ msgid "tool not installed"
32323240
msgstr "tool not installed"
32333241

32343242
#: arduino/cores/packagemanager/package_manager.go:467
3235-
#: arduino/cores/packagemanager/package_manager.go:533
3243+
#: arduino/cores/packagemanager/package_manager.go:544
32363244
msgid "tool release not found: %s"
32373245
msgstr "tool release not found: %s"
32383246

i18n/rice-box.go

+7-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)