@@ -151,18 +151,8 @@ func (index Index) MergeIntoPackages(outPackages cores.Packages) {
151
151
// which in turn contains a single indexPlatformRelease converted from the one
152
152
// passed as argument
153
153
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 {}
166
156
167
157
tools := []indexToolDependency {}
168
158
for _ , t := range pr .ToolDependencies {
@@ -171,6 +161,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
171
161
Name : t .ToolName ,
172
162
Version : t .ToolVersion ,
173
163
})
164
+ requiredPackages [t .ToolPackager ] = true
174
165
}
175
166
176
167
discoveries := []indexDiscoveryDependency {}
@@ -179,6 +170,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
179
170
Packager : d .Packager ,
180
171
Name : d .Name ,
181
172
})
173
+ requiredPackages [d .Packager ] = true
182
174
}
183
175
184
176
monitors := []indexMonitorDependency {}
@@ -187,58 +179,98 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
187
179
Packager : m .Packager ,
188
180
Name : m .Name ,
189
181
})
182
+ requiredPackages [m .Packager ] = true
190
183
}
191
184
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 ,
203
208
})
204
209
}
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 ))
210
268
}
211
269
}
212
270
213
271
return Index {
214
272
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 ,
242
274
}
243
275
}
244
276
0 commit comments