Skip to content

Commit be841ff

Browse files
authored
Some bugfix in profile parsing / Better support for platforms having tools dependencies on other platforms. (#2942)
* Do not output empty 'libraries:' field if not needed in sketch.yaml * Slightly refactored IndexFromPlatformRelease function This will help to simplify the next commits. * Extract also referenced platform tools in installed.json. If a platform requires tools from another referenced platform, we must extract the relevant data in the `installed.json` file too. * Refactoring unit-test Just moving code, no semantic change. Helps to get the following commit cleaner. * Added unit-test
1 parent fe2d665 commit be841ff

File tree

6 files changed

+414
-330
lines changed

6 files changed

+414
-330
lines changed

internal/arduino/cores/packageindex/index.go

Lines changed: 87 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -151,18 +151,8 @@ func (index Index) MergeIntoPackages(outPackages cores.Packages) {
151151
// which in turn contains a single indexPlatformRelease converted from the one
152152
// passed as argument
153153
func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
154-
boards := []indexBoard{}
155-
for _, manifest := range pr.BoardsManifest {
156-
board := indexBoard{
157-
Name: manifest.Name,
158-
}
159-
for _, id := range manifest.ID {
160-
if id.USB != "" {
161-
board.ID = []indexBoardID{{USB: id.USB}}
162-
}
163-
}
164-
boards = append(boards, board)
165-
}
154+
// While enumerating the dependencies we also build a set of required packages.
155+
requiredPackages := map[string]bool{}
166156

167157
tools := []indexToolDependency{}
168158
for _, t := range pr.ToolDependencies {
@@ -171,6 +161,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
171161
Name: t.ToolName,
172162
Version: t.ToolVersion,
173163
})
164+
requiredPackages[t.ToolPackager] = true
174165
}
175166

176167
discoveries := []indexDiscoveryDependency{}
@@ -179,6 +170,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
179170
Packager: d.Packager,
180171
Name: d.Name,
181172
})
173+
requiredPackages[d.Packager] = true
182174
}
183175

184176
monitors := []indexMonitorDependency{}
@@ -187,58 +179,98 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
187179
Packager: m.Packager,
188180
Name: m.Name,
189181
})
182+
requiredPackages[m.Packager] = true
190183
}
191184

192-
packageTools := []*indexToolRelease{}
193-
for name, tool := range pr.Platform.Package.Tools {
194-
for _, toolRelease := range tool.Releases {
195-
flavours := []indexToolReleaseFlavour{}
196-
for _, flavour := range toolRelease.Flavors {
197-
flavours = append(flavours, indexToolReleaseFlavour{
198-
OS: flavour.OS,
199-
URL: flavour.Resource.URL,
200-
ArchiveFileName: flavour.Resource.ArchiveFileName,
201-
Size: json.Number(fmt.Sprintf("%d", flavour.Resource.Size)),
202-
Checksum: flavour.Resource.Checksum,
185+
// Helper functions: those are needed to build an extract of the package_index.json
186+
// that is compatible with the one used by the CLI.
187+
// The installed.json is a simplified version of the cores.Packages
188+
// and therefore we need to extract the relevant information from the
189+
// cores.PlatformRelease and cores.Package structures.
190+
extractIndexPackage := func(pack *cores.Package) *indexPackage {
191+
packageTools := []*indexToolRelease{}
192+
for name, tool := range pack.Tools {
193+
for _, toolRelease := range tool.Releases {
194+
flavours := []indexToolReleaseFlavour{}
195+
for _, flavour := range toolRelease.Flavors {
196+
flavours = append(flavours, indexToolReleaseFlavour{
197+
OS: flavour.OS,
198+
URL: flavour.Resource.URL,
199+
ArchiveFileName: flavour.Resource.ArchiveFileName,
200+
Size: json.Number(fmt.Sprintf("%d", flavour.Resource.Size)),
201+
Checksum: flavour.Resource.Checksum,
202+
})
203+
}
204+
packageTools = append(packageTools, &indexToolRelease{
205+
Name: name,
206+
Version: toolRelease.Version,
207+
Systems: flavours,
203208
})
204209
}
205-
packageTools = append(packageTools, &indexToolRelease{
206-
Name: name,
207-
Version: toolRelease.Version,
208-
Systems: flavours,
209-
})
210+
}
211+
return &indexPackage{
212+
Name: pack.Name,
213+
Maintainer: pack.Maintainer,
214+
WebsiteURL: pack.WebsiteURL,
215+
URL: pack.URL,
216+
Email: pack.Email,
217+
Platforms: nil,
218+
Tools: packageTools,
219+
Help: indexHelp{Online: pack.Help.Online},
220+
}
221+
}
222+
extractIndexPlatformRelease := func(pr *cores.PlatformRelease) *indexPlatformRelease {
223+
boards := []indexBoard{}
224+
for _, manifest := range pr.BoardsManifest {
225+
board := indexBoard{
226+
Name: manifest.Name,
227+
}
228+
for _, id := range manifest.ID {
229+
if id.USB != "" {
230+
board.ID = []indexBoardID{{USB: id.USB}}
231+
}
232+
}
233+
boards = append(boards, board)
234+
}
235+
236+
return &indexPlatformRelease{
237+
Name: pr.Name,
238+
Architecture: pr.Platform.Architecture,
239+
Version: pr.Version,
240+
Deprecated: pr.Deprecated,
241+
Category: pr.Category,
242+
URL: pr.Resource.URL,
243+
ArchiveFileName: pr.Resource.ArchiveFileName,
244+
Checksum: pr.Resource.Checksum,
245+
Size: json.Number(fmt.Sprintf("%d", pr.Resource.Size)),
246+
Help: indexHelp{Online: pr.Help.Online},
247+
Boards: boards,
248+
ToolDependencies: nil,
249+
DiscoveryDependencies: nil,
250+
MonitorDependencies: nil,
251+
}
252+
}
253+
254+
mainPlatform := extractIndexPlatformRelease(pr)
255+
mainPlatform.ToolDependencies = tools
256+
mainPlatform.DiscoveryDependencies = discoveries
257+
mainPlatform.MonitorDependencies = monitors
258+
delete(requiredPackages, pr.Platform.Package.Name)
259+
260+
mainPackage := extractIndexPackage(pr.Platform.Package)
261+
mainPackage.Platforms = []*indexPlatformRelease{mainPlatform}
262+
263+
packages := []*indexPackage{mainPackage}
264+
for requiredPackageName := range requiredPackages {
265+
requiredPackage, ok := pr.Platform.Package.Packages.GetPackage(requiredPackageName)
266+
if ok {
267+
packages = append(packages, extractIndexPackage(requiredPackage))
210268
}
211269
}
212270

213271
return Index{
214272
IsTrusted: pr.IsTrusted,
215-
Packages: []*indexPackage{
216-
{
217-
Name: pr.Platform.Package.Name,
218-
Maintainer: pr.Platform.Package.Maintainer,
219-
WebsiteURL: pr.Platform.Package.WebsiteURL,
220-
URL: pr.Platform.Package.URL,
221-
Email: pr.Platform.Package.Email,
222-
Platforms: []*indexPlatformRelease{{
223-
Name: pr.Name,
224-
Architecture: pr.Platform.Architecture,
225-
Version: pr.Version,
226-
Deprecated: pr.Deprecated,
227-
Category: pr.Category,
228-
URL: pr.Resource.URL,
229-
ArchiveFileName: pr.Resource.ArchiveFileName,
230-
Checksum: pr.Resource.Checksum,
231-
Size: json.Number(fmt.Sprintf("%d", pr.Resource.Size)),
232-
Boards: boards,
233-
Help: indexHelp{Online: pr.Help.Online},
234-
ToolDependencies: tools,
235-
DiscoveryDependencies: discoveries,
236-
MonitorDependencies: monitors,
237-
}},
238-
Tools: packageTools,
239-
Help: indexHelp{Online: pr.Platform.Package.Help.Online},
240-
},
241-
},
273+
Packages: packages,
242274
}
243275
}
244276

0 commit comments

Comments
 (0)