Skip to content

Added discoveries support in package_index.json #1345

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 1 commit into from
Jul 2, 2021
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
38 changes: 36 additions & 2 deletions arduino/cores/cores.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package cores

import (
"encoding/json"
"fmt"
"sort"
"strings"

Expand Down Expand Up @@ -47,7 +48,8 @@ type PlatformRelease struct {
Resource *resources.DownloadResource
Version *semver.Version
BoardsManifest []*BoardManifest
Dependencies ToolDependencies // The Dependency entries to load tools.
ToolDependencies ToolDependencies
DiscoveryDependencies DiscoveryDependencies
Help PlatformReleaseHelp `json:"-"`
Platform *Platform `json:"-"`
Properties *properties.Map `json:"-"`
Expand Down Expand Up @@ -113,6 +115,30 @@ func (dep *ToolDependency) String() string {
return dep.ToolPackager + ":" + dep.ToolName + "@" + dep.ToolVersion.String()
}

// DiscoveryDependencies is a list of DiscoveryDependency
type DiscoveryDependencies []*DiscoveryDependency

// Sort the DiscoveryDependencies by name.
func (d DiscoveryDependencies) Sort() {
sort.Slice(d, func(i, j int) bool {
if d[i].Packager != d[j].Packager {
return d[i].Packager < d[j].Packager
}
return d[i].Name < d[j].Name
})
}

// DiscoveryDependency identifies a specific discovery, version is omitted
// since the latest version will always be used
type DiscoveryDependency struct {
Name string
Packager string
}

func (d *DiscoveryDependency) String() string {
return fmt.Sprintf("%s:%s", d.Packager, d.Name)
}

// 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 {
Expand Down Expand Up @@ -224,13 +250,21 @@ func (release *PlatformRelease) GetOrCreateBoard(boardID string) *Board {
// RequiresToolRelease returns true if the PlatformRelease requires the
// toolReleased passed as parameter
func (release *PlatformRelease) RequiresToolRelease(toolRelease *ToolRelease) bool {
for _, toolDep := range release.Dependencies {
for _, toolDep := range release.ToolDependencies {
if toolDep.ToolName == toolRelease.Tool.Name &&
toolDep.ToolPackager == toolRelease.Tool.Package.Name &&
toolDep.ToolVersion.Equal(toolRelease.Version) {
return true
}
}
for _, discovery := range release.DiscoveryDependencies {
if discovery.Name == toolRelease.Tool.Name &&
discovery.Packager == toolRelease.Tool.Package.Name &&
// We always want the latest discovery version available
toolRelease.Version.Equal(toolRelease.Tool.LatestRelease().Version) {
return true
}
}
return false
}

Expand Down
39 changes: 38 additions & 1 deletion arduino/cores/cores_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func TestRequiresToolRelease(t *testing.T) {
toolDependencyPackager := "arduino"

release := PlatformRelease{
Dependencies: ToolDependencies{
ToolDependencies: ToolDependencies{
{
ToolName: toolDependencyName,
ToolVersion: semver.ParseRelaxed(toolDependencyVersion),
Expand All @@ -55,3 +55,40 @@ func TestRequiresToolRelease(t *testing.T) {
toolRelease.Version = semver.ParseRelaxed(toolDependencyVersion)
require.True(t, release.RequiresToolRelease(toolRelease))
}

func TestRequiresToolReleaseDiscovery(t *testing.T) {
toolDependencyName := "ble-discovery"
toolDependencyPackager := "arduino"

release := PlatformRelease{
DiscoveryDependencies: DiscoveryDependencies{
{
Name: toolDependencyName,
Packager: toolDependencyPackager,
},
},
}

toolRelease := &ToolRelease{
Version: semver.ParseRelaxed("0.1.0"),
Tool: &Tool{
Name: toolDependencyName + "not",
Releases: map[string]*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")},
},
Package: &Package{
Name: toolDependencyPackager + "not",
},
},
}

require.False(t, release.RequiresToolRelease(toolRelease))
toolRelease.Tool.Name = toolDependencyName
require.False(t, release.RequiresToolRelease(toolRelease))
toolRelease.Tool.Package.Name = toolDependencyPackager
require.False(t, release.RequiresToolRelease(toolRelease))
toolRelease.Version = semver.ParseRelaxed("1.0.0")
require.True(t, release.RequiresToolRelease(toolRelease))
}
100 changes: 62 additions & 38 deletions arduino/cores/packageindex/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,19 @@ type indexPackage struct {

// indexPlatformRelease represents a single Core Platform from package_index.json file.
type indexPlatformRelease struct {
Name string `json:"name,required"`
Architecture string `json:"architecture"`
Version *semver.Version `json:"version,required"`
Deprecated bool `json:"deprecated"`
Category string `json:"category"`
URL string `json:"url"`
ArchiveFileName string `json:"archiveFileName,required"`
Checksum string `json:"checksum,required"`
Size json.Number `json:"size,required"`
Boards []indexBoard `json:"boards"`
Help indexHelp `json:"help,omitempty"`
ToolDependencies []indexToolDependency `json:"toolsDependencies,required"`
Name string `json:"name,required"`
Architecture string `json:"architecture"`
Version *semver.Version `json:"version,required"`
Deprecated bool `json:"deprecated"`
Category string `json:"category"`
URL string `json:"url"`
ArchiveFileName string `json:"archiveFileName,required"`
Checksum string `json:"checksum,required"`
Size json.Number `json:"size,required"`
Boards []indexBoard `json:"boards"`
Help indexHelp `json:"help,omitempty"`
ToolDependencies []indexToolDependency `json:"toolsDependencies"`
DiscoveryDependencies []indexDiscoveryDependency `json:"discoveryDependencies"`
}

// indexToolDependency represents a single dependency of a core from a tool.
Expand All @@ -68,6 +69,12 @@ type indexToolDependency struct {
Version *semver.RelaxedVersion `json:"version,required"`
}

// indexDiscoveryDependency represents a single dependency of a core from a pluggable discovery tool.
type indexDiscoveryDependency struct {
Packager string `json:"packager"`
Name string `json:"name"`
}

// indexToolRelease represents a single Tool from package_index.json file.
type indexToolRelease struct {
Name string `json:"name,required"`
Expand Down Expand Up @@ -126,14 +133,22 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
}

tools := []indexToolDependency{}
for _, t := range pr.Dependencies {
for _, t := range pr.ToolDependencies {
tools = append(tools, indexToolDependency{
Packager: t.ToolPackager,
Name: t.ToolName,
Version: t.ToolVersion,
})
}

discoveries := []indexDiscoveryDependency{}
for _, d := range pr.DiscoveryDependencies {
discoveries = append(discoveries, indexDiscoveryDependency{
Packager: d.Packager,
Name: d.Name,
})
}

packageTools := []*indexToolRelease{}
for name, tool := range pr.Platform.Package.Tools {
for _, toolRelease := range tool.Releases {
Expand Down Expand Up @@ -165,18 +180,19 @@ func IndexFromPlatformRelease(pr *cores.PlatformRelease) Index {
URL: pr.Platform.Package.URL,
Email: pr.Platform.Package.Email,
Platforms: []*indexPlatformRelease{{
Name: pr.Platform.Name,
Architecture: pr.Platform.Architecture,
Version: pr.Version,
Deprecated: pr.Platform.Deprecated,
Category: pr.Platform.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,
Name: pr.Platform.Name,
Architecture: pr.Platform.Architecture,
Version: pr.Version,
Deprecated: pr.Platform.Deprecated,
Category: pr.Platform.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,
}},
Tools: packageTools,
Help: indexHelp{Online: pr.Platform.Package.Help.Online},
Expand Down Expand Up @@ -230,24 +246,32 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core
}
outPlatformRelease.Help = cores.PlatformReleaseHelp{Online: inPlatformRelease.Help.Online}
outPlatformRelease.BoardsManifest = inPlatformRelease.extractBoardsManifest()
if deps, err := inPlatformRelease.extractDeps(); err == nil {
outPlatformRelease.Dependencies = deps
} else {
return fmt.Errorf("invalid tool dependencies: %s", err)
}
outPlatformRelease.ToolDependencies = inPlatformRelease.extractToolDependencies()
outPlatformRelease.DiscoveryDependencies = inPlatformRelease.extractDiscoveryDependencies()
return nil
}

func (inPlatformRelease indexPlatformRelease) extractDeps() (cores.ToolDependencies, error) {
ret := make(cores.ToolDependencies, len(inPlatformRelease.ToolDependencies))
for i, dep := range inPlatformRelease.ToolDependencies {
ret[i] = &cores.ToolDependency{
ToolName: dep.Name,
ToolVersion: dep.Version,
ToolPackager: dep.Packager,
func (inPlatformRelease indexPlatformRelease) extractToolDependencies() cores.ToolDependencies {
res := make(cores.ToolDependencies, len(inPlatformRelease.ToolDependencies))
for i, tool := range inPlatformRelease.ToolDependencies {
res[i] = &cores.ToolDependency{
ToolName: tool.Name,
ToolVersion: tool.Version,
ToolPackager: tool.Packager,
}
}
return res
}

func (inPlatformRelease indexPlatformRelease) extractDiscoveryDependencies() cores.DiscoveryDependencies {
res := make(cores.DiscoveryDependencies, len(inPlatformRelease.DiscoveryDependencies))
for i, discovery := range inPlatformRelease.DiscoveryDependencies {
res[i] = &cores.DiscoveryDependency{
Name: discovery.Name,
Packager: discovery.Packager,
}
}
return ret, nil
return res
}

func (inPlatformRelease indexPlatformRelease) extractBoardsManifest() []*cores.BoardManifest {
Expand Down
Loading