From db1e1f9b38e130260b0050b0ee3004897cb9a94b Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 27 Jun 2025 14:17:40 +0200 Subject: [PATCH 1/5] Do not output empty 'libraries:' field if not needed in sketch.yaml --- internal/arduino/sketch/profiles.go | 3 +++ internal/arduino/sketch/profiles_test.go | 3 --- .../arduino/sketch/testdata/SketchWithProfiles/sketch.yml | 6 ++++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/internal/arduino/sketch/profiles.go b/internal/arduino/sketch/profiles.go index cd32ccdf681..2783270ab65 100644 --- a/internal/arduino/sketch/profiles.go +++ b/internal/arduino/sketch/profiles.go @@ -187,6 +187,9 @@ type ProfileRequiredLibraries []*ProfileLibraryReference // AsYaml outputs the required libraries as Yaml func (p *ProfileRequiredLibraries) AsYaml() string { + if len(*p) == 0 { + return "" + } res := " libraries:\n" for _, lib := range *p { res += lib.AsYaml() diff --git a/internal/arduino/sketch/profiles_test.go b/internal/arduino/sketch/profiles_test.go index e2595ed06f9..5be45603914 100644 --- a/internal/arduino/sketch/profiles_test.go +++ b/internal/arduino/sketch/profiles_test.go @@ -16,7 +16,6 @@ package sketch import ( - "fmt" "testing" "github.com/arduino/go-paths-helper" @@ -28,7 +27,6 @@ func TestProjectFileLoading(t *testing.T) { sketchProj := paths.New("testdata", "SketchWithProfiles", "sketch.yml") proj, err := LoadProjectFile(sketchProj) require.NoError(t, err) - fmt.Println(proj) golden, err := sketchProj.ReadFile() require.NoError(t, err) require.Equal(t, proj.AsYaml(), string(golden)) @@ -37,7 +35,6 @@ func TestProjectFileLoading(t *testing.T) { sketchProj := paths.New("testdata", "SketchWithDefaultFQBNAndPort", "sketch.yml") proj, err := LoadProjectFile(sketchProj) require.NoError(t, err) - fmt.Println(proj) golden, err := sketchProj.ReadFile() require.NoError(t, err) require.Equal(t, proj.AsYaml(), string(golden)) diff --git a/internal/arduino/sketch/testdata/SketchWithProfiles/sketch.yml b/internal/arduino/sketch/testdata/SketchWithProfiles/sketch.yml index 868d8eb5116..d4e7f525b84 100644 --- a/internal/arduino/sketch/testdata/SketchWithProfiles/sketch.yml +++ b/internal/arduino/sketch/testdata/SketchWithProfiles/sketch.yml @@ -9,6 +9,12 @@ profiles: - Arduino_ConnectionHandler (0.6.4) - TinyDHT sensor library (1.1.0) + nanorp_nolib: + fqbn: arduino:mbed_nano:nanorp2040connect + programmer: p1 + platforms: + - platform: arduino:mbed_nano (2.1.0) + another_profile_name: notes: testing the limit of the AVR platform, may be unstable fqbn: arduino:avr:uno From 4ef9bbe1d049d96f6d5b464eb9ec32b2266fffcf Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 28 Jun 2025 00:05:48 +0200 Subject: [PATCH 2/5] Slightly refactored IndexFromPlatformRelease function This will help to simplify the next commits. --- internal/arduino/cores/packageindex/index.go | 129 +++++++++++-------- 1 file changed, 73 insertions(+), 56 deletions(-) diff --git a/internal/arduino/cores/packageindex/index.go b/internal/arduino/cores/packageindex/index.go index c2c601c500b..9545046af22 100644 --- a/internal/arduino/cores/packageindex/index.go +++ b/internal/arduino/cores/packageindex/index.go @@ -151,19 +151,6 @@ func (index Index) MergeIntoPackages(outPackages cores.Packages) { // which in turn contains a single indexPlatformRelease converted from the one // passed as argument func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index { - boards := []indexBoard{} - for _, manifest := range pr.BoardsManifest { - board := indexBoard{ - Name: manifest.Name, - } - for _, id := range manifest.ID { - if id.USB != "" { - board.ID = []indexBoardID{{USB: id.USB}} - } - } - boards = append(boards, board) - } - tools := []indexToolDependency{} for _, t := range pr.ToolDependencies { tools = append(tools, indexToolDependency{ @@ -189,56 +176,86 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index { }) } - packageTools := []*indexToolRelease{} - for name, tool := range pr.Platform.Package.Tools { - for _, toolRelease := range tool.Releases { - flavours := []indexToolReleaseFlavour{} - for _, flavour := range toolRelease.Flavors { - flavours = append(flavours, indexToolReleaseFlavour{ - OS: flavour.OS, - URL: flavour.Resource.URL, - ArchiveFileName: flavour.Resource.ArchiveFileName, - Size: json.Number(fmt.Sprintf("%d", flavour.Resource.Size)), - Checksum: flavour.Resource.Checksum, + // Helper functions: those are needed to build an extract of the package_index.json + // that is compatible with the one used by the CLI. + // The installed.json is a simplified version of the cores.Packages + // and therefore we need to extract the relevant information from the + // cores.PlatformRelease and cores.Package structures. + extractIndexPackage := func(pack *cores.Package) *indexPackage { + packageTools := []*indexToolRelease{} + for name, tool := range pack.Tools { + for _, toolRelease := range tool.Releases { + flavours := []indexToolReleaseFlavour{} + for _, flavour := range toolRelease.Flavors { + flavours = append(flavours, indexToolReleaseFlavour{ + OS: flavour.OS, + URL: flavour.Resource.URL, + ArchiveFileName: flavour.Resource.ArchiveFileName, + Size: json.Number(fmt.Sprintf("%d", flavour.Resource.Size)), + Checksum: flavour.Resource.Checksum, + }) + } + packageTools = append(packageTools, &indexToolRelease{ + Name: name, + Version: toolRelease.Version, + Systems: flavours, }) } - packageTools = append(packageTools, &indexToolRelease{ - Name: name, - Version: toolRelease.Version, - Systems: flavours, - }) + } + return &indexPackage{ + Name: pack.Name, + Maintainer: pack.Maintainer, + WebsiteURL: pack.WebsiteURL, + URL: pack.URL, + Email: pack.Email, + Platforms: nil, + Tools: packageTools, + Help: indexHelp{Online: pack.Help.Online}, + } + } + extractIndexPlatformRelease := func(pr *cores.PlatformRelease) *indexPlatformRelease { + boards := []indexBoard{} + for _, manifest := range pr.BoardsManifest { + board := indexBoard{ + Name: manifest.Name, + } + for _, id := range manifest.ID { + if id.USB != "" { + board.ID = []indexBoardID{{USB: id.USB}} + } + } + boards = append(boards, board) + } + + return &indexPlatformRelease{ + Name: pr.Name, + Architecture: pr.Platform.Architecture, + Version: pr.Version, + Deprecated: pr.Deprecated, + Category: pr.Category, + URL: pr.Resource.URL, + ArchiveFileName: pr.Resource.ArchiveFileName, + Checksum: pr.Resource.Checksum, + Size: json.Number(fmt.Sprintf("%d", pr.Resource.Size)), + Help: indexHelp{Online: pr.Help.Online}, + Boards: boards, + ToolDependencies: nil, + DiscoveryDependencies: nil, + MonitorDependencies: nil, } } + mainPlatform := extractIndexPlatformRelease(pr) + mainPlatform.ToolDependencies = tools + mainPlatform.DiscoveryDependencies = discoveries + mainPlatform.MonitorDependencies = monitors + + mainPackage := extractIndexPackage(pr.Platform.Package) + mainPackage.Platforms = []*indexPlatformRelease{mainPlatform} + return Index{ IsTrusted: pr.IsTrusted, - Packages: []*indexPackage{ - { - Name: pr.Platform.Package.Name, - Maintainer: pr.Platform.Package.Maintainer, - WebsiteURL: pr.Platform.Package.WebsiteURL, - URL: pr.Platform.Package.URL, - Email: pr.Platform.Package.Email, - Platforms: []*indexPlatformRelease{{ - Name: pr.Name, - Architecture: pr.Platform.Architecture, - Version: pr.Version, - Deprecated: pr.Deprecated, - Category: pr.Category, - URL: pr.Resource.URL, - ArchiveFileName: pr.Resource.ArchiveFileName, - Checksum: pr.Resource.Checksum, - Size: json.Number(fmt.Sprintf("%d", pr.Resource.Size)), - Boards: boards, - Help: indexHelp{Online: pr.Help.Online}, - ToolDependencies: tools, - DiscoveryDependencies: discoveries, - MonitorDependencies: monitors, - }}, - Tools: packageTools, - Help: indexHelp{Online: pr.Platform.Package.Help.Online}, - }, - }, + Packages: []*indexPackage{mainPackage}, } } From 10358c0453a1a03cf528bd30b50bca20dc504308 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 30 Jun 2025 10:23:00 +0200 Subject: [PATCH 3/5] 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. --- internal/arduino/cores/packageindex/index.go | 17 ++++++++++++++++- internal/arduino/cores/status.go | 7 +++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/internal/arduino/cores/packageindex/index.go b/internal/arduino/cores/packageindex/index.go index 9545046af22..20522fe32ca 100644 --- a/internal/arduino/cores/packageindex/index.go +++ b/internal/arduino/cores/packageindex/index.go @@ -151,6 +151,9 @@ func (index Index) MergeIntoPackages(outPackages cores.Packages) { // which in turn contains a single indexPlatformRelease converted from the one // passed as argument func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index { + // While enumerating the dependencies we also build a set of required packages. + requiredPackages := map[string]bool{} + tools := []indexToolDependency{} for _, t := range pr.ToolDependencies { tools = append(tools, indexToolDependency{ @@ -158,6 +161,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index { Name: t.ToolName, Version: t.ToolVersion, }) + requiredPackages[t.ToolPackager] = true } discoveries := []indexDiscoveryDependency{} @@ -166,6 +170,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index { Packager: d.Packager, Name: d.Name, }) + requiredPackages[d.Packager] = true } monitors := []indexMonitorDependency{} @@ -174,6 +179,7 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index { Packager: m.Packager, Name: m.Name, }) + requiredPackages[m.Packager] = true } // Helper functions: those are needed to build an extract of the package_index.json @@ -249,13 +255,22 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index { mainPlatform.ToolDependencies = tools mainPlatform.DiscoveryDependencies = discoveries mainPlatform.MonitorDependencies = monitors + delete(requiredPackages, pr.Platform.Package.Name) mainPackage := extractIndexPackage(pr.Platform.Package) mainPackage.Platforms = []*indexPlatformRelease{mainPlatform} + packages := []*indexPackage{mainPackage} + for requiredPackageName := range requiredPackages { + requiredPackage, ok := pr.Platform.Package.Packages.GetPackage(requiredPackageName) + if ok { + packages = append(packages, extractIndexPackage(requiredPackage)) + } + } + return Index{ IsTrusted: pr.IsTrusted, - Packages: []*indexPackage{mainPackage}, + Packages: packages, } } diff --git a/internal/arduino/cores/status.go b/internal/arduino/cores/status.go index 42ed1177e0a..cf6d262c584 100644 --- a/internal/arduino/cores/status.go +++ b/internal/arduino/cores/status.go @@ -50,6 +50,13 @@ type Package struct { Packages Packages `json:"-"` } +// GetPackage returns the specified Package if it exists +// and a boolean indicating whether it was found or not. +func (packages Packages) GetPackage(packager string) (*Package, bool) { + targetPackage, ok := packages[packager] + return targetPackage, ok +} + // GetOrCreatePackage returns the specified Package or creates an empty one // filling all the cross-references func (packages Packages) GetOrCreatePackage(packager string) *Package { From 7e7d49d61244d24258e79a2342f810873688cb04 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 3 Jul 2025 14:37:35 +0200 Subject: [PATCH 4/5] Refactoring unit-test Just moving code, no semantic change. Helps to get the following commit cleaner. --- .../arduino/cores/packageindex/index_test.go | 523 ++++++++---------- 1 file changed, 243 insertions(+), 280 deletions(-) diff --git a/internal/arduino/cores/packageindex/index_test.go b/internal/arduino/cores/packageindex/index_test.go index cdc38022f21..03369b28b79 100644 --- a/internal/arduino/cores/packageindex/index_test.go +++ b/internal/arduino/cores/packageindex/index_test.go @@ -40,271 +40,206 @@ func TestIndexParsing(t *testing.T) { } func TestIndexFromPlatformRelease(t *testing.T) { - pr := &cores.PlatformRelease{ - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/cores/avr-1.6.23.tar.bz2", - ArchiveFileName: "avr-1.6.23.tar.bz2", - Checksum: "SHA-256:18618d7f256f26cd77c35f4c888d5d1b2334f07925094fdc99ac3188722284aa", - Size: 5001988, - }, - Version: semver.MustParse("1.8.3"), - Help: cores.PlatformReleaseHelp{Online: "http://www.arduino.cc/en/Reference/HomePage"}, - BoardsManifest: []*cores.BoardManifest{ - {Name: "Arduino Yún"}, - {Name: "Arduino/Genuino Uno"}, - {Name: "Arduino Uno WiFi"}, - }, - ToolDependencies: cores.ToolDependencies{ - { - ToolPackager: "arduino", - ToolName: "avr-gcc", - ToolVersion: semver.ParseRelaxed("5.4.0-atmel3.6.1-arduino2"), - }, - { - ToolPackager: "arduino", - ToolName: "avrdude", - ToolVersion: semver.ParseRelaxed("6.3.0-arduino14"), - }, - { - ToolPackager: "arduino", - ToolName: "arduinoOTA", - ToolVersion: semver.ParseRelaxed("1.2.1"), - }, - }, - DiscoveryDependencies: cores.DiscoveryDependencies{ - { - Packager: "arduino", - Name: "ble-discovery", - }, - { - Packager: "arduino", - Name: "serial-discovery", + arduinoTools := map[string]*cores.Tool{ + "serial-discovery": { + Name: "serial-discovery", + Releases: map[semver.NormalizedString]*cores.ToolRelease{ + "1.0.0": { + Version: semver.ParseRelaxed("1.0.0"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "some-serial-discovery-1.0.0-url", + ArchiveFileName: "serial-discovery-1.0.0.tar.bz2", + Checksum: "SHA-256:some-serial-discovery-1.0.0-sha", + Size: 201341, + }, + }, + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "some-serial-discovery-1.0.0-other-url", + ArchiveFileName: "serial-discovery-1.0.0.tar.gz", + Checksum: "SHA-256:some-serial-discovery-1.0.0-other-sha", + Size: 222918, + }, + }, + }, + }, + "0.1.0": { + Version: semver.ParseRelaxed("0.1.0"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "some-serial-discovery-0.1.0-url", + ArchiveFileName: "serial-discovery-0.1.0.tar.bz2", + Checksum: "SHA-256:some-serial-discovery-0.1.0-sha", + Size: 201341, + }, + }, + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "some-serial-discovery-0.1.0-other-url", + ArchiveFileName: "serial-discovery-0.1.0.tar.gz", + Checksum: "SHA-256:some-serial-discovery-0.1.0-other-sha", + Size: 222918, + }, + }, + }, + }, }, }, - MonitorDependencies: cores.MonitorDependencies{ - { - Packager: "arduino", - Name: "ble-monitor", - }, - { - Packager: "arduino", - Name: "serial-monitor", + "ble-discovery": { + Name: "ble-discovery", + Releases: map[semver.NormalizedString]*cores.ToolRelease{ + "1.0.0": { + Version: semver.ParseRelaxed("1.0.0"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "some-ble-discovery-1.0.0-url", + ArchiveFileName: "ble-discovery-1.0.0.tar.bz2", + Checksum: "SHA-256:some-ble-discovery-1.0.0-sha", + Size: 201341, + }, + }, + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "some-ble-discovery-1.0.0-other-url", + ArchiveFileName: "ble-discovery-1.0.0.tar.gz", + Checksum: "SHA-256:some-ble-discovery-1.0.0-other-sha", + Size: 222918, + }, + }, + }, + }, + "0.1.0": { + Version: semver.ParseRelaxed("0.1.0"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "some-ble-discovery-0.1.0-url", + ArchiveFileName: "ble-discovery-0.1.0.tar.bz2", + Checksum: "SHA-256:some-ble-discovery-0.1.0-sha", + Size: 201341, + }, + }, + + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "some-ble-discovery-0.1.0-other-url", + ArchiveFileName: "ble-discovery-0.1.0.tar.gz", + Checksum: "SHA-256:some-ble-discovery-0.1.0-other-sha", + Size: 222918, + }, + }, + }, + }, }, }, - Name: "Arduino AVR Boards", - Category: "Arduino", - Platform: &cores.Platform{ - Architecture: "avr", - Package: &cores.Package{ - Name: "arduino", - Maintainer: "Arduino", - WebsiteURL: "https://arduino.cc/", - URL: "", - Email: "packages@arduino.cc", - Help: cores.PackageHelp{Online: "http://www.arduino.cc/en/Reference/HomePage"}, - Tools: map[string]*cores.Tool{ - "serial-discovery": { - Name: "serial-discovery", - Releases: map[semver.NormalizedString]*cores.ToolRelease{ - "1.0.0": { - Version: semver.ParseRelaxed("1.0.0"), - Flavors: []*cores.Flavor{ - { - OS: "arm-linux-gnueabihf", - Resource: &resources.DownloadResource{ - URL: "some-serial-discovery-1.0.0-url", - ArchiveFileName: "serial-discovery-1.0.0.tar.bz2", - Checksum: "SHA-256:some-serial-discovery-1.0.0-sha", - Size: 201341, - }, - }, - { - OS: "i686-mingw32", - Resource: &resources.DownloadResource{ - URL: "some-serial-discovery-1.0.0-other-url", - ArchiveFileName: "serial-discovery-1.0.0.tar.gz", - Checksum: "SHA-256:some-serial-discovery-1.0.0-other-sha", - Size: 222918, - }, - }, - }, + "bossac": { + Name: "bossac", + Releases: map[semver.NormalizedString]*cores.ToolRelease{ + "1.6.1-arduino": { + Version: semver.ParseRelaxed("1.6.1-arduino"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", + ArchiveFileName: "bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", + Checksum: "SHA-256:8c4e63db982178919c824e7a35580dffc95c3426afa7285de3eb583982d4d391", + Size: 201341, }, - "0.1.0": { - Version: semver.ParseRelaxed("0.1.0"), - Flavors: []*cores.Flavor{ - { - OS: "arm-linux-gnueabihf", - Resource: &resources.DownloadResource{ - URL: "some-serial-discovery-0.1.0-url", - ArchiveFileName: "serial-discovery-0.1.0.tar.bz2", - Checksum: "SHA-256:some-serial-discovery-0.1.0-sha", - Size: 201341, - }, - }, - { - OS: "i686-mingw32", - Resource: &resources.DownloadResource{ - URL: "some-serial-discovery-0.1.0-other-url", - ArchiveFileName: "serial-discovery-0.1.0.tar.gz", - Checksum: "SHA-256:some-serial-discovery-0.1.0-other-sha", - Size: 222918, - }, - }, - }, + }, + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/bossac-1.6.1-arduino-mingw32.tar.gz", + ArchiveFileName: "bossac-1.6.1-arduino-mingw32.tar.gz", + Checksum: "SHA-256:d59f43e2e83a337d04c4ae88b195a4ee175b8d87fff4c43144d23412a4a9513b", + Size: 222918, }, }, }, - "ble-discovery": { - Name: "ble-discovery", - Releases: map[semver.NormalizedString]*cores.ToolRelease{ - "1.0.0": { - Version: semver.ParseRelaxed("1.0.0"), - Flavors: []*cores.Flavor{ - { - OS: "arm-linux-gnueabihf", - Resource: &resources.DownloadResource{ - URL: "some-ble-discovery-1.0.0-url", - ArchiveFileName: "ble-discovery-1.0.0.tar.bz2", - Checksum: "SHA-256:some-ble-discovery-1.0.0-sha", - Size: 201341, - }, - }, - { - OS: "i686-mingw32", - Resource: &resources.DownloadResource{ - URL: "some-ble-discovery-1.0.0-other-url", - ArchiveFileName: "ble-discovery-1.0.0.tar.gz", - Checksum: "SHA-256:some-ble-discovery-1.0.0-other-sha", - Size: 222918, - }, - }, - }, + }, + "1.7.0": { + Version: semver.ParseRelaxed("1.7.0"), + Flavors: []*cores.Flavor{ + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/bossac-1.7.0-arduino-mingw32.tar.bz2", + ArchiveFileName: "bossac-1.7.0-arduino-mingw32.tar.bz2", + Checksum: "SHA-256:9ef7d11b4fabca0adc17102a0290957d5cc26ce46b422c3a5344722c80acc7b2", + Size: 243066, }, - "0.1.0": { - Version: semver.ParseRelaxed("0.1.0"), - Flavors: []*cores.Flavor{ - { - OS: "arm-linux-gnueabihf", - Resource: &resources.DownloadResource{ - URL: "some-ble-discovery-0.1.0-url", - ArchiveFileName: "ble-discovery-0.1.0.tar.bz2", - Checksum: "SHA-256:some-ble-discovery-0.1.0-sha", - Size: 201341, - }, - }, - - { - OS: "i686-mingw32", - Resource: &resources.DownloadResource{ - URL: "some-ble-discovery-0.1.0-other-url", - ArchiveFileName: "ble-discovery-0.1.0.tar.gz", - Checksum: "SHA-256:some-ble-discovery-0.1.0-other-sha", - Size: 222918, - }, - }, - }, + }, + { + OS: "x86_64-apple-darwin", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/bossac-1.7.0-arduino-x86_64-apple-darwin.tar.bz2", + ArchiveFileName: "bossac-1.7.0-arduino-x86_64-apple-darwin.tar.bz2", + Checksum: "SHA-256:feac36ab38876c163dcf51bdbcfbed01554eede3d41c59a0e152e170fe5164d2", + Size: 63822, }, }, }, - "bossac": { - Name: "bossac", - Releases: map[semver.NormalizedString]*cores.ToolRelease{ - "1.6.1-arduino": { - Version: semver.ParseRelaxed("1.6.1-arduino"), - Flavors: []*cores.Flavor{ - { - OS: "arm-linux-gnueabihf", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", - ArchiveFileName: "bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", - Checksum: "SHA-256:8c4e63db982178919c824e7a35580dffc95c3426afa7285de3eb583982d4d391", - Size: 201341, - }, - }, - { - OS: "i686-mingw32", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/bossac-1.6.1-arduino-mingw32.tar.gz", - ArchiveFileName: "bossac-1.6.1-arduino-mingw32.tar.gz", - Checksum: "SHA-256:d59f43e2e83a337d04c4ae88b195a4ee175b8d87fff4c43144d23412a4a9513b", - Size: 222918, - }, - }, - }, + }, + }, + }, + "arm-none-eabi-gcc": { + Name: "arm-none-eabi-gcc", + Releases: map[semver.NormalizedString]*cores.ToolRelease{ + "4.8.3-2014q1": { + Version: semver.ParseRelaxed("4.8.3-2014q1"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", + ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", + Checksum: "SHA-256:ebe96b34c4f434667cab0187b881ed585e7c7eb990fe6b69be3c81ec7e11e845", + Size: 44423906, }, - "1.7.0": { - Version: semver.ParseRelaxed("1.7.0"), - Flavors: []*cores.Flavor{ - { - OS: "i686-mingw32", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/bossac-1.7.0-arduino-mingw32.tar.bz2", - ArchiveFileName: "bossac-1.7.0-arduino-mingw32.tar.bz2", - Checksum: "SHA-256:9ef7d11b4fabca0adc17102a0290957d5cc26ce46b422c3a5344722c80acc7b2", - Size: 243066, - }, - }, - { - OS: "x86_64-apple-darwin", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/bossac-1.7.0-arduino-x86_64-apple-darwin.tar.bz2", - ArchiveFileName: "bossac-1.7.0-arduino-x86_64-apple-darwin.tar.bz2", - Checksum: "SHA-256:feac36ab38876c163dcf51bdbcfbed01554eede3d41c59a0e152e170fe5164d2", - Size: 63822, - }, - }, - }, + }, + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", + ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", + Checksum: "SHA-256:fd8c111c861144f932728e00abd3f7d1107e186eb9cd6083a54c7236ea78b7c2", + Size: 84537449, }, }, }, - "arm-none-eabi-gcc": { - Name: "arm-none-eabi-gcc", - Releases: map[semver.NormalizedString]*cores.ToolRelease{ - "4.8.3-2014q1": { - Version: semver.ParseRelaxed("4.8.3-2014q1"), - Flavors: []*cores.Flavor{ - { - OS: "arm-linux-gnueabihf", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - Checksum: "SHA-256:ebe96b34c4f434667cab0187b881ed585e7c7eb990fe6b69be3c81ec7e11e845", - Size: 44423906, - }, - }, - { - OS: "i686-mingw32", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", - ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", - Checksum: "SHA-256:fd8c111c861144f932728e00abd3f7d1107e186eb9cd6083a54c7236ea78b7c2", - Size: 84537449, - }, - }, - }, + }, + "7-2017q4": { + Version: semver.ParseRelaxed("7-2017q4"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", + ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", + Checksum: "SHA-256:ebe96b34c4f434667cab0187b881ed585e7c7eb990fe6b69be3c81ec7e11e845", + Size: 44423906, }, - "7-2017q4": { - Version: semver.ParseRelaxed("7-2017q4"), - Flavors: []*cores.Flavor{ - { - OS: "arm-linux-gnueabihf", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - Checksum: "SHA-256:ebe96b34c4f434667cab0187b881ed585e7c7eb990fe6b69be3c81ec7e11e845", - Size: 44423906, - }, - }, - { - OS: "aarch64-linux-gnu", - Resource: &resources.DownloadResource{ - URL: "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-7-2018-q2-update-linuxarm64.tar.bz2", - ArchiveFileName: "gcc-arm-none-eabi-7-2018-q2-update-linuxarm64.tar.bz2", - Checksum: "SHA-256:6fb5752fb4d11012bd0a1ceb93a19d0641ff7cf29d289b3e6b86b99768e66f76", - Size: 99558726, - }, - }, - }, + }, + { + OS: "aarch64-linux-gnu", + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-7-2018-q2-update-linuxarm64.tar.bz2", + ArchiveFileName: "gcc-arm-none-eabi-7-2018-q2-update-linuxarm64.tar.bz2", + Checksum: "SHA-256:6fb5752fb4d11012bd0a1ceb93a19d0641ff7cf29d289b3e6b86b99768e66f76", + Size: 99558726, }, }, }, @@ -313,6 +248,58 @@ func TestIndexFromPlatformRelease(t *testing.T) { }, } + avrPlatformRelease := &cores.PlatformRelease{ + Resource: &resources.DownloadResource{ + URL: "http://downloads.arduino.cc/cores/avr-1.6.23.tar.bz2", + ArchiveFileName: "avr-1.6.23.tar.bz2", + Checksum: "SHA-256:18618d7f256f26cd77c35f4c888d5d1b2334f07925094fdc99ac3188722284aa", + Size: 5001988, + }, + Version: semver.MustParse("1.8.3"), + Help: cores.PlatformReleaseHelp{Online: "http://www.arduino.cc/en/Reference/HomePage"}, + BoardsManifest: []*cores.BoardManifest{ + {Name: "Arduino Yún"}, + {Name: "Arduino/Genuino Uno"}, + {Name: "Arduino Uno WiFi"}, + }, + ToolDependencies: cores.ToolDependencies{ + {ToolPackager: "arduino", ToolName: "avr-gcc", ToolVersion: semver.ParseRelaxed("5.4.0-atmel3.6.1-arduino2")}, + {ToolPackager: "arduino", ToolName: "avrdude", ToolVersion: semver.ParseRelaxed("6.3.0-arduino14")}, + {ToolPackager: "arduino", ToolName: "arduinoOTA", ToolVersion: semver.ParseRelaxed("1.2.1")}, + }, + DiscoveryDependencies: cores.DiscoveryDependencies{ + {Packager: "arduino", Name: "ble-discovery"}, + {Packager: "arduino", Name: "serial-discovery"}, + }, + MonitorDependencies: cores.MonitorDependencies{ + {Packager: "arduino", Name: "ble-monitor"}, + {Packager: "arduino", Name: "serial-monitor"}, + }, + Name: "Arduino AVR Boards", + Category: "Arduino", + } + avrPlatform := &cores.Platform{ + Architecture: "avr", + Releases: map[semver.NormalizedString]*cores.PlatformRelease{ + avrPlatformRelease.Version.NormalizedString(): avrPlatformRelease, + }, + } + avrPlatformRelease.Platform = avrPlatform + + arduinoPackage := &cores.Package{ + Name: "arduino", + Maintainer: "Arduino", + WebsiteURL: "https://arduino.cc/", + URL: "", + Email: "packages@arduino.cc", + Help: cores.PackageHelp{Online: "http://www.arduino.cc/en/Reference/HomePage"}, + Tools: arduinoTools, + Platforms: map[string]*cores.Platform{ + "avr": avrPlatform, + }, + } + avrPlatform.Package = arduinoPackage + expectedIndex := Index{ IsTrusted: false, Packages: []*indexPackage{{ @@ -338,41 +325,17 @@ func TestIndexFromPlatformRelease(t *testing.T) { }, Help: indexHelp{Online: "http://www.arduino.cc/en/Reference/HomePage"}, ToolDependencies: []indexToolDependency{ - { - Packager: "arduino", - Name: "avr-gcc", - Version: semver.ParseRelaxed("5.4.0-atmel3.6.1-arduino2"), - }, - { - Packager: "arduino", - Name: "avrdude", - Version: semver.ParseRelaxed("6.3.0-arduino14"), - }, - { - Packager: "arduino", - Name: "arduinoOTA", - Version: semver.ParseRelaxed("1.2.1"), - }, + {Packager: "arduino", Name: "avr-gcc", Version: semver.ParseRelaxed("5.4.0-atmel3.6.1-arduino2")}, + {Packager: "arduino", Name: "avrdude", Version: semver.ParseRelaxed("6.3.0-arduino14")}, + {Packager: "arduino", Name: "arduinoOTA", Version: semver.ParseRelaxed("1.2.1")}, }, DiscoveryDependencies: []indexDiscoveryDependency{ - { - Packager: "arduino", - Name: "ble-discovery", - }, - { - Packager: "arduino", - Name: "serial-discovery", - }, + {Packager: "arduino", Name: "ble-discovery"}, + {Packager: "arduino", Name: "serial-discovery"}, }, MonitorDependencies: []indexMonitorDependency{ - { - Packager: "arduino", - Name: "ble-monitor", - }, - { - Packager: "arduino", - Name: "serial-monitor", - }, + {Packager: "arduino", Name: "ble-monitor"}, + {Packager: "arduino", Name: "serial-monitor"}, }, }}, Tools: []*indexToolRelease{ @@ -540,7 +503,7 @@ func TestIndexFromPlatformRelease(t *testing.T) { }}, } - in := IndexFromPlatformRelease(pr) + in := IndexFromPlatformRelease(avrPlatformRelease) require.Equal(t, expectedIndex.IsTrusted, in.IsTrusted) require.Equal(t, len(expectedIndex.Packages), len(in.Packages)) From 5e15ea327efca296715106619a353825e56dbc1b Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 3 Jul 2025 14:49:29 +0200 Subject: [PATCH 5/5] Added unit-test --- .../arduino/cores/packageindex/index_test.go | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/internal/arduino/cores/packageindex/index_test.go b/internal/arduino/cores/packageindex/index_test.go index 03369b28b79..ccd7ba89898 100644 --- a/internal/arduino/cores/packageindex/index_test.go +++ b/internal/arduino/cores/packageindex/index_test.go @@ -270,6 +270,7 @@ func TestIndexFromPlatformRelease(t *testing.T) { DiscoveryDependencies: cores.DiscoveryDependencies{ {Packager: "arduino", Name: "ble-discovery"}, {Packager: "arduino", Name: "serial-discovery"}, + {Packager: "dev", Name: "dev-discovery"}, }, MonitorDependencies: cores.MonitorDependencies{ {Packager: "arduino", Name: "ble-monitor"}, @@ -300,6 +301,51 @@ func TestIndexFromPlatformRelease(t *testing.T) { } avrPlatform.Package = arduinoPackage + dependentPackage := &cores.Package{ + Name: "dev", + Maintainer: "Arduino Dev", + WebsiteURL: "https://arduino.cc/", + URL: "", + Email: "packages@arduino.cc", + Help: cores.PackageHelp{Online: "http://www.arduino.cc/en/Reference/HomePage"}, + Tools: map[string]*cores.Tool{ + "dev-discovery": { + Name: "dev-discovery", + Releases: map[semver.NormalizedString]*cores.ToolRelease{ + "1.0.0": { + Version: semver.ParseRelaxed("1.0.0"), + Flavors: []*cores.Flavor{ + { + OS: "arm-linux-gnueabihf", + Resource: &resources.DownloadResource{ + URL: "dev-discovery-1.0.0-url", + ArchiveFileName: "dev-discovery-1.0.0.tar.bz2", + Checksum: "SHA-256:dev-discovery-1.0.0-sha", + Size: 201341, + }, + }, + { + OS: "i686-mingw32", + Resource: &resources.DownloadResource{ + URL: "dev-discovery-1.0.0-other-url", + ArchiveFileName: "dev-discovery-1.0.0.tar.gz", + Checksum: "SHA-256:dev-discovery-1.0.0-other-sha", + Size: 222918, + }, + }, + }, + }, + }, + }, + }, + } + + packages := cores.NewPackages() + packages[arduinoPackage.Name] = arduinoPackage + arduinoPackage.Packages = packages + packages[dependentPackage.Name] = dependentPackage + dependentPackage.Packages = packages + expectedIndex := Index{ IsTrusted: false, Packages: []*indexPackage{{ @@ -332,6 +378,7 @@ func TestIndexFromPlatformRelease(t *testing.T) { DiscoveryDependencies: []indexDiscoveryDependency{ {Packager: "arduino", Name: "ble-discovery"}, {Packager: "arduino", Name: "serial-discovery"}, + {Packager: "dev", Name: "dev-discovery"}, }, MonitorDependencies: []indexMonitorDependency{ {Packager: "arduino", Name: "ble-monitor"}, @@ -500,6 +547,35 @@ func TestIndexFromPlatformRelease(t *testing.T) { }, }, }, + }, { + Name: "dev", + Maintainer: "Arduino Dev", + WebsiteURL: "https://arduino.cc/", + URL: "", + Email: "packages@arduino.cc", + Help: indexHelp{Online: "http://www.arduino.cc/en/Reference/HomePage"}, + Tools: []*indexToolRelease{ + { + Name: "dev-discovery", + Version: semver.ParseRelaxed("1.0.0"), + Systems: []indexToolReleaseFlavour{ + { + OS: "arm-linux-gnueabihf", + URL: "dev-discovery-1.0.0-url", + ArchiveFileName: "dev-discovery-1.0.0.tar.bz2", + Checksum: "SHA-256:dev-discovery-1.0.0-sha", + Size: "201341", + }, + { + OS: "i686-mingw32", + URL: "dev-discovery-1.0.0-other-url", + ArchiveFileName: "dev-discovery-1.0.0.tar.gz", + Checksum: "SHA-256:dev-discovery-1.0.0-other-sha", + Size: "222918", + }, + }, + }, + }, }}, }