Skip to content

Commit 237d69b

Browse files
committed
draft
1 parent 5040510 commit 237d69b

16 files changed

+232
-165
lines changed

commands/instances.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ func (s *arduinoCoreServerImpl) Init(req *rpc.InitRequest, stream rpc.ArduinoCor
320320
// Load libraries
321321
for _, pack := range pme.GetPackages() {
322322
for _, platform := range pack.Platforms {
323-
if platformRelease := pme.GetInstalledPlatformRelease(platform); platformRelease != nil {
323+
if platformRelease := pme.GetBestInstalledPlatformRelease(platform); platformRelease != nil {
324324
lmb.AddLibrariesDir(librariesmanager.LibrariesDir{
325325
PlatformRelease: platformRelease,
326326
Path: platformRelease.GetLibrariesDir(),

commands/service_board_listall.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (s *arduinoCoreServerImpl) BoardListAll(ctx context.Context, req *rpc.Board
3939
list := &rpc.BoardListAllResponse{Boards: []*rpc.BoardListItem{}}
4040
for _, targetPackage := range toSortedPackageArray(pme.GetPackages()) {
4141
for _, platform := range toSortedPlatformArray(targetPackage.Platforms) {
42-
installedPlatformRelease := pme.GetInstalledPlatformRelease(platform)
42+
installedPlatformRelease := pme.GetBestInstalledPlatformRelease(platform)
4343
// We only want to list boards for installed platforms
4444
if installedPlatformRelease == nil {
4545
continue

commands/service_board_search.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (s *arduinoCoreServerImpl) BoardSearch(ctx context.Context, req *rpc.BoardS
4040
for _, targetPackage := range pme.GetPackages() {
4141
for _, platform := range targetPackage.Platforms {
4242
latestPlatformRelease := platform.GetLatestCompatibleRelease()
43-
installedPlatformRelease := pme.GetInstalledPlatformRelease(platform)
43+
installedPlatformRelease := pme.GetBestInstalledPlatformRelease(platform)
4444

4545
if latestPlatformRelease == nil && installedPlatformRelease == nil {
4646
continue

commands/service_platform_install.go

+3
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,20 @@ func (s *arduinoCoreServerImpl) PlatformInstall(req *rpc.PlatformInstallRequest,
7676
PlatformArchitecture: req.GetArchitecture(),
7777
PlatformVersion: version,
7878
}
79+
fmt.Println(ref)
7980
platformRelease, tools, err := pme.FindPlatformReleaseDependencies(ref)
8081
if err != nil {
8182
return &cmderrors.PlatformNotFoundError{Platform: ref.String(), Cause: err}
8283
}
8384

8485
// Prerequisite checks before install
86+
fmt.Println("A")
8587
if platformRelease.IsInstalled() {
8688
taskCB(&rpc.TaskProgress{Name: i18n.Tr("Platform %s already installed", platformRelease), Completed: true})
8789
return nil
8890
}
8991

92+
fmt.Println("B")
9093
if req.GetNoOverwrite() {
9194
if installed := pme.GetInstalledPlatformRelease(platformRelease.Platform); installed != nil {
9295
return fmt.Errorf("%s: %s",

commands/service_platform_search.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (s *arduinoCoreServerImpl) PlatformSearch(_ context.Context, req *rpc.Platf
4141
res = pme.FindPlatformReleaseProvidingBoardsWithVidPid(vid, pid)
4242
} else {
4343
searchArgs := utils.SearchTermsFromQueryString(req.GetSearchArgs())
44-
for _, targetPackage := range pme.GetPackages() {
44+
for _, targetPackage := range pme.AllPackages() {
4545
for _, platform := range targetPackage.Platforms {
4646
if platform == nil {
4747
continue
@@ -91,6 +91,9 @@ func (s *arduinoCoreServerImpl) PlatformSearch(_ context.Context, req *rpc.Platf
9191
if latestCompatible := platform.GetLatestCompatibleRelease(); latestCompatible != nil {
9292
rpcPlatformSummary.LatestVersion = latestCompatible.Version.String()
9393
}
94+
if _, has := platform.GetManuallyInstalledRelease(); has {
95+
rpcPlatformSummary.HasManuallyInstalledRelease = true
96+
}
9497
for _, platformRelease := range platform.GetAllReleases() {
9598
rpcPlatformRelease := platformReleaseToRPC(platformRelease)
9699
rpcPlatformSummary.Releases[rpcPlatformRelease.GetVersion()] = rpcPlatformRelease

commands/service_platform_uninstall.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func platformUninstall(_ context.Context, req *rpc.PlatformUninstallRequest, tas
7777
if platform == nil {
7878
return &cmderrors.PlatformNotFoundError{Platform: ref.String()}
7979
}
80-
platformRelease := pme.GetInstalledPlatformRelease(platform)
80+
platformRelease := pme.GetBestInstalledPlatformRelease(platform)
8181
if platformRelease == nil {
8282
return &cmderrors.PlatformNotFoundError{Platform: ref.String()}
8383
}

commands/service_upload.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ func (s *arduinoCoreServerImpl) runProgramAction(ctx context.Context, pme *packa
362362
return nil, &cmderrors.PlatformNotFoundError{Platform: split[0] + ":" + boardPlatform.Platform.Architecture}
363363
}
364364
uploadToolID = split[1]
365-
uploadToolPlatform = pme.GetInstalledPlatformRelease(p)
365+
uploadToolPlatform = pme.GetBestInstalledPlatformRelease(p)
366366
if uploadToolPlatform == nil {
367367
return nil, &cmderrors.PlatformNotFoundError{Platform: split[0] + ":" + boardPlatform.Platform.Architecture}
368368
}

internal/arduino/cores/cores.go

+11-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type Platform struct {
4040
Architecture string // The name of the architecture of this package.
4141
Releases map[semver.NormalizedString]*PlatformRelease // The Releases of this platform, labeled by version.
4242
Package *Package `json:"-"`
43-
ManuallyInstalled bool // true if the Platform has been installed without the CLI
43+
ManuallyInstalled bool // true if the Platform exists due to a manually installed release
4444
Deprecated bool // true if the latest PlatformRelease of this Platform has been deprecated
4545
Indexed bool // true if the Platform has been indexed from additional-urls
4646
Latest *semver.Version `json:"-"`
@@ -238,10 +238,10 @@ func (d *MonitorDependency) String() string {
238238
// GetOrCreateRelease returns the specified release corresponding the provided version,
239239
// or creates a new one if not found.
240240
func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformRelease {
241-
var tag semver.NormalizedString
242-
if version != nil {
243-
tag = version.NormalizedString()
241+
if version == nil {
242+
version = semver.MustParse("")
244243
}
244+
tag := version.NormalizedString()
245245
if release, ok := platform.Releases[tag]; ok {
246246
return release
247247
}
@@ -257,6 +257,13 @@ func (platform *Platform) GetOrCreateRelease(version *semver.Version) *PlatformR
257257
return release
258258
}
259259

260+
// GetManuallyInstalledRelease returns (*PlatformRelease, true) if the Platform has
261+
// a manually installed release or (nil, false) otherwise.
262+
func (platform *Platform) GetManuallyInstalledRelease() (*PlatformRelease, bool) {
263+
res, ok := platform.Releases[semver.MustParse("").NormalizedString()]
264+
return res, ok
265+
}
266+
260267
// FindReleaseWithVersion returns the specified release corresponding the provided version,
261268
// or nil if not found.
262269
func (platform *Platform) FindReleaseWithVersion(version *semver.Version) *PlatformRelease {

internal/arduino/cores/packageindex/index.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,10 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core
265265
outPlatform := outPackage.GetOrCreatePlatform(inPlatformRelease.Architecture)
266266
// If the variable `isInstallJSON` is false it means that the index we're reading is coming from the additional-urls.
267267
// Therefore, the `outPlatform.Indexed` will be set at `true`.
268-
outPlatform.Indexed = outPlatform.Indexed || !isInstallJSON
268+
if !isInstallJSON {
269+
outPlatform.Indexed = true
270+
outPlatform.ManuallyInstalled = false
271+
}
269272

270273
// If the latest platform release is deprecated, then deprecate the whole platform.
271274
if outPlatform.Latest == nil || outPlatform.Latest.LessThan(inPlatformRelease.Version) {

internal/arduino/cores/packagemanager/install_uninstall.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"encoding/json"
2222
"errors"
23+
"fmt"
2324
"runtime"
2425

2526
"github.com/arduino/arduino-cli/commands/cmderrors"
@@ -41,6 +42,7 @@ func (pme *Explorer) DownloadAndInstallPlatformUpgrades(
4142
skipPostInstall bool,
4243
skipPreUninstall bool,
4344
) (*cores.PlatformRelease, error) {
45+
fmt.Println("D")
4446
if platformRef.PlatformVersion != nil {
4547
return nil, &cmderrors.InvalidArgumentError{Message: i18n.Tr("Upgrade doesn't accept parameters with version")}
4648
}
@@ -439,7 +441,7 @@ func (pme *Explorer) IsToolRequired(toolRelease *cores.ToolRelease) bool {
439441
// Search in all installed platforms
440442
for _, targetPackage := range pme.packages {
441443
for _, platform := range targetPackage.Platforms {
442-
if platformRelease := pme.GetInstalledPlatformRelease(platform); platformRelease != nil {
444+
if platformRelease := pme.GetBestInstalledPlatformRelease(platform); platformRelease != nil {
443445
if platformRelease.RequiresToolRelease(toolRelease) {
444446
return true
445447
}

internal/arduino/cores/packagemanager/loader.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,11 @@ func (pm *Builder) loadPlatform(targetPackage *cores.Package, architecture strin
215215
// 2. Inside the sketchbook/hardware/PACKAGER/ARCHITECTURE directory:
216216
// - ARCHITECTURE/boards.txt
217217

218-
version := semver.MustParse("")
219218
platform := targetPackage.GetOrCreatePlatform(architecture)
220-
release := platform.GetOrCreateRelease(version)
219+
if !platform.Indexed {
220+
platform.ManuallyInstalled = true
221+
}
222+
release := platform.GetOrCreateRelease(nil)
221223
if err := pm.loadPlatformRelease(release, platformPath); err != nil {
222224
return fmt.Errorf("%s: %w", i18n.Tr("loading platform release %s", release), err)
223225
}

internal/arduino/cores/packagemanager/package_manager.go

+29-5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package packagemanager
1717

1818
import (
19+
"cmp"
1920
"errors"
2021
"net/url"
2122
"os"
@@ -229,6 +230,17 @@ func (pme *Explorer) GetPackages() cores.Packages {
229230
return pme.packages
230231
}
231232

233+
func (pme *Explorer) AllPackages() []*cores.Package {
234+
packages := make([]*cores.Package, 0, len(pme.packages))
235+
for _, p := range pme.packages {
236+
packages = append(packages, p)
237+
}
238+
slices.SortFunc(packages, func(i, j *cores.Package) int {
239+
return cmp.Compare(i.String(), j.String())
240+
})
241+
return packages
242+
}
243+
232244
// GetCustomGlobalProperties returns the user defined custom global
233245
// properties for installed platforms.
234246
func (pme *Explorer) GetCustomGlobalProperties() *properties.Map {
@@ -260,7 +272,7 @@ func (pme *Explorer) FindBoardsWithVidPid(vid, pid string) []*cores.Board {
260272
res := []*cores.Board{}
261273
for _, targetPackage := range pme.packages {
262274
for _, targetPlatform := range targetPackage.Platforms {
263-
if platform := pme.GetInstalledPlatformRelease(targetPlatform); platform != nil {
275+
if platform := pme.GetBestInstalledPlatformRelease(targetPlatform); platform != nil {
264276
for _, board := range platform.Boards {
265277
if board.HasUsbID(vid, pid) {
266278
res = append(res, board)
@@ -277,7 +289,7 @@ func (pme *Explorer) FindBoardsWithID(id string) []*cores.Board {
277289
res := []*cores.Board{}
278290
for _, targetPackage := range pme.packages {
279291
for _, targetPlatform := range targetPackage.Platforms {
280-
if platform := pme.GetInstalledPlatformRelease(targetPlatform); platform != nil {
292+
if platform := pme.GetBestInstalledPlatformRelease(targetPlatform); platform != nil {
281293
for _, board := range platform.Boards {
282294
if board.BoardID == id {
283295
res = append(res, board)
@@ -336,7 +348,7 @@ func (pme *Explorer) ResolveFQBN(fqbn *fqbn.FQBN) (
336348
return targetPackage, nil, nil, nil, nil,
337349
errors.New(i18n.Tr("unknown platform %s:%s", targetPackage, fqbn.Architecture))
338350
}
339-
boardPlatformRelease := pme.GetInstalledPlatformRelease(platform)
351+
boardPlatformRelease := pme.GetBestInstalledPlatformRelease(platform)
340352
if boardPlatformRelease == nil {
341353
return targetPackage, nil, nil, nil, nil,
342354
errors.New(i18n.Tr("platform %s is not installed", platform))
@@ -467,7 +479,7 @@ func (pme *Explorer) determineReferencedPlatformRelease(boardBuildProperties *pr
467479
return "", nil, "", nil,
468480
errors.New(i18n.Tr("missing platform %[1]s:%[2]s referenced by board %[3]s", referredPackageName, fqbn.Architecture, fqbn))
469481
}
470-
referredPlatformRelease = pme.GetInstalledPlatformRelease(referredPlatform)
482+
referredPlatformRelease = pme.GetBestInstalledPlatformRelease(referredPlatform)
471483
if referredPlatformRelease == nil {
472484
return "", nil, "", nil,
473485
errors.New(i18n.Tr("missing platform release %[1]s:%[2]s referenced by board %[3]s", referredPackageName, fqbn.Architecture, fqbn))
@@ -626,8 +638,20 @@ func (tr *ToolReleaseActions) Get() (*cores.ToolRelease, error) {
626638
return tr.release, nil
627639
}
628640

629-
// GetInstalledPlatformRelease returns the PlatformRelease installed (it is chosen)
641+
// GetInstalledPlatformRelease return the PlatformRelease installed through the package manager
642+
// or nil if the PlatformRelease is not installed. Platforms installed manually are ignored.
630643
func (pme *Explorer) GetInstalledPlatformRelease(platform *cores.Platform) *cores.PlatformRelease {
644+
for _, release := range platform.GetAllInstalled() {
645+
if release.IsInstalled() && pme.IsManagedPlatformRelease(release) {
646+
return release
647+
}
648+
}
649+
return nil
650+
}
651+
652+
// GetBestInstalledPlatformRelease returns the PlatformRelease installed (it is chosen between
653+
// the platform installed through the package manager and the one installed manually)
654+
func (pme *Explorer) GetBestInstalledPlatformRelease(platform *cores.Platform) *cores.PlatformRelease {
631655
releases := platform.GetAllInstalled()
632656
if len(releases) == 0 {
633657
return nil

internal/cli/core/list.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func GetList(ctx context.Context, srv rpc.ArduinoCoreServiceServer, inst *rpc.In
7676

7777
result := []*rpc.PlatformSummary{}
7878
for _, platform := range platforms.GetSearchOutput() {
79-
if platform.GetInstalledVersion() == "" && !platform.GetMetadata().GetManuallyInstalled() {
79+
if platform.GetInstalledVersion() == "" && !platform.GetHasManuallyInstalledRelease() {
8080
continue
8181
}
8282
if updatableOnly && platform.GetInstalledVersion() == platform.GetLatestVersion() {
@@ -117,10 +117,12 @@ func (ir coreListResult) String() string {
117117
t.SetHeader(i18n.Tr("ID"), i18n.Tr("Installed"), i18n.Tr("Latest"), i18n.Tr("Name"))
118118
for _, platform := range ir.Platforms {
119119
latestVersion := platform.LatestVersion.String()
120-
if latestVersion == "" {
121-
latestVersion = "n/a"
120+
if platform.HasManuallyInstalledRelease {
121+
t.AddRow(platform.Id, i18n.Tr("(in sketchbook)"), "", platform.GetPlatformName())
122+
}
123+
if !platform.HasManuallyInstalledRelease || platform.InstalledVersion.String() != "" {
124+
t.AddRow(platform.Id, platform.InstalledVersion, latestVersion, platform.GetPlatformName())
122125
}
123-
t.AddRow(platform.Id, platform.InstalledVersion, latestVersion, platform.GetPlatformName())
124126
}
125127

126128
return t.Render()

internal/cli/feedback/result/rpc.go

+14-12
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,17 @@ func NewPlatformSummary(in *rpc.PlatformSummary) *PlatformSummary {
4040
releases.SortKeys((*semver.Version).CompareTo)
4141

4242
return &PlatformSummary{
43-
Id: in.GetMetadata().GetId(),
44-
Maintainer: in.GetMetadata().GetMaintainer(),
45-
Website: in.GetMetadata().GetWebsite(),
46-
Email: in.GetMetadata().GetEmail(),
47-
ManuallyInstalled: in.GetMetadata().GetManuallyInstalled(),
48-
Deprecated: in.GetMetadata().GetDeprecated(),
49-
Indexed: in.GetMetadata().GetIndexed(),
50-
Releases: releases,
51-
InstalledVersion: semver.MustParse(in.GetInstalledVersion()),
52-
LatestVersion: semver.MustParse(in.GetLatestVersion()),
43+
Id: in.GetMetadata().GetId(),
44+
Maintainer: in.GetMetadata().GetMaintainer(),
45+
Website: in.GetMetadata().GetWebsite(),
46+
Email: in.GetMetadata().GetEmail(),
47+
ManuallyInstalled: in.GetMetadata().GetManuallyInstalled(),
48+
Deprecated: in.GetMetadata().GetDeprecated(),
49+
Indexed: in.GetMetadata().GetIndexed(),
50+
Releases: releases,
51+
InstalledVersion: semver.MustParse(in.GetInstalledVersion()),
52+
LatestVersion: semver.MustParse(in.GetLatestVersion()),
53+
HasManuallyInstalledRelease: in.GetHasManuallyInstalledRelease(),
5354
}
5455
}
5556

@@ -65,8 +66,9 @@ type PlatformSummary struct {
6566

6667
Releases orderedmap.Map[*semver.Version, *PlatformRelease] `json:"releases,omitempty"`
6768

68-
InstalledVersion *semver.Version `json:"installed_version,omitempty"`
69-
LatestVersion *semver.Version `json:"latest_version,omitempty"`
69+
InstalledVersion *semver.Version `json:"installed_version,omitempty"`
70+
LatestVersion *semver.Version `json:"latest_version,omitempty"`
71+
HasManuallyInstalledRelease bool `json:"has_manually_installed_release,omitempty"`
7072
}
7173

7274
// GetLatestRelease returns the latest relase of this platform or nil if none available.

0 commit comments

Comments
 (0)