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