@@ -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
153153func 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