Skip to content

Commit d5eb0b7

Browse files
authored
Improved version matching in lib and core commands. (arduino#2110)
* Added test * Use normalized version as keys for matching versions in maps * Use normalized version as keys for matching versions in maps for platforms and tools * Updated relaxed-semver to 0.10.0
1 parent d1eedf5 commit d5eb0b7

File tree

14 files changed

+54
-42
lines changed

14 files changed

+54
-42
lines changed

Diff for: .licenses/go/go.bug.st/relaxed-semver.dep.yml

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
22
name: go.bug.st/relaxed-semver
3-
version: v0.9.0
3+
version: v0.10.0
44
type: go
5-
summary:
5+
summary:
66
homepage: https://pkg.go.dev/go.bug.st/relaxed-semver
77
license: bsd-3-clause
88
licenses:
@@ -42,3 +42,4 @@ licenses:
4242
POSSIBILITY OF SUCH DAMAGE.
4343
4444
notices: []
45+
...

Diff for: arduino/cores/cores.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ type Platform struct {
4040
Architecture string // The name of the architecture of this package.
4141
Name string
4242
Category string
43-
Releases map[string]*PlatformRelease // The Releases of this platform, labeled by version.
44-
Package *Package `json:"-"`
45-
ManuallyInstalled bool // true if the Platform has been installed without the CLI
46-
Deprecated bool // true if the Platform has been deprecated
43+
Releases map[semver.NormalizedString]*PlatformRelease // The Releases of this platform, labeled by version.
44+
Package *Package `json:"-"`
45+
ManuallyInstalled bool // true if the Platform has been installed without the CLI
46+
Deprecated bool // true if the Platform has been deprecated
4747
}
4848

4949
// PlatformReleaseHelp represents the help URL for this Platform release
@@ -191,9 +191,9 @@ func (d *MonitorDependency) String() string {
191191
// GetOrCreateRelease returns the specified release corresponding the provided version,
192192
// or creates a new one if not found.
193193
func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformRelease {
194-
tag := ""
194+
var tag semver.NormalizedString
195195
if version != nil {
196-
tag = version.String()
196+
tag = version.NormalizedString()
197197
}
198198
if release, ok := platform.Releases[tag]; ok {
199199
return release
@@ -213,7 +213,7 @@ func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformR
213213
// or nil if not found.
214214
func (platform *Platform) FindReleaseWithVersion(version *semver.Version) *PlatformRelease {
215215
// use as an fmt.Stringer
216-
return platform.Releases[version.String()]
216+
return platform.Releases[version.NormalizedString()]
217217
}
218218

219219
// GetLatestRelease returns the latest release of this platform, or nil if no releases

Diff for: arduino/cores/cores_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func TestRequiresToolReleaseDiscovery(t *testing.T) {
7373
Version: semver.ParseRelaxed("0.1.0"),
7474
Tool: &Tool{
7575
Name: toolDependencyName + "not",
76-
Releases: map[string]*ToolRelease{
76+
Releases: map[semver.NormalizedString]*ToolRelease{
7777
"1.0.0": {Version: semver.ParseRelaxed("1.0.0")},
7878
"0.1.0": {Version: semver.ParseRelaxed("0.1.0")},
7979
"0.0.1": {Version: semver.ParseRelaxed("0.0.1")},

Diff for: arduino/cores/packageindex/index_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func TestIndexFromPlatformRelease(t *testing.T) {
106106
Tools: map[string]*cores.Tool{
107107
"serial-discovery": {
108108
Name: "serial-discovery",
109-
Releases: map[string]*cores.ToolRelease{
109+
Releases: map[semver.NormalizedString]*cores.ToolRelease{
110110
"1.0.0": {
111111
Version: semver.ParseRelaxed("1.0.0"),
112112
Flavors: []*cores.Flavor{
@@ -157,7 +157,7 @@ func TestIndexFromPlatformRelease(t *testing.T) {
157157
},
158158
"ble-discovery": {
159159
Name: "ble-discovery",
160-
Releases: map[string]*cores.ToolRelease{
160+
Releases: map[semver.NormalizedString]*cores.ToolRelease{
161161
"1.0.0": {
162162
Version: semver.ParseRelaxed("1.0.0"),
163163
Flavors: []*cores.Flavor{
@@ -209,7 +209,7 @@ func TestIndexFromPlatformRelease(t *testing.T) {
209209
},
210210
"bossac": {
211211
Name: "bossac",
212-
Releases: map[string]*cores.ToolRelease{
212+
Releases: map[semver.NormalizedString]*cores.ToolRelease{
213213
"1.6.1-arduino": {
214214
Version: semver.ParseRelaxed("1.6.1-arduino"),
215215
Flavors: []*cores.Flavor{
@@ -260,7 +260,7 @@ func TestIndexFromPlatformRelease(t *testing.T) {
260260
},
261261
"arm-none-eabi-gcc": {
262262
Name: "arm-none-eabi-gcc",
263-
Releases: map[string]*cores.ToolRelease{
263+
Releases: map[semver.NormalizedString]*cores.ToolRelease{
264264
"4.8.3-2014q1": {
265265
Version: semver.ParseRelaxed("4.8.3-2014q1"),
266266
Flavors: []*cores.Flavor{

Diff for: arduino/cores/packagemanager/download.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (pme *Explorer) FindPlatformRelease(ref *PlatformReference) *cores.Platform
6161
if platform == nil {
6262
return nil
6363
}
64-
platformRelease, ok := platform.Releases[ref.PlatformVersion.String()]
64+
platformRelease, ok := platform.Releases[ref.PlatformVersion.NormalizedString()]
6565
if !ok {
6666
return nil
6767
}

Diff for: arduino/cores/status.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121

2222
"github.com/pmylund/sortutil"
23+
semver "go.bug.st/relaxed-semver"
2324
)
2425

2526
// Packages represents a set of Packages
@@ -91,7 +92,7 @@ func (packages Packages) GetPlatformReleaseToolDependencies(release *PlatformRel
9192
if !exists {
9293
return nil, fmt.Errorf(tr("tool %s not found"), dep.ToolName)
9394
}
94-
toolRelease, exists := tool.Releases[dep.ToolVersion.String()]
95+
toolRelease, exists := tool.Releases[dep.ToolVersion.NormalizedString()]
9596
if !exists {
9697
return nil, fmt.Errorf(tr("tool version %s not found"), dep.ToolVersion)
9798
}
@@ -162,7 +163,7 @@ func (targetPackage *Package) GetOrCreatePlatform(architecture string) *Platform
162163
}
163164
targetPlatform := &Platform{
164165
Architecture: architecture,
165-
Releases: map[string]*PlatformRelease{},
166+
Releases: map[semver.NormalizedString]*PlatformRelease{},
166167
Package: targetPackage,
167168
}
168169
targetPackage.Platforms[architecture] = targetPlatform
@@ -178,7 +179,7 @@ func (targetPackage *Package) GetOrCreateTool(name string) *Tool {
178179
tool := &Tool{
179180
Name: name,
180181
Package: targetPackage,
181-
Releases: map[string]*ToolRelease{},
182+
Releases: map[semver.NormalizedString]*ToolRelease{},
182183
}
183184
targetPackage.Tools[name] = tool
184185
return tool

Diff for: arduino/cores/tools.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ import (
2727

2828
// Tool represents a single Tool, part of a Package.
2929
type Tool struct {
30-
Name string `json:"name"` // The Name of the Tool.
31-
Releases map[string]*ToolRelease `json:"releases"` // Maps Version to Release.
32-
Package *Package `json:"-"`
30+
Name string `json:"name"` // The Name of the Tool.
31+
Releases map[semver.NormalizedString]*ToolRelease `json:"releases"` // Maps Version to Release.
32+
Package *Package `json:"-"`
3333
}
3434

3535
// ToolRelease represents a single release of a tool
@@ -49,21 +49,21 @@ type Flavor struct {
4949
// GetOrCreateRelease returns the ToolRelease object with the specified version
5050
// or creates a new one if not found
5151
func (tool *Tool) GetOrCreateRelease(version *semver.RelaxedVersion) *ToolRelease {
52-
if release, ok := tool.Releases[version.String()]; ok {
52+
if release, ok := tool.Releases[version.NormalizedString()]; ok {
5353
return release
5454
}
5555
release := &ToolRelease{
5656
Version: version,
5757
Tool: tool,
5858
}
59-
tool.Releases[version.String()] = release
59+
tool.Releases[version.NormalizedString()] = release
6060
return release
6161
}
6262

6363
// FindReleaseWithRelaxedVersion returns the specified release corresponding the provided version,
6464
// or nil if not found.
6565
func (tool *Tool) FindReleaseWithRelaxedVersion(version *semver.RelaxedVersion) *ToolRelease {
66-
return tool.Releases[version.String()]
66+
return tool.Releases[version.NormalizedString()]
6767
}
6868

6969
// GetAllReleasesVersions returns all the version numbers in this Core Package.

Diff for: arduino/libraries/librariesindex/index.go

+6-9
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ var EmptyIndex = &Index{Libraries: map[string]*Library{}}
3535
// Library is a library available for download
3636
type Library struct {
3737
Name string
38-
Releases map[string]*Release
38+
Releases map[semver.NormalizedString]*Release
3939
Latest *Release `json:"-"`
4040
Index *Index `json:"-"`
4141
}
@@ -117,7 +117,7 @@ func (idx *Index) FindRelease(ref *Reference) *Release {
117117
if ref.Version == nil {
118118
return library.Latest
119119
}
120-
return library.Releases[ref.Version.String()]
120+
return library.Releases[ref.Version.NormalizedString()]
121121
}
122122
return nil
123123
}
@@ -173,13 +173,10 @@ func (idx *Index) ResolveDependencies(lib *Release) []*Release {
173173

174174
// Versions returns an array of all versions available of the library
175175
func (library *Library) Versions() []*semver.Version {
176-
res := []*semver.Version{}
177-
for version := range library.Releases {
178-
v, err := semver.Parse(version)
179-
if err == nil {
180-
res = append(res, v)
181-
}
176+
res := semver.List{}
177+
for _, release := range library.Releases {
178+
res = append(res, release.Version)
182179
}
183-
sort.Sort(semver.List(res))
180+
sort.Sort(res)
184181
return res
185182
}

Diff for: arduino/libraries/librariesindex/json.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (indexLib *indexRelease) extractLibraryIn(index *Index) {
9090
if !exist {
9191
library = &Library{
9292
Name: indexLib.Name,
93-
Releases: map[string]*Release{},
93+
Releases: map[semver.NormalizedString]*Release{},
9494
}
9595
index.Libraries[indexLib.Name] = library
9696
}
@@ -120,7 +120,7 @@ func (indexLib *indexRelease) extractReleaseIn(library *Library) {
120120
License: indexLib.License,
121121
ProvidesIncludes: indexLib.ProvidesIncludes,
122122
}
123-
library.Releases[indexLib.Version.String()] = release
123+
library.Releases[indexLib.Version.NormalizedString()] = release
124124
if library.Latest == nil || library.Latest.Version.LessThan(release.Version) {
125125
library.Latest = release
126126
}

Diff for: commands/lib/search.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ func indexLibraryToRPCSearchLibrary(lib *librariesindex.Library, omitReleasesDet
7878
var releases map[string]*rpc.LibraryRelease
7979
if !omitReleasesDetails {
8080
releases = map[string]*rpc.LibraryRelease{}
81-
for str, rel := range lib.Releases {
82-
releases[str] = getLibraryParameters(rel)
81+
for _, rel := range lib.Releases {
82+
releases[rel.Version.String()] = getLibraryParameters(rel)
8383
}
8484
}
8585

Diff for: go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ require (
3535
github.com/stretchr/testify v1.8.0
3636
go.bug.st/cleanup v1.0.0
3737
go.bug.st/downloader/v2 v2.1.1
38-
go.bug.st/relaxed-semver v0.9.0
38+
go.bug.st/relaxed-semver v0.10.0
3939
go.bug.st/serial v1.3.2
4040
golang.org/x/crypto v0.7.0
4141
golang.org/x/text v0.8.0

Diff for: go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,8 @@ go.bug.st/cleanup v1.0.0 h1:XVj1HZxkBXeq3gMT7ijWUpHyIC1j8XAoNSyQ06CskgA=
357357
go.bug.st/cleanup v1.0.0/go.mod h1:EqVmTg2IBk4znLbPD28xne3abjsJftMdqqJEjhn70bk=
358358
go.bug.st/downloader/v2 v2.1.1 h1:nyqbUizo3E2IxCCm4YFac4FtSqqFpqWP+Aae5GCMuw4=
359359
go.bug.st/downloader/v2 v2.1.1/go.mod h1:VZW2V1iGKV8rJL2ZEGIDzzBeKowYv34AedJz13RzVII=
360-
go.bug.st/relaxed-semver v0.9.0 h1:qt0T8W70VCurvsbxRK25fQwiTOFjkzwC/fDOpyPnchQ=
361-
go.bug.st/relaxed-semver v0.9.0/go.mod h1:ug0/W/RPYUjliE70Ghxg77RDHmPxqpo7SHV16ijss7Q=
360+
go.bug.st/relaxed-semver v0.10.0 h1:l2EX7+NXE3NNWC2yntw7ftU39s+j08zil9fYT+KbyLM=
361+
go.bug.st/relaxed-semver v0.10.0/go.mod h1:lPVGdtzbQ9/2fv6iXqIXWHOj6cMTUJ/l/Lu1w+sgdio=
362362
go.bug.st/serial v1.3.2 h1:6BFZZd/wngoL5PPYYTrFUounF54SIkykHpT98eq6zvk=
363363
go.bug.st/serial v1.3.2/go.mod h1:jDkjqASf/qSjmaOxHSHljwUQ6eHo/ZX/bxJLQqSlvZg=
364364
go.bug.st/testifyjson v1.1.1 h1:nHotIMK151LF3vYsU/b2RaoVaWCgrf2kvQeGNoZkGaA=

Diff for: internal/integrationtest/lib/lib_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,18 @@ func TestInstall(t *testing.T) {
541541
_, stderr, err := cli.Run("lib", "install", "[email protected]")
542542
require.Error(t, err)
543543
require.Contains(t, string(stderr), "No valid dependencies solution found: dependency 'MD_MAX72xx' is not available")
544+
545+
// Test installing a library with a "relaxed" version
546+
// https://github.com/arduino/arduino-cli/issues/1727
547+
_, _, err = cli.Run("lib", "install", "[email protected]")
548+
require.NoError(t, err)
549+
stdout, _, err := cli.Run("lib", "list", "--format", "json")
550+
require.NoError(t, err)
551+
requirejson.Parse(t, stdout).Query(`.[] | select(.library.name == "ILI9341_t3") | .library.version`).MustEqual(`"1.0"`)
552+
_, _, err = cli.Run("lib", "install", "ILI9341_t3@1")
553+
require.NoError(t, err)
554+
_, _, err = cli.Run("lib", "install", "[email protected]")
555+
require.NoError(t, err)
544556
}
545557

546558
func TestInstallLibraryWithDependencies(t *testing.T) {

Diff for: legacy/builder/test/rewrite_hardware_keys_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/arduino/arduino-cli/legacy/builder/types"
2424
properties "github.com/arduino/go-properties-orderedmap"
2525
"github.com/stretchr/testify/require"
26+
semver "go.bug.st/relaxed-semver"
2627
)
2728

2829
func TestRewriteHardwareKeys(t *testing.T) {
@@ -41,7 +42,7 @@ func TestRewriteHardwareKeys(t *testing.T) {
4142
}
4243
aPackage.Platforms["dummy"] = &cores.Platform{
4344
Architecture: "dummy",
44-
Releases: map[string]*cores.PlatformRelease{
45+
Releases: map[semver.NormalizedString]*cores.PlatformRelease{
4546
"": platform,
4647
},
4748
}
@@ -82,7 +83,7 @@ func TestRewriteHardwareKeysWithRewritingDisabled(t *testing.T) {
8283
}
8384
aPackage.Platforms["dummy"] = &cores.Platform{
8485
Architecture: "dummy",
85-
Releases: map[string]*cores.PlatformRelease{
86+
Releases: map[semver.NormalizedString]*cores.PlatformRelease{
8687
"": platform,
8788
},
8889
}

0 commit comments

Comments
 (0)