Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
6 changes: 6 additions & 0 deletions arduino/cores/cores.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,18 @@ type Platform struct {
Package *Package `json:"-"`
}

// PlatformReleaseHelp represents the help URL for this Platform release
type PlatformReleaseHelp struct {
Online string `json:"-"`
}

// PlatformRelease represents a release of a plaform package.
type PlatformRelease struct {
Resource *resources.DownloadResource
Version *semver.Version
BoardsManifest []*BoardManifest
Dependencies ToolDependencies // The Dependency entries to load tools.
Help PlatformReleaseHelp `json:"-"`
Platform *Platform `json:"-"`
Properties *properties.Map `json:"-"`
Boards map[string]*Board `json:"-"`
Expand Down
63 changes: 33 additions & 30 deletions arduino/cores/packageindex/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,24 +29,24 @@ import (

// Index represents Cores and Tools struct as seen from package_index.json file.
type Index struct {
Packages []*indexPackage `json:"packages"`
Packages []*IndexPackage `json:"packages"`
IsTrusted bool
}

// indexPackage represents a single entry from package_index.json file.
type indexPackage struct {
// IndexPackage represents a single entry from package_index.json file.
type IndexPackage struct {
Name string `json:"name,required"`
Maintainer string `json:"maintainer,required"`
WebsiteURL string `json:"websiteUrl"`
URL string `json:"Url"`
Email string `json:"email"`
Platforms []*indexPlatformRelease `json:"platforms,required"`
Tools []*indexToolRelease `json:"tools,required"`
Help indexHelp `json:"help,omitempty"`
Platforms []*IndexPlatformRelease `json:"platforms,required"`
Tools []*IndexToolRelease `json:"tools,required"`
Help IndexHelp `json:"help,omitempty"`
}

// indexPlatformRelease represents a single Core Platform from package_index.json file.
type indexPlatformRelease 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"`
Expand All @@ -55,45 +55,47 @@ type indexPlatformRelease struct {
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"`
Boards []IndexBoard `json:"boards"`
Help IndexHelp `json:"help,omitempty"`
ToolDependencies []IndexToolDependency `json:"toolsDependencies,required"`
}

// indexToolDependency represents a single dependency of a core from a tool.
type indexToolDependency struct {
// IndexToolDependency represents a single dependency of a core from a tool.
type IndexToolDependency struct {
Packager string `json:"packager,required"`
Name string `json:"name,required"`
Version *semver.RelaxedVersion `json:"version,required"`
}

// indexToolRelease represents a single Tool from package_index.json file.
type indexToolRelease struct {
// IndexToolRelease represents a single Tool from package_index.json file.
type IndexToolRelease struct {
Name string `json:"name,required"`
Version *semver.RelaxedVersion `json:"version,required"`
Systems []indexToolReleaseFlavour `json:"systems,required"`
Systems []IndexToolReleaseFlavour `json:"systems,required"`
}

// indexToolReleaseFlavour represents a single tool flavor in the package_index.json file.
type indexToolReleaseFlavour struct {
// IndexToolReleaseFlavour represents a single tool flavor in the package_index.json file.
type IndexToolReleaseFlavour struct {
OS string `json:"host,required"`
URL string `json:"url,required"`
ArchiveFileName string `json:"archiveFileName,required"`
Size json.Number `json:"size,required"`
Checksum string `json:"checksum,required"`
}

// indexBoard represents a single Board as written in package_index.json file.
type indexBoard struct {
// IndexBoard represents a single Board as written in package_index.json file.
type IndexBoard struct {
Name string `json:"name"`
ID []indexBoardID `json:"id"`
ID []IndexBoardID `json:"id,omitempty"`
}

type indexBoardID struct {
// IndexBoardID represents the ID of a single board. i.e. uno, yun, diecimila, micro and the likes
type IndexBoardID struct {
USB string `json:"usb"`
}

type indexHelp struct {
// IndexHelp represents the help URL
type IndexHelp struct {
Online string `json:"online,omitempty"`
}

Expand All @@ -105,7 +107,7 @@ func (index Index) MergeIntoPackages(outPackages cores.Packages) {
}
}

func (inPackage indexPackage) extractPackageIn(outPackages cores.Packages, trusted bool) {
func (inPackage IndexPackage) extractPackageIn(outPackages cores.Packages, trusted bool) {
outPackage := outPackages.GetOrCreatePackage(inPackage.Name)
outPackage.Maintainer = inPackage.Maintainer
outPackage.WebsiteURL = inPackage.WebsiteURL
Expand All @@ -122,7 +124,7 @@ func (inPackage indexPackage) extractPackageIn(outPackages cores.Packages, trust
}
}

func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *cores.Package, trusted bool) error {
func (inPlatformRelease IndexPlatformRelease) extractPlatformIn(outPackage *cores.Package, trusted bool) error {
outPlatform := outPackage.GetOrCreatePlatform(inPlatformRelease.Architecture)
// FIXME: shall we use the Name and Category of the latest release? or maybe move Name and Category in PlatformRelease?
outPlatform.Name = inPlatformRelease.Name
Expand All @@ -144,6 +146,7 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core
URL: inPlatformRelease.URL,
CachePath: "packages",
}
outPlatformRelease.Help = cores.PlatformReleaseHelp{Online: inPlatformRelease.Help.Online}
outPlatformRelease.BoardsManifest = inPlatformRelease.extractBoardsManifest()
if deps, err := inPlatformRelease.extractDeps(); err == nil {
outPlatformRelease.Dependencies = deps
Expand All @@ -153,7 +156,7 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core
return nil
}

func (inPlatformRelease indexPlatformRelease) extractDeps() (cores.ToolDependencies, error) {
func (inPlatformRelease IndexPlatformRelease) extractDeps() (cores.ToolDependencies, error) {
ret := make(cores.ToolDependencies, len(inPlatformRelease.ToolDependencies))
for i, dep := range inPlatformRelease.ToolDependencies {
ret[i] = &cores.ToolDependency{
Expand All @@ -165,7 +168,7 @@ func (inPlatformRelease indexPlatformRelease) extractDeps() (cores.ToolDependenc
return ret, nil
}

func (inPlatformRelease indexPlatformRelease) extractBoardsManifest() []*cores.BoardManifest {
func (inPlatformRelease IndexPlatformRelease) extractBoardsManifest() []*cores.BoardManifest {
boards := make([]*cores.BoardManifest, len(inPlatformRelease.Boards))
for i, board := range inPlatformRelease.Boards {
manifest := &cores.BoardManifest{Name: board.Name}
Expand All @@ -179,15 +182,15 @@ func (inPlatformRelease indexPlatformRelease) extractBoardsManifest() []*cores.B
return boards
}

func (inToolRelease indexToolRelease) extractToolIn(outPackage *cores.Package) {
func (inToolRelease IndexToolRelease) extractToolIn(outPackage *cores.Package) {
outTool := outPackage.GetOrCreateTool(inToolRelease.Name)

outToolRelease := outTool.GetOrCreateRelease(inToolRelease.Version)
outToolRelease.Flavors = inToolRelease.extractFlavours()
}

// extractFlavours extracts a map[OS]Flavor object from an indexToolRelease entry.
func (inToolRelease indexToolRelease) extractFlavours() []*cores.Flavor {
// extractFlavours extracts a map[OS]Flavor object from an IndexToolRelease entry.
func (inToolRelease IndexToolRelease) extractFlavours() []*cores.Flavor {
ret := make([]*cores.Flavor, len(inToolRelease.Systems))
for i, flavour := range inToolRelease.Systems {
size, _ := flavour.Size.Int64()
Expand Down
95 changes: 95 additions & 0 deletions arduino/cores/packagemanager/install_uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@
package packagemanager

import (
"encoding/json"
"fmt"
"runtime"
"strconv"

"github.com/arduino/arduino-cli/arduino/cores"
"github.com/arduino/arduino-cli/arduino/cores/packageindex"
"github.com/arduino/arduino-cli/executils"
"github.com/pkg/errors"
)
Expand All @@ -39,6 +42,98 @@ func (pm *PackageManager) InstallPlatform(platformRelease *cores.PlatformRelease
} else {
return err
}
if err := pm.cacheInstalledJSON(platformRelease); err != nil {
return errors.Errorf("creating installed.json in %s: %s", platformRelease.InstallDir, err)
}
return nil
}

func platformReleaseToIndex(pr *cores.PlatformRelease) packageindex.IndexPlatformRelease {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we move this function into arduino/cores/packageindex and avoid to make the packageindex structs public?

boards := []packageindex.IndexBoard{}
for _, manifest := range pr.BoardsManifest {
board := packageindex.IndexBoard{
Name: manifest.Name,
}
for _, id := range manifest.ID {
if id.USB != "" {
board.ID = []packageindex.IndexBoardID{{USB: id.USB}}
}
}
boards = append(boards, board)
}

tools := []packageindex.IndexToolDependency{}
for _, t := range pr.Dependencies {
tools = append(tools, packageindex.IndexToolDependency{
Packager: t.ToolPackager,
Name: t.ToolName,
Version: t.ToolVersion,
})
}
return packageindex.IndexPlatformRelease{
Name: pr.Platform.Name,
Architecture: pr.Platform.Architecture,
Version: pr.Version,
Category: pr.Platform.Category,
URL: pr.Resource.URL,
ArchiveFileName: pr.Resource.ArchiveFileName,
Checksum: pr.Resource.Checksum,
Size: json.Number(strconv.FormatInt(pr.Resource.Size, 10)),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

doesn't a fmt.Sprintf("%d", pr.Resource.Size) works too?

Boards: boards,
Help: packageindex.IndexHelp{Online: pr.Help.Online},
ToolDependencies: tools,
}
}

func packageToolsToIndex(tools map[string]*cores.Tool) []*packageindex.IndexToolRelease {
ret := []*packageindex.IndexToolRelease{}
for name, tool := range tools {
for _, toolRelease := range tool.Releases {
flavours := []packageindex.IndexToolReleaseFlavour{}
for _, flavour := range toolRelease.Flavors {
flavours = append(flavours, packageindex.IndexToolReleaseFlavour{
OS: flavour.OS,
URL: flavour.Resource.URL,
ArchiveFileName: flavour.Resource.ArchiveFileName,
Size: json.Number(strconv.FormatInt(flavour.Resource.Size, 10)),
Checksum: flavour.Resource.Checksum,
})
}
ret = append(ret, &packageindex.IndexToolRelease{
Name: name,
Version: toolRelease.Version,
Systems: flavours,
})
}
}
return ret
}

func (pm *PackageManager) cacheInstalledJSON(platformRelease *cores.PlatformRelease) error {
indexPlatformRelease := platformReleaseToIndex(platformRelease)
indexPackageToolReleases := packageToolsToIndex(platformRelease.Platform.Package.Tools)

index := packageindex.Index{
IsTrusted: platformRelease.IsTrusted,
Packages: []*packageindex.IndexPackage{
{
Name: platformRelease.Platform.Package.Name,
Maintainer: platformRelease.Platform.Package.Maintainer,
WebsiteURL: platformRelease.Platform.Package.WebsiteURL,
URL: platformRelease.Platform.Package.URL,
Email: platformRelease.Platform.Package.Email,
Platforms: []*packageindex.IndexPlatformRelease{&indexPlatformRelease},
Tools: indexPackageToolReleases,
Help: packageindex.IndexHelp{Online: platformRelease.Platform.Package.Help.Online},
},
},
}
platformJSON, err := json.MarshalIndent(index, "", " ")
if err != nil {
return err
}
installedJSON := platformRelease.InstallDir.Join("installed.json")
installedJSON.WriteFile(platformJSON)
return nil
}

Expand Down
Loading