@@ -19,6 +19,7 @@ import (
1919 "encoding/json"
2020 "errors"
2121 "fmt"
22+ "slices"
2223
2324 "github.com/arduino/arduino-cli/internal/arduino/cores"
2425 "github.com/arduino/arduino-cli/internal/arduino/resources"
@@ -348,15 +349,18 @@ func (inToolRelease indexToolRelease) extractToolIn(outPackage *cores.Package) {
348349 outTool := outPackage .GetOrCreateTool (inToolRelease .Name )
349350
350351 outToolRelease := outTool .GetOrCreateRelease (inToolRelease .Version )
351- outToolRelease .Flavors = inToolRelease .extractFlavours ( )
352+ outToolRelease .Flavors = inToolRelease .extractAndMergeFlavours ( outToolRelease . Flavors )
352353}
353354
354- // extractFlavours extracts a map[OS]Flavor object from an indexToolRelease entry.
355- func (inToolRelease indexToolRelease ) extractFlavours () []* cores.Flavor {
356- ret := make ([]* cores.Flavor , len (inToolRelease .Systems ))
357- for i , flavour := range inToolRelease .Systems {
355+ // extractAndMergeFlavours extracts flavors objects from an indexToolRelease
356+ // and adds them to the given flavors array if missing. It returns the updated array.
357+ func (inToolRelease indexToolRelease ) extractAndMergeFlavours (in []* cores.Flavor ) []* cores.Flavor {
358+ for _ , flavour := range inToolRelease .Systems {
359+ if slices .ContainsFunc (in , func (f * cores.Flavor ) bool { return f .OS == flavour .OS }) {
360+ continue
361+ }
358362 size , _ := flavour .Size .Int64 ()
359- ret [ i ] = & cores.Flavor {
363+ in = append ( in , & cores.Flavor {
360364 OS : flavour .OS ,
361365 Resource : & resources.DownloadResource {
362366 ArchiveFileName : flavour .ArchiveFileName ,
@@ -365,9 +369,9 @@ func (inToolRelease indexToolRelease) extractFlavours() []*cores.Flavor {
365369 URL : flavour .URL ,
366370 CachePath : "packages" ,
367371 },
368- }
372+ })
369373 }
370- return ret
374+ return in
371375}
372376
373377// LoadIndex reads a package_index.json from a file and returns the corresponding Index structure.
0 commit comments