Skip to content

Commit 91c296c

Browse files
Added discoveriesDependencies parsing in package_index.json (#1345)
Co-authored-by: Silvano Cerza <[email protected]>
1 parent 3c3664e commit 91c296c

File tree

8 files changed

+384
-51
lines changed

8 files changed

+384
-51
lines changed

arduino/cores/cores.go

+36-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package cores
1717

1818
import (
1919
"encoding/json"
20+
"fmt"
2021
"sort"
2122
"strings"
2223

@@ -47,7 +48,8 @@ type PlatformRelease struct {
4748
Resource *resources.DownloadResource
4849
Version *semver.Version
4950
BoardsManifest []*BoardManifest
50-
Dependencies ToolDependencies // The Dependency entries to load tools.
51+
ToolDependencies ToolDependencies
52+
DiscoveryDependencies DiscoveryDependencies
5153
Help PlatformReleaseHelp `json:"-"`
5254
Platform *Platform `json:"-"`
5355
Properties *properties.Map `json:"-"`
@@ -113,6 +115,30 @@ func (dep *ToolDependency) String() string {
113115
return dep.ToolPackager + ":" + dep.ToolName + "@" + dep.ToolVersion.String()
114116
}
115117

118+
// DiscoveryDependencies is a list of DiscoveryDependency
119+
type DiscoveryDependencies []*DiscoveryDependency
120+
121+
// Sort the DiscoveryDependencies by name.
122+
func (d DiscoveryDependencies) Sort() {
123+
sort.Slice(d, func(i, j int) bool {
124+
if d[i].Packager != d[j].Packager {
125+
return d[i].Packager < d[j].Packager
126+
}
127+
return d[i].Name < d[j].Name
128+
})
129+
}
130+
131+
// DiscoveryDependency identifies a specific discovery, version is omitted
132+
// since the latest version will always be used
133+
type DiscoveryDependency struct {
134+
Name string
135+
Packager string
136+
}
137+
138+
func (d *DiscoveryDependency) String() string {
139+
return fmt.Sprintf("%s:%s", d.Packager, d.Name)
140+
}
141+
116142
// GetOrCreateRelease returns the specified release corresponding the provided version,
117143
// or creates a new one if not found.
118144
func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformRelease {
@@ -224,13 +250,21 @@ func (release *PlatformRelease) GetOrCreateBoard(boardID string) *Board {
224250
// RequiresToolRelease returns true if the PlatformRelease requires the
225251
// toolReleased passed as parameter
226252
func (release *PlatformRelease) RequiresToolRelease(toolRelease *ToolRelease) bool {
227-
for _, toolDep := range release.Dependencies {
253+
for _, toolDep := range release.ToolDependencies {
228254
if toolDep.ToolName == toolRelease.Tool.Name &&
229255
toolDep.ToolPackager == toolRelease.Tool.Package.Name &&
230256
toolDep.ToolVersion.Equal(toolRelease.Version) {
231257
return true
232258
}
233259
}
260+
for _, discovery := range release.DiscoveryDependencies {
261+
if discovery.Name == toolRelease.Tool.Name &&
262+
discovery.Packager == toolRelease.Tool.Package.Name &&
263+
// We always want the latest discovery version available
264+
toolRelease.Version.Equal(toolRelease.Tool.LatestRelease().Version) {
265+
return true
266+
}
267+
}
234268
return false
235269
}
236270

arduino/cores/cores_test.go

+38-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestRequiresToolRelease(t *testing.T) {
2828
toolDependencyPackager := "arduino"
2929

3030
release := PlatformRelease{
31-
Dependencies: ToolDependencies{
31+
ToolDependencies: ToolDependencies{
3232
{
3333
ToolName: toolDependencyName,
3434
ToolVersion: semver.ParseRelaxed(toolDependencyVersion),
@@ -55,3 +55,40 @@ func TestRequiresToolRelease(t *testing.T) {
5555
toolRelease.Version = semver.ParseRelaxed(toolDependencyVersion)
5656
require.True(t, release.RequiresToolRelease(toolRelease))
5757
}
58+
59+
func TestRequiresToolReleaseDiscovery(t *testing.T) {
60+
toolDependencyName := "ble-discovery"
61+
toolDependencyPackager := "arduino"
62+
63+
release := PlatformRelease{
64+
DiscoveryDependencies: DiscoveryDependencies{
65+
{
66+
Name: toolDependencyName,
67+
Packager: toolDependencyPackager,
68+
},
69+
},
70+
}
71+
72+
toolRelease := &ToolRelease{
73+
Version: semver.ParseRelaxed("0.1.0"),
74+
Tool: &Tool{
75+
Name: toolDependencyName + "not",
76+
Releases: map[string]*ToolRelease{
77+
"1.0.0": {Version: semver.ParseRelaxed("1.0.0")},
78+
"0.1.0": {Version: semver.ParseRelaxed("0.1.0")},
79+
"0.0.1": {Version: semver.ParseRelaxed("0.0.1")},
80+
},
81+
Package: &Package{
82+
Name: toolDependencyPackager + "not",
83+
},
84+
},
85+
}
86+
87+
require.False(t, release.RequiresToolRelease(toolRelease))
88+
toolRelease.Tool.Name = toolDependencyName
89+
require.False(t, release.RequiresToolRelease(toolRelease))
90+
toolRelease.Tool.Package.Name = toolDependencyPackager
91+
require.False(t, release.RequiresToolRelease(toolRelease))
92+
toolRelease.Version = semver.ParseRelaxed("1.0.0")
93+
require.True(t, release.RequiresToolRelease(toolRelease))
94+
}

arduino/cores/packageindex/index.go

+62-38
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,19 @@ type indexPackage struct {
4747

4848
// indexPlatformRelease represents a single Core Platform from package_index.json file.
4949
type indexPlatformRelease struct {
50-
Name string `json:"name,required"`
51-
Architecture string `json:"architecture"`
52-
Version *semver.Version `json:"version,required"`
53-
Deprecated bool `json:"deprecated"`
54-
Category string `json:"category"`
55-
URL string `json:"url"`
56-
ArchiveFileName string `json:"archiveFileName,required"`
57-
Checksum string `json:"checksum,required"`
58-
Size json.Number `json:"size,required"`
59-
Boards []indexBoard `json:"boards"`
60-
Help indexHelp `json:"help,omitempty"`
61-
ToolDependencies []indexToolDependency `json:"toolsDependencies,required"`
50+
Name string `json:"name,required"`
51+
Architecture string `json:"architecture"`
52+
Version *semver.Version `json:"version,required"`
53+
Deprecated bool `json:"deprecated"`
54+
Category string `json:"category"`
55+
URL string `json:"url"`
56+
ArchiveFileName string `json:"archiveFileName,required"`
57+
Checksum string `json:"checksum,required"`
58+
Size json.Number `json:"size,required"`
59+
Boards []indexBoard `json:"boards"`
60+
Help indexHelp `json:"help,omitempty"`
61+
ToolDependencies []indexToolDependency `json:"toolsDependencies"`
62+
DiscoveryDependencies []indexDiscoveryDependency `json:"discoveryDependencies"`
6263
}
6364

6465
// indexToolDependency represents a single dependency of a core from a tool.
@@ -68,6 +69,12 @@ type indexToolDependency struct {
6869
Version *semver.RelaxedVersion `json:"version,required"`
6970
}
7071

72+
// indexDiscoveryDependency represents a single dependency of a core from a pluggable discovery tool.
73+
type indexDiscoveryDependency struct {
74+
Packager string `json:"packager"`
75+
Name string `json:"name"`
76+
}
77+
7178
// indexToolRelease represents a single Tool from package_index.json file.
7279
type indexToolRelease struct {
7380
Name string `json:"name,required"`
@@ -126,14 +133,22 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
126133
}
127134

128135
tools := []indexToolDependency{}
129-
for _, t := range pr.Dependencies {
136+
for _, t := range pr.ToolDependencies {
130137
tools = append(tools, indexToolDependency{
131138
Packager: t.ToolPackager,
132139
Name: t.ToolName,
133140
Version: t.ToolVersion,
134141
})
135142
}
136143

144+
discoveries := []indexDiscoveryDependency{}
145+
for _, d := range pr.DiscoveryDependencies {
146+
discoveries = append(discoveries, indexDiscoveryDependency{
147+
Packager: d.Packager,
148+
Name: d.Name,
149+
})
150+
}
151+
137152
packageTools := []*indexToolRelease{}
138153
for name, tool := range pr.Platform.Package.Tools {
139154
for _, toolRelease := range tool.Releases {
@@ -165,18 +180,19 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
165180
URL: pr.Platform.Package.URL,
166181
Email: pr.Platform.Package.Email,
167182
Platforms: []*indexPlatformRelease{{
168-
Name: pr.Platform.Name,
169-
Architecture: pr.Platform.Architecture,
170-
Version: pr.Version,
171-
Deprecated: pr.Platform.Deprecated,
172-
Category: pr.Platform.Category,
173-
URL: pr.Resource.URL,
174-
ArchiveFileName: pr.Resource.ArchiveFileName,
175-
Checksum: pr.Resource.Checksum,
176-
Size: json.Number(fmt.Sprintf("%d", pr.Resource.Size)),
177-
Boards: boards,
178-
Help: indexHelp{Online: pr.Help.Online},
179-
ToolDependencies: tools,
183+
Name: pr.Platform.Name,
184+
Architecture: pr.Platform.Architecture,
185+
Version: pr.Version,
186+
Deprecated: pr.Platform.Deprecated,
187+
Category: pr.Platform.Category,
188+
URL: pr.Resource.URL,
189+
ArchiveFileName: pr.Resource.ArchiveFileName,
190+
Checksum: pr.Resource.Checksum,
191+
Size: json.Number(fmt.Sprintf("%d", pr.Resource.Size)),
192+
Boards: boards,
193+
Help: indexHelp{Online: pr.Help.Online},
194+
ToolDependencies: tools,
195+
DiscoveryDependencies: discoveries,
180196
}},
181197
Tools: packageTools,
182198
Help: indexHelp{Online: pr.Platform.Package.Help.Online},
@@ -230,24 +246,32 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core
230246
}
231247
outPlatformRelease.Help = cores.PlatformReleaseHelp{Online: inPlatformRelease.Help.Online}
232248
outPlatformRelease.BoardsManifest = inPlatformRelease.extractBoardsManifest()
233-
if deps, err := inPlatformRelease.extractDeps(); err == nil {
234-
outPlatformRelease.Dependencies = deps
235-
} else {
236-
return fmt.Errorf("invalid tool dependencies: %s", err)
237-
}
249+
outPlatformRelease.ToolDependencies = inPlatformRelease.extractToolDependencies()
250+
outPlatformRelease.DiscoveryDependencies = inPlatformRelease.extractDiscoveryDependencies()
238251
return nil
239252
}
240253

241-
func (inPlatformRelease indexPlatformRelease) extractDeps() (cores.ToolDependencies, error) {
242-
ret := make(cores.ToolDependencies, len(inPlatformRelease.ToolDependencies))
243-
for i, dep := range inPlatformRelease.ToolDependencies {
244-
ret[i] = &cores.ToolDependency{
245-
ToolName: dep.Name,
246-
ToolVersion: dep.Version,
247-
ToolPackager: dep.Packager,
254+
func (inPlatformRelease indexPlatformRelease) extractToolDependencies() cores.ToolDependencies {
255+
res := make(cores.ToolDependencies, len(inPlatformRelease.ToolDependencies))
256+
for i, tool := range inPlatformRelease.ToolDependencies {
257+
res[i] = &cores.ToolDependency{
258+
ToolName: tool.Name,
259+
ToolVersion: tool.Version,
260+
ToolPackager: tool.Packager,
261+
}
262+
}
263+
return res
264+
}
265+
266+
func (inPlatformRelease indexPlatformRelease) extractDiscoveryDependencies() cores.DiscoveryDependencies {
267+
res := make(cores.DiscoveryDependencies, len(inPlatformRelease.DiscoveryDependencies))
268+
for i, discovery := range inPlatformRelease.DiscoveryDependencies {
269+
res[i] = &cores.DiscoveryDependency{
270+
Name: discovery.Name,
271+
Packager: discovery.Packager,
248272
}
249273
}
250-
return ret, nil
274+
return res
251275
}
252276

253277
func (inPlatformRelease indexPlatformRelease) extractBoardsManifest() []*cores.BoardManifest {

0 commit comments

Comments
 (0)