Skip to content

Commit 522d42f

Browse files
committed
Using semantic versioning everywhere
1 parent e5d5c53 commit 522d42f

40 files changed

+828
-1335
lines changed

Gopkg.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

arduino/cores/cores.go

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,13 @@
3030
package cores
3131

3232
import (
33-
"fmt"
3433
"strings"
3534

3635
"github.com/arduino/go-paths-helper"
3736

3837
properties "github.com/arduino/go-properties-map"
3938
"github.com/bcmi-labs/arduino-cli/arduino/resources"
40-
41-
"github.com/blang/semver"
39+
"go.bug.st/relaxed-semver"
4240
)
4341

4442
// Platform represents a platform package.
@@ -53,7 +51,7 @@ type Platform struct {
5351
// PlatformRelease represents a release of a plaform package.
5452
type PlatformRelease struct {
5553
Resource *resources.DownloadResource
56-
Version string
54+
Version *semver.Version
5755
BoardsManifest []*BoardManifest
5856
Dependencies ToolDependencies // The Dependency entries to load tools.
5957
Platform *Platform `json:"-"`
@@ -96,19 +94,23 @@ type ToolDependencies []*ToolDependency
9694
// ToolDependency is a tuple that uniquely identifies a specific version of a Tool
9795
type ToolDependency struct {
9896
ToolName string
99-
ToolVersion string
97+
ToolVersion *semver.Version
10098
ToolPackager string
10199
}
102100

103101
func (dep *ToolDependency) String() string {
104-
return dep.ToolPackager + ":" + dep.ToolName + "@" + dep.ToolVersion
102+
return dep.ToolPackager + ":" + dep.ToolName + "@" + dep.ToolVersion.String()
105103
}
106104

107105
// GetOrCreateRelease returns the specified release corresponding the provided version,
108106
// or creates a new one if not found.
109-
func (platform *Platform) GetOrCreateRelease(version string) *PlatformRelease {
110-
if release, ok := platform.Releases[version]; ok {
111-
return release
107+
func (platform *Platform) GetOrCreateRelease(version *semver.Version) (*PlatformRelease, error) {
108+
tag := ""
109+
if version != nil {
110+
tag = version.String()
111+
}
112+
if release, ok := platform.Releases[tag]; ok {
113+
return release, nil
112114
}
113115
release := &PlatformRelease{
114116
Version: version,
@@ -117,48 +119,50 @@ func (platform *Platform) GetOrCreateRelease(version string) *PlatformRelease {
117119
Programmers: map[string]properties.Map{},
118120
Platform: platform,
119121
}
120-
platform.Releases[version] = release
121-
return release
122+
platform.Releases[tag] = release
123+
return release, nil
122124
}
123125

124126
// GetRelease returns the specified release corresponding the provided version,
125127
// or nil if not found.
126-
func (platform *Platform) GetRelease(version string) *PlatformRelease {
127-
return platform.Releases[version]
128+
func (platform *Platform) GetRelease(version *semver.Version) *PlatformRelease {
129+
return platform.Releases[version.String()]
128130
}
129131

130-
// GetLatestRelease returns the latest release of this platform
132+
// GetLatestRelease returns the latest release of this platform, or nil if no releases
133+
// are available
131134
func (platform *Platform) GetLatestRelease() *PlatformRelease {
132-
return platform.GetRelease(platform.latestReleaseVersion())
135+
latestVersion := platform.latestReleaseVersion()
136+
if latestVersion == nil {
137+
return nil
138+
}
139+
return platform.GetRelease(latestVersion)
133140
}
134141

135142
// GetAllReleasesVersions returns all the version numbers in this Platform Package.
136-
func (platform *Platform) GetAllReleasesVersions() semver.Versions {
137-
versions := make(semver.Versions, 0, len(platform.Releases))
143+
func (platform *Platform) GetAllReleasesVersions() []*semver.Version {
144+
versions := []*semver.Version{}
138145
for _, release := range platform.Releases {
139-
temp, err := semver.Make(release.Version)
140-
if err == nil {
141-
versions = append(versions, temp)
142-
}
146+
versions = append(versions, release.Version)
143147
}
144-
145148
return versions
146149
}
147150

148-
// latestReleaseVersion obtains latest version number.
149-
func (platform *Platform) latestReleaseVersion() string {
151+
// latestReleaseVersion obtains latest version number, or nil if no release available
152+
func (platform *Platform) latestReleaseVersion() *semver.Version {
150153
// TODO: Cache latest version using a field in Platform
151154
versions := platform.GetAllReleasesVersions()
152155
if len(versions) == 0 {
153-
return ""
156+
return nil
154157
}
155158
max := versions[0]
159+
156160
for i := 1; i < len(versions); i++ {
157-
if versions[i].GT(max) {
161+
if versions[i].GreaterThan(max) {
158162
max = versions[i]
159163
}
160164
}
161-
return fmt.Sprint(max)
165+
return max
162166
}
163167

164168
// GetInstalled return one of the installed PlatformRelease
@@ -210,5 +214,9 @@ func (release *PlatformRelease) GetLibrariesDir() *paths.Path {
210214
}
211215

212216
func (release *PlatformRelease) String() string {
213-
return release.Platform.String() + "@" + release.Version
217+
version := ""
218+
if release.Version != nil {
219+
version = release.Version.String()
220+
}
221+
return release.Platform.String() + "@" + version
214222
}

arduino/cores/packageindex/index.go

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ package packageindex
3131

3232
import (
3333
"encoding/json"
34+
"fmt"
3435

3536
"github.com/arduino/go-paths-helper"
36-
37-
"github.com/bcmi-labs/arduino-cli/arduino/resources"
38-
3937
"github.com/bcmi-labs/arduino-cli/arduino/cores"
38+
"github.com/bcmi-labs/arduino-cli/arduino/resources"
39+
"go.bug.st/relaxed-semver"
4040
)
4141

4242
// Index represents Cores and Tools struct as seen from package_index.json file.
@@ -59,7 +59,7 @@ type indexPackage struct {
5959
type indexPlatformRelease struct {
6060
Name string `json:"name,required"`
6161
Architecture string `json:"architecture"`
62-
Version string `json:"version,required"`
62+
Version *semver.Version `json:"version,required"`
6363
Category string `json:"category"`
6464
URL string `json:"url"`
6565
ArchiveFileName string `json:"archiveFileName,required"`
@@ -72,15 +72,15 @@ type indexPlatformRelease struct {
7272

7373
// indexToolDependency represents a single dependency of a core from a tool.
7474
type indexToolDependency struct {
75-
Packager string `json:"packager,required"`
76-
Name string `json:"name,required"`
77-
Version string `json:"version,required"`
75+
Packager string `json:"packager,required"`
76+
Name string `json:"name,required"`
77+
Version *semver.Version `json:"version,required"`
7878
}
7979

8080
// indexToolRelease represents a single Tool from package_index.json file.
8181
type indexToolRelease struct {
8282
Name string `json:"name,required"`
83-
Version string `json:"version,required"`
83+
Version *semver.Version `json:"version,required"`
8484
Systems []indexToolReleaseFlavour `json:"systems,required"`
8585
}
8686

@@ -130,14 +130,20 @@ func (inPackage indexPackage) extractPackageIn(outPackages *cores.Packages) {
130130
}
131131
}
132132

133-
func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *cores.Package) {
133+
func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *cores.Package) error {
134134
outPlatform := outPackage.GetOrCreatePlatform(inPlatformRelease.Architecture)
135135
// FIXME: shall we use the Name and Category of the latest release? or maybe move Name and Category in PlatformRelease?
136136
outPlatform.Name = inPlatformRelease.Name
137137
outPlatform.Category = inPlatformRelease.Category
138138

139-
size, _ := inPlatformRelease.Size.Int64()
140-
outPlatformRelease := outPlatform.GetOrCreateRelease(inPlatformRelease.Version)
139+
size, err := inPlatformRelease.Size.Int64()
140+
if err != nil {
141+
return fmt.Errorf("invalid platform archive size: %s", err)
142+
}
143+
outPlatformRelease, err := outPlatform.GetOrCreateRelease(inPlatformRelease.Version)
144+
if err != nil {
145+
return fmt.Errorf("creating release: %s", err)
146+
}
141147
outPlatformRelease.Resource = &resources.DownloadResource{
142148
ArchiveFileName: inPlatformRelease.ArchiveFileName,
143149
Checksum: inPlatformRelease.Checksum,
@@ -146,10 +152,15 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core
146152
CachePath: "packages",
147153
}
148154
outPlatformRelease.BoardsManifest = inPlatformRelease.extractBoardsManifest()
149-
outPlatformRelease.Dependencies = inPlatformRelease.extractDeps()
155+
if deps, err := inPlatformRelease.extractDeps(); err != nil {
156+
return fmt.Errorf("invalid tool dependencies: %s", err)
157+
} else {
158+
outPlatformRelease.Dependencies = deps
159+
}
160+
return nil
150161
}
151162

152-
func (inPlatformRelease indexPlatformRelease) extractDeps() cores.ToolDependencies {
163+
func (inPlatformRelease indexPlatformRelease) extractDeps() (cores.ToolDependencies, error) {
153164
ret := make(cores.ToolDependencies, len(inPlatformRelease.ToolDependencies))
154165
for i, dep := range inPlatformRelease.ToolDependencies {
155166
ret[i] = &cores.ToolDependency{
@@ -158,7 +169,7 @@ func (inPlatformRelease indexPlatformRelease) extractDeps() cores.ToolDependenci
158169
ToolPackager: dep.Packager,
159170
}
160171
}
161-
return ret
172+
return ret, nil
162173
}
163174

164175
func (inPlatformRelease indexPlatformRelease) extractBoardsManifest() []*cores.BoardManifest {

arduino/cores/packagemanager/download.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,21 @@ import (
3333
"fmt"
3434
"os"
3535

36-
"github.com/cavaliercoder/grab"
37-
3836
"github.com/bcmi-labs/arduino-cli/arduino/cores"
3937
"github.com/bcmi-labs/arduino-cli/common/formatter/output"
38+
"github.com/cavaliercoder/grab"
39+
"go.bug.st/relaxed-semver"
4040
)
4141

4242
// PlatformReference represents a tuple to identify a Platform
4343
type PlatformReference struct {
4444
Package string // The package where this Platform belongs to.
4545
PlatformArchitecture string
46-
PlatformVersion string
46+
PlatformVersion *semver.Version
4747
}
4848

4949
func (platform *PlatformReference) String() string {
50-
return platform.Package + ":" + platform.PlatformArchitecture + "@" + platform.PlatformVersion
50+
return platform.Package + ":" + platform.PlatformArchitecture + "@" + platform.PlatformVersion.String()
5151
}
5252

5353
// FindPlatform returns the Platform matching the PlatformReference or nil if not found.
@@ -70,7 +70,7 @@ func (pm *PackageManager) FindPlatformRelease(ref *PlatformReference) *cores.Pla
7070
if platform == nil {
7171
return nil
7272
}
73-
platformRelease, ok := platform.Releases[ref.PlatformVersion]
73+
platformRelease, ok := platform.Releases[ref.PlatformVersion.String()]
7474
if !ok {
7575
return nil
7676
}
@@ -102,7 +102,7 @@ func (pm *PackageManager) FindItemsToDownload(items []PlatformReference) (
102102
added[platform.String()] = true
103103

104104
var release *cores.PlatformRelease
105-
if item.PlatformVersion != "" {
105+
if item.PlatformVersion != nil {
106106
release = platform.GetRelease(item.PlatformVersion)
107107
if release == nil {
108108
return nil, nil, fmt.Errorf("required version %s not found for platform %s", item.PlatformVersion, platform.String())

arduino/cores/packagemanager/install_uninstall.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (pm *PackageManager) InstallPlatform(platformRelease *cores.PlatformRelease
4141
platformRelease.Platform.Package.Name,
4242
"hardware",
4343
platformRelease.Platform.Architecture,
44-
platformRelease.Version)
44+
platformRelease.Version.String())
4545
return platformRelease.Resource.Install(pm.DownloadDir, pm.TempDir, destDir)
4646
}
4747

@@ -55,6 +55,6 @@ func (pm *PackageManager) InstallTool(toolRelease *cores.ToolRelease) error {
5555
toolRelease.Tool.Package.Name,
5656
"tools",
5757
toolRelease.Tool.Name,
58-
toolRelease.Version)
58+
toolRelease.Version.String())
5959
return toolResource.Install(pm.DownloadDir, pm.TempDir, destDir)
6060
}

0 commit comments

Comments
 (0)