Skip to content

Commit be841ff

Browse files
authored
Some bugfix in profile parsing / Better support for platforms having tools dependencies on other platforms. (arduino#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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy