From 646a20750c7960b93bdfaa81eb5c16ffc288c5c7 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 14 Mar 2023 17:09:59 +0100 Subject: [PATCH 1/4] Added test --- internal/integrationtest/lib/lib_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internal/integrationtest/lib/lib_test.go b/internal/integrationtest/lib/lib_test.go index f1e14eac9c2..4f05030dd47 100644 --- a/internal/integrationtest/lib/lib_test.go +++ b/internal/integrationtest/lib/lib_test.go @@ -541,6 +541,18 @@ func TestInstall(t *testing.T) { _, stderr, err := cli.Run("lib", "install", "MD_Parola@3.2.0") require.Error(t, err) require.Contains(t, string(stderr), "No valid dependencies solution found: dependency 'MD_MAX72xx' is not available") + + // Test installing a library with a "relaxed" version + // https://github.com/arduino/arduino-cli/issues/1727 + _, _, err = cli.Run("lib", "install", "ILI9341_t3@1.0") + require.NoError(t, err) + stdout, _, err := cli.Run("lib", "list", "--format", "json") + require.NoError(t, err) + requirejson.Parse(t, stdout).Query(`.[] | select(.library.name == "ILI9341_t3") | .library.version`).MustEqual(`"1.0"`) + _, _, err = cli.Run("lib", "install", "ILI9341_t3@1") + require.NoError(t, err) + _, _, err = cli.Run("lib", "install", "ILI9341_t3@1.0.0") + require.NoError(t, err) } func TestInstallLibraryWithDependencies(t *testing.T) { From 409ed54bf370cfa0d76a44dbac9ef821d7978b61 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 14 Mar 2023 17:04:13 +0100 Subject: [PATCH 2/4] Use normalized version as keys for matching versions in maps --- .licenses/go/go.bug.st/relaxed-semver.dep.yml | 2 +- arduino/libraries/librariesindex/index.go | 15 ++++++--------- arduino/libraries/librariesindex/json.go | 4 ++-- commands/lib/search.go | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- 6 files changed, 14 insertions(+), 17 deletions(-) diff --git a/.licenses/go/go.bug.st/relaxed-semver.dep.yml b/.licenses/go/go.bug.st/relaxed-semver.dep.yml index bc044af9547..7815713bdad 100644 --- a/.licenses/go/go.bug.st/relaxed-semver.dep.yml +++ b/.licenses/go/go.bug.st/relaxed-semver.dep.yml @@ -1,6 +1,6 @@ --- name: go.bug.st/relaxed-semver -version: v0.9.0 +version: v0.9.1-0.20230314182316-c6633824f06f type: go summary: homepage: https://pkg.go.dev/go.bug.st/relaxed-semver diff --git a/arduino/libraries/librariesindex/index.go b/arduino/libraries/librariesindex/index.go index 01c5c20d10b..f7ebc6ba172 100644 --- a/arduino/libraries/librariesindex/index.go +++ b/arduino/libraries/librariesindex/index.go @@ -35,7 +35,7 @@ var EmptyIndex = &Index{Libraries: map[string]*Library{}} // Library is a library available for download type Library struct { Name string - Releases map[string]*Release + Releases map[semver.NormalizedString]*Release Latest *Release `json:"-"` Index *Index `json:"-"` } @@ -117,7 +117,7 @@ func (idx *Index) FindRelease(ref *Reference) *Release { if ref.Version == nil { return library.Latest } - return library.Releases[ref.Version.String()] + return library.Releases[ref.Version.NormalizedString()] } return nil } @@ -173,13 +173,10 @@ func (idx *Index) ResolveDependencies(lib *Release) []*Release { // Versions returns an array of all versions available of the library func (library *Library) Versions() []*semver.Version { - res := []*semver.Version{} - for version := range library.Releases { - v, err := semver.Parse(version) - if err == nil { - res = append(res, v) - } + res := semver.List{} + for _, release := range library.Releases { + res = append(res, release.Version) } - sort.Sort(semver.List(res)) + sort.Sort(res) return res } diff --git a/arduino/libraries/librariesindex/json.go b/arduino/libraries/librariesindex/json.go index 59061c9c527..f1820ba9eb9 100644 --- a/arduino/libraries/librariesindex/json.go +++ b/arduino/libraries/librariesindex/json.go @@ -90,7 +90,7 @@ func (indexLib *indexRelease) extractLibraryIn(index *Index) { if !exist { library = &Library{ Name: indexLib.Name, - Releases: map[string]*Release{}, + Releases: map[semver.NormalizedString]*Release{}, } index.Libraries[indexLib.Name] = library } @@ -120,7 +120,7 @@ func (indexLib *indexRelease) extractReleaseIn(library *Library) { License: indexLib.License, ProvidesIncludes: indexLib.ProvidesIncludes, } - library.Releases[indexLib.Version.String()] = release + library.Releases[indexLib.Version.NormalizedString()] = release if library.Latest == nil || library.Latest.Version.LessThan(release.Version) { library.Latest = release } diff --git a/commands/lib/search.go b/commands/lib/search.go index a20b0b3fda9..7035828c8aa 100644 --- a/commands/lib/search.go +++ b/commands/lib/search.go @@ -78,8 +78,8 @@ func indexLibraryToRPCSearchLibrary(lib *librariesindex.Library, omitReleasesDet var releases map[string]*rpc.LibraryRelease if !omitReleasesDetails { releases = map[string]*rpc.LibraryRelease{} - for str, rel := range lib.Releases { - releases[str] = getLibraryParameters(rel) + for _, rel := range lib.Releases { + releases[rel.Version.String()] = getLibraryParameters(rel) } } diff --git a/go.mod b/go.mod index 76735088430..ffe925943c5 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stretchr/testify v1.8.0 go.bug.st/cleanup v1.0.0 go.bug.st/downloader/v2 v2.1.1 - go.bug.st/relaxed-semver v0.9.0 + go.bug.st/relaxed-semver v0.9.1-0.20230314182316-c6633824f06f go.bug.st/serial v1.3.2 golang.org/x/crypto v0.7.0 golang.org/x/text v0.8.0 diff --git a/go.sum b/go.sum index ef0ec2dcbc5..5ec6eef8de7 100644 --- a/go.sum +++ b/go.sum @@ -357,8 +357,8 @@ go.bug.st/cleanup v1.0.0 h1:XVj1HZxkBXeq3gMT7ijWUpHyIC1j8XAoNSyQ06CskgA= go.bug.st/cleanup v1.0.0/go.mod h1:EqVmTg2IBk4znLbPD28xne3abjsJftMdqqJEjhn70bk= go.bug.st/downloader/v2 v2.1.1 h1:nyqbUizo3E2IxCCm4YFac4FtSqqFpqWP+Aae5GCMuw4= go.bug.st/downloader/v2 v2.1.1/go.mod h1:VZW2V1iGKV8rJL2ZEGIDzzBeKowYv34AedJz13RzVII= -go.bug.st/relaxed-semver v0.9.0 h1:qt0T8W70VCurvsbxRK25fQwiTOFjkzwC/fDOpyPnchQ= -go.bug.st/relaxed-semver v0.9.0/go.mod h1:ug0/W/RPYUjliE70Ghxg77RDHmPxqpo7SHV16ijss7Q= +go.bug.st/relaxed-semver v0.9.1-0.20230314182316-c6633824f06f h1:FGckvc9KbIG8vTQfAt41xzVl53hCV3vsP2nDluykfn8= +go.bug.st/relaxed-semver v0.9.1-0.20230314182316-c6633824f06f/go.mod h1:lPVGdtzbQ9/2fv6iXqIXWHOj6cMTUJ/l/Lu1w+sgdio= go.bug.st/serial v1.3.2 h1:6BFZZd/wngoL5PPYYTrFUounF54SIkykHpT98eq6zvk= go.bug.st/serial v1.3.2/go.mod h1:jDkjqASf/qSjmaOxHSHljwUQ6eHo/ZX/bxJLQqSlvZg= go.bug.st/testifyjson v1.1.1 h1:nHotIMK151LF3vYsU/b2RaoVaWCgrf2kvQeGNoZkGaA= From cc65e27a45e220126b1c650a3ab2f296570cc43d Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Wed, 15 Mar 2023 11:25:09 +0100 Subject: [PATCH 3/4] Use normalized version as keys for matching versions in maps for platforms and tools --- arduino/cores/cores.go | 14 +++++++------- arduino/cores/cores_test.go | 2 +- arduino/cores/packageindex/index_test.go | 8 ++++---- arduino/cores/packagemanager/download.go | 2 +- arduino/cores/status.go | 7 ++++--- arduino/cores/tools.go | 12 ++++++------ legacy/builder/test/rewrite_hardware_keys_test.go | 5 +++-- 7 files changed, 26 insertions(+), 24 deletions(-) diff --git a/arduino/cores/cores.go b/arduino/cores/cores.go index 33301b3d986..aa5d865a991 100644 --- a/arduino/cores/cores.go +++ b/arduino/cores/cores.go @@ -40,10 +40,10 @@ type Platform struct { Architecture string // The name of the architecture of this package. Name string Category string - Releases map[string]*PlatformRelease // The Releases of this platform, labeled by version. - Package *Package `json:"-"` - ManuallyInstalled bool // true if the Platform has been installed without the CLI - Deprecated bool // true if the Platform has been deprecated + Releases map[semver.NormalizedString]*PlatformRelease // The Releases of this platform, labeled by version. + Package *Package `json:"-"` + ManuallyInstalled bool // true if the Platform has been installed without the CLI + Deprecated bool // true if the Platform has been deprecated } // PlatformReleaseHelp represents the help URL for this Platform release @@ -191,9 +191,9 @@ func (d *MonitorDependency) String() string { // GetOrCreateRelease returns the specified release corresponding the provided version, // or creates a new one if not found. func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformRelease { - tag := "" + var tag semver.NormalizedString if version != nil { - tag = version.String() + tag = version.NormalizedString() } if release, ok := platform.Releases[tag]; ok { return release @@ -213,7 +213,7 @@ func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformR // or nil if not found. func (platform *Platform) FindReleaseWithVersion(version *semver.Version) *PlatformRelease { // use as an fmt.Stringer - return platform.Releases[version.String()] + return platform.Releases[version.NormalizedString()] } // GetLatestRelease returns the latest release of this platform, or nil if no releases diff --git a/arduino/cores/cores_test.go b/arduino/cores/cores_test.go index 25241b1914a..c4795d57b05 100644 --- a/arduino/cores/cores_test.go +++ b/arduino/cores/cores_test.go @@ -73,7 +73,7 @@ func TestRequiresToolReleaseDiscovery(t *testing.T) { Version: semver.ParseRelaxed("0.1.0"), Tool: &Tool{ Name: toolDependencyName + "not", - Releases: map[string]*ToolRelease{ + Releases: map[semver.NormalizedString]*ToolRelease{ "1.0.0": {Version: semver.ParseRelaxed("1.0.0")}, "0.1.0": {Version: semver.ParseRelaxed("0.1.0")}, "0.0.1": {Version: semver.ParseRelaxed("0.0.1")}, diff --git a/arduino/cores/packageindex/index_test.go b/arduino/cores/packageindex/index_test.go index aa0366ce2e6..efb05c16aa0 100644 --- a/arduino/cores/packageindex/index_test.go +++ b/arduino/cores/packageindex/index_test.go @@ -106,7 +106,7 @@ func TestIndexFromPlatformRelease(t *testing.T) { Tools: map[string]*cores.Tool{ "serial-discovery": { Name: "serial-discovery", - Releases: map[string]*cores.ToolRelease{ + Releases: map[semver.NormalizedString]*cores.ToolRelease{ "1.0.0": { Version: semver.ParseRelaxed("1.0.0"), Flavors: []*cores.Flavor{ @@ -157,7 +157,7 @@ func TestIndexFromPlatformRelease(t *testing.T) { }, "ble-discovery": { Name: "ble-discovery", - Releases: map[string]*cores.ToolRelease{ + Releases: map[semver.NormalizedString]*cores.ToolRelease{ "1.0.0": { Version: semver.ParseRelaxed("1.0.0"), Flavors: []*cores.Flavor{ @@ -209,7 +209,7 @@ func TestIndexFromPlatformRelease(t *testing.T) { }, "bossac": { Name: "bossac", - Releases: map[string]*cores.ToolRelease{ + Releases: map[semver.NormalizedString]*cores.ToolRelease{ "1.6.1-arduino": { Version: semver.ParseRelaxed("1.6.1-arduino"), Flavors: []*cores.Flavor{ @@ -260,7 +260,7 @@ func TestIndexFromPlatformRelease(t *testing.T) { }, "arm-none-eabi-gcc": { Name: "arm-none-eabi-gcc", - Releases: map[string]*cores.ToolRelease{ + Releases: map[semver.NormalizedString]*cores.ToolRelease{ "4.8.3-2014q1": { Version: semver.ParseRelaxed("4.8.3-2014q1"), Flavors: []*cores.Flavor{ diff --git a/arduino/cores/packagemanager/download.go b/arduino/cores/packagemanager/download.go index ff69b8c659a..f3a5877c8a6 100644 --- a/arduino/cores/packagemanager/download.go +++ b/arduino/cores/packagemanager/download.go @@ -61,7 +61,7 @@ func (pme *Explorer) FindPlatformRelease(ref *PlatformReference) *cores.Platform if platform == nil { return nil } - platformRelease, ok := platform.Releases[ref.PlatformVersion.String()] + platformRelease, ok := platform.Releases[ref.PlatformVersion.NormalizedString()] if !ok { return nil } diff --git a/arduino/cores/status.go b/arduino/cores/status.go index 72bc718c46a..1240fe2f9d2 100644 --- a/arduino/cores/status.go +++ b/arduino/cores/status.go @@ -20,6 +20,7 @@ import ( "fmt" "github.com/pmylund/sortutil" + semver "go.bug.st/relaxed-semver" ) // Packages represents a set of Packages @@ -91,7 +92,7 @@ func (packages Packages) GetPlatformReleaseToolDependencies(release *PlatformRel if !exists { return nil, fmt.Errorf(tr("tool %s not found"), dep.ToolName) } - toolRelease, exists := tool.Releases[dep.ToolVersion.String()] + toolRelease, exists := tool.Releases[dep.ToolVersion.NormalizedString()] if !exists { return nil, fmt.Errorf(tr("tool version %s not found"), dep.ToolVersion) } @@ -162,7 +163,7 @@ func (targetPackage *Package) GetOrCreatePlatform(architecture string) *Platform } targetPlatform := &Platform{ Architecture: architecture, - Releases: map[string]*PlatformRelease{}, + Releases: map[semver.NormalizedString]*PlatformRelease{}, Package: targetPackage, } targetPackage.Platforms[architecture] = targetPlatform @@ -178,7 +179,7 @@ func (targetPackage *Package) GetOrCreateTool(name string) *Tool { tool := &Tool{ Name: name, Package: targetPackage, - Releases: map[string]*ToolRelease{}, + Releases: map[semver.NormalizedString]*ToolRelease{}, } targetPackage.Tools[name] = tool return tool diff --git a/arduino/cores/tools.go b/arduino/cores/tools.go index 116a545fcb9..2c78f8b92ae 100644 --- a/arduino/cores/tools.go +++ b/arduino/cores/tools.go @@ -27,9 +27,9 @@ import ( // Tool represents a single Tool, part of a Package. type Tool struct { - Name string `json:"name"` // The Name of the Tool. - Releases map[string]*ToolRelease `json:"releases"` // Maps Version to Release. - Package *Package `json:"-"` + Name string `json:"name"` // The Name of the Tool. + Releases map[semver.NormalizedString]*ToolRelease `json:"releases"` // Maps Version to Release. + Package *Package `json:"-"` } // ToolRelease represents a single release of a tool @@ -49,21 +49,21 @@ type Flavor struct { // GetOrCreateRelease returns the ToolRelease object with the specified version // or creates a new one if not found func (tool *Tool) GetOrCreateRelease(version *semver.RelaxedVersion) *ToolRelease { - if release, ok := tool.Releases[version.String()]; ok { + if release, ok := tool.Releases[version.NormalizedString()]; ok { return release } release := &ToolRelease{ Version: version, Tool: tool, } - tool.Releases[version.String()] = release + tool.Releases[version.NormalizedString()] = release return release } // FindReleaseWithRelaxedVersion returns the specified release corresponding the provided version, // or nil if not found. func (tool *Tool) FindReleaseWithRelaxedVersion(version *semver.RelaxedVersion) *ToolRelease { - return tool.Releases[version.String()] + return tool.Releases[version.NormalizedString()] } // GetAllReleasesVersions returns all the version numbers in this Core Package. diff --git a/legacy/builder/test/rewrite_hardware_keys_test.go b/legacy/builder/test/rewrite_hardware_keys_test.go index 277e9f3ae5e..596ee1a6a66 100644 --- a/legacy/builder/test/rewrite_hardware_keys_test.go +++ b/legacy/builder/test/rewrite_hardware_keys_test.go @@ -23,6 +23,7 @@ import ( "github.com/arduino/arduino-cli/legacy/builder/types" properties "github.com/arduino/go-properties-orderedmap" "github.com/stretchr/testify/require" + semver "go.bug.st/relaxed-semver" ) func TestRewriteHardwareKeys(t *testing.T) { @@ -41,7 +42,7 @@ func TestRewriteHardwareKeys(t *testing.T) { } aPackage.Platforms["dummy"] = &cores.Platform{ Architecture: "dummy", - Releases: map[string]*cores.PlatformRelease{ + Releases: map[semver.NormalizedString]*cores.PlatformRelease{ "": platform, }, } @@ -82,7 +83,7 @@ func TestRewriteHardwareKeysWithRewritingDisabled(t *testing.T) { } aPackage.Platforms["dummy"] = &cores.Platform{ Architecture: "dummy", - Releases: map[string]*cores.PlatformRelease{ + Releases: map[semver.NormalizedString]*cores.PlatformRelease{ "": platform, }, } From e3c7636f1f33a5f6d2efce35b02574efde865942 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 16 Mar 2023 15:06:51 +0100 Subject: [PATCH 4/4] Updated relaxed-semver to 0.10.0 --- .licenses/go/go.bug.st/relaxed-semver.dep.yml | 5 +++-- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.licenses/go/go.bug.st/relaxed-semver.dep.yml b/.licenses/go/go.bug.st/relaxed-semver.dep.yml index 7815713bdad..fee6197719c 100644 --- a/.licenses/go/go.bug.st/relaxed-semver.dep.yml +++ b/.licenses/go/go.bug.st/relaxed-semver.dep.yml @@ -1,8 +1,8 @@ --- name: go.bug.st/relaxed-semver -version: v0.9.1-0.20230314182316-c6633824f06f +version: v0.10.0 type: go -summary: +summary: homepage: https://pkg.go.dev/go.bug.st/relaxed-semver license: bsd-3-clause licenses: @@ -42,3 +42,4 @@ licenses: POSSIBILITY OF SUCH DAMAGE. notices: [] +... diff --git a/go.mod b/go.mod index ffe925943c5..d2ef4dc9e24 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stretchr/testify v1.8.0 go.bug.st/cleanup v1.0.0 go.bug.st/downloader/v2 v2.1.1 - go.bug.st/relaxed-semver v0.9.1-0.20230314182316-c6633824f06f + go.bug.st/relaxed-semver v0.10.0 go.bug.st/serial v1.3.2 golang.org/x/crypto v0.7.0 golang.org/x/text v0.8.0 diff --git a/go.sum b/go.sum index 5ec6eef8de7..33bbbbcec73 100644 --- a/go.sum +++ b/go.sum @@ -357,8 +357,8 @@ go.bug.st/cleanup v1.0.0 h1:XVj1HZxkBXeq3gMT7ijWUpHyIC1j8XAoNSyQ06CskgA= go.bug.st/cleanup v1.0.0/go.mod h1:EqVmTg2IBk4znLbPD28xne3abjsJftMdqqJEjhn70bk= go.bug.st/downloader/v2 v2.1.1 h1:nyqbUizo3E2IxCCm4YFac4FtSqqFpqWP+Aae5GCMuw4= go.bug.st/downloader/v2 v2.1.1/go.mod h1:VZW2V1iGKV8rJL2ZEGIDzzBeKowYv34AedJz13RzVII= -go.bug.st/relaxed-semver v0.9.1-0.20230314182316-c6633824f06f h1:FGckvc9KbIG8vTQfAt41xzVl53hCV3vsP2nDluykfn8= -go.bug.st/relaxed-semver v0.9.1-0.20230314182316-c6633824f06f/go.mod h1:lPVGdtzbQ9/2fv6iXqIXWHOj6cMTUJ/l/Lu1w+sgdio= +go.bug.st/relaxed-semver v0.10.0 h1:l2EX7+NXE3NNWC2yntw7ftU39s+j08zil9fYT+KbyLM= +go.bug.st/relaxed-semver v0.10.0/go.mod h1:lPVGdtzbQ9/2fv6iXqIXWHOj6cMTUJ/l/Lu1w+sgdio= go.bug.st/serial v1.3.2 h1:6BFZZd/wngoL5PPYYTrFUounF54SIkykHpT98eq6zvk= go.bug.st/serial v1.3.2/go.mod h1:jDkjqASf/qSjmaOxHSHljwUQ6eHo/ZX/bxJLQqSlvZg= go.bug.st/testifyjson v1.1.1 h1:nHotIMK151LF3vYsU/b2RaoVaWCgrf2kvQeGNoZkGaA=