Skip to content

Improved version matching in lib and core commands. #2110

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .licenses/go/go.bug.st/relaxed-semver.dep.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
name: go.bug.st/relaxed-semver
version: v0.9.0
version: v0.10.0
type: go
summary:
summary:
homepage: https://pkg.go.dev/go.bug.st/relaxed-semver
license: bsd-3-clause
licenses:
Expand Down Expand Up @@ -42,3 +42,4 @@ licenses:
POSSIBILITY OF SUCH DAMAGE.

notices: []
...
14 changes: 7 additions & 7 deletions arduino/cores/cores.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion arduino/cores/cores_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")},
Expand Down
8 changes: 4 additions & 4 deletions arduino/cores/packageindex/index_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down Expand Up @@ -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{
Expand Down Expand Up @@ -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{
Expand Down Expand Up @@ -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{
Expand Down
2 changes: 1 addition & 1 deletion arduino/cores/packagemanager/download.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
7 changes: 4 additions & 3 deletions arduino/cores/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"fmt"

"github.com/pmylund/sortutil"
semver "go.bug.st/relaxed-semver"
)

// Packages represents a set of Packages
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
12 changes: 6 additions & 6 deletions arduino/cores/tools.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down
15 changes: 6 additions & 9 deletions arduino/libraries/librariesindex/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:"-"`
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
4 changes: 2 additions & 2 deletions arduino/libraries/librariesindex/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down
4 changes: 2 additions & 2 deletions commands/lib/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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.10.0
go.bug.st/serial v1.3.2
golang.org/x/crypto v0.7.0
golang.org/x/text v0.8.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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.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=
Expand Down
12 changes: 12 additions & 0 deletions internal/integrationtest/lib/lib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,18 @@ func TestInstall(t *testing.T) {
_, stderr, err := cli.Run("lib", "install", "[email protected]")
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", "[email protected]")
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", "[email protected]")
require.NoError(t, err)
}

func TestInstallLibraryWithDependencies(t *testing.T) {
Expand Down
5 changes: 3 additions & 2 deletions legacy/builder/test/rewrite_hardware_keys_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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,
},
}
Expand Down Expand Up @@ -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,
},
}
Expand Down