Skip to content

Commit 13f5203

Browse files
authored
Add --all flag to core list command and gRPC interface (arduino#1166)
Setting that flags return all installed and installable platforms, including installed manually by the user in their Sketchbook hardware folder.
1 parent 560025a commit 13f5203

File tree

12 files changed

+371
-81
lines changed

12 files changed

+371
-81
lines changed

arduino/cores/cores.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@ import (
2828

2929
// Platform represents a platform package.
3030
type Platform struct {
31-
Architecture string // The name of the architecture of this package.
32-
Name string
33-
Category string
34-
Releases map[string]*PlatformRelease // The Releases of this platform, labeled by version.
35-
Package *Package `json:"-"`
31+
Architecture string // The name of the architecture of this package.
32+
Name string
33+
Category string
34+
Releases map[string]*PlatformRelease // The Releases of this platform, labeled by version.
35+
Package *Package `json:"-"`
36+
ManuallyInstalled bool // true if the Platform has been installed without the CLI
3637
}
3738

3839
// PlatformReleaseHelp represents the help URL for this Platform release

arduino/cores/packagemanager/loader.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,18 +166,15 @@ func (pm *PackageManager) loadPlatforms(targetPackage *cores.Package, packageDir
166166
return fmt.Errorf("looking for boards.txt in %s: %s", possibleBoardTxtPath, err)
167167

168168
} else if exist {
169-
170-
// case: ARCHITECTURE/boards.txt
171-
// this is the general case for unversioned Platform
172-
version := semver.MustParse("")
173-
174-
// FIXME: this check is duplicated, find a better way to handle this
175-
if exist, err := platformPath.Join("boards.txt").ExistCheck(); err != nil {
176-
return fmt.Errorf("opening boards.txt: %s", err)
177-
} else if !exist {
178-
continue
169+
platformTxtPath := platformPath.Join("platform.txt")
170+
platformProperties, err := properties.SafeLoad(platformTxtPath.String())
171+
if err != nil {
172+
return fmt.Errorf("loading platform.txt: %w", err)
179173
}
180174

175+
platformName := platformProperties.Get("name")
176+
version := semver.MustParse(platformProperties.Get("version"))
177+
181178
// check if package_bundled_index.json exists
182179
isIDEBundled := false
183180
packageBundledIndexPath := packageDir.Parent().Join("package_index_bundled.json")
@@ -210,6 +207,12 @@ func (pm *PackageManager) loadPlatforms(targetPackage *cores.Package, packageDir
210207
}
211208

212209
platform := targetPackage.GetOrCreatePlatform(architecture)
210+
if platform.Name == "" {
211+
platform.Name = platformName
212+
}
213+
if !isIDEBundled {
214+
platform.ManuallyInstalled = true
215+
}
213216
release := platform.GetOrCreateRelease(version)
214217
release.IsIDEBundled = isIDEBundled
215218
if isIDEBundled {

cli/core/list.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,13 @@ func initListCommand() *cobra.Command {
3939
Run: runListCommand,
4040
}
4141
listCommand.Flags().BoolVar(&listFlags.updatableOnly, "updatable", false, "List updatable platforms.")
42+
listCommand.Flags().BoolVar(&listFlags.all, "all", false, "If set return all installable and installed cores, including manually installed.")
4243
return listCommand
4344
}
4445

4546
var listFlags struct {
4647
updatableOnly bool
48+
all bool
4749
}
4850

4951
func runListCommand(cmd *cobra.Command, args []string) {
@@ -58,6 +60,7 @@ func runListCommand(cmd *cobra.Command, args []string) {
5860
platforms, err := core.GetPlatforms(&rpc.PlatformListReq{
5961
Instance: inst,
6062
UpdatableOnly: listFlags.updatableOnly,
63+
All: listFlags.all,
6164
})
6265
if err != nil {
6366
feedback.Errorf("Error listing platforms: %v", err)

commands/core.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ func PlatformReleaseToRPC(platformRelease *cores.PlatformRelease) *rpc.Platform
5151
}
5252

5353
result := &rpc.Platform{
54-
ID: platformRelease.Platform.String(),
55-
Name: platformRelease.Platform.Name,
56-
Maintainer: platformRelease.Platform.Package.Maintainer,
57-
Website: platformRelease.Platform.Package.WebsiteURL,
58-
Email: platformRelease.Platform.Package.Email,
59-
Boards: boards,
60-
Latest: platformRelease.Version.String(),
54+
ID: platformRelease.Platform.String(),
55+
Name: platformRelease.Platform.Name,
56+
Maintainer: platformRelease.Platform.Package.Maintainer,
57+
Website: platformRelease.Platform.Package.WebsiteURL,
58+
Email: platformRelease.Platform.Package.Email,
59+
Boards: boards,
60+
Latest: platformRelease.Version.String(),
61+
ManuallyInstalled: platformRelease.Platform.ManuallyInstalled,
6162
}
6263

6364
return result

commands/core/list.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,21 @@ func GetPlatforms(req *rpc.PlatformListReq) ([]*rpc.Platform, error) {
3939
for _, targetPackage := range packageManager.Packages {
4040
for _, platform := range targetPackage.Platforms {
4141
platformRelease := packageManager.GetInstalledPlatformRelease(platform)
42+
43+
// If both All and UpdatableOnly are set All takes precedence
44+
if req.All {
45+
installedVersion := ""
46+
if platformRelease == nil {
47+
platformRelease = platform.GetLatestRelease()
48+
} else {
49+
installedVersion = platformRelease.Version.String()
50+
}
51+
rpcPlatform := commands.PlatformReleaseToRPC(platform.GetLatestRelease())
52+
rpcPlatform.Installed = installedVersion
53+
res = append(res, rpcPlatform)
54+
continue
55+
}
56+
4257
if platformRelease != nil {
4358
if req.UpdatableOnly {
4459
if latest := platform.GetLatestRelease(); latest == nil || latest == platformRelease {

commands/core/search.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ func PlatformSearch(req *rpc.PlatformSearchReq) (*rpc.PlatformSearchResp, error)
5050
for _, targetPackage := range pm.Packages {
5151
for _, platform := range targetPackage.Platforms {
5252
// discard invalid platforms
53-
if platform == nil || platform.Name == "" {
53+
// Users can install platforms manually in the Sketchbook hardware folder,
54+
// the core search command must operate only on platforms installed through
55+
// the PlatformManager, thus we skip the manually installed ones.
56+
if platform == nil || platform.Name == "" || platform.ManuallyInstalled {
5457
continue
5558
}
5659

legacy/builder/test/hardware_loader_test.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,24 @@ func TestLoadHardware(t *testing.T) {
4949
require.NotNil(t, packages["arduino"])
5050
require.Equal(t, 2, len(packages["arduino"].Platforms))
5151

52-
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases[""].Boards["uno"].BoardID)
53-
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases[""].Boards["uno"].Properties.Get("_id"))
52+
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["uno"].BoardID)
53+
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["uno"].Properties.Get("_id"))
5454

55-
require.Equal(t, "yun", packages["arduino"].Platforms["avr"].Releases[""].Boards["yun"].BoardID)
56-
require.Equal(t, "true", packages["arduino"].Platforms["avr"].Releases[""].Boards["yun"].Properties.Get("upload.wait_for_upload_port"))
55+
require.Equal(t, "yun", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["yun"].BoardID)
56+
require.Equal(t, "true", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["yun"].Properties.Get("upload.wait_for_upload_port"))
5757

58-
require.Equal(t, "{build.usb_flags}", packages["arduino"].Platforms["avr"].Releases[""].Boards["robotMotor"].Properties.Get("build.extra_flags"))
58+
require.Equal(t, "{build.usb_flags}", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["robotMotor"].Properties.Get("build.extra_flags"))
5959

60-
require.Equal(t, "arduino_due_x", packages["arduino"].Platforms["sam"].Releases[""].Boards["arduino_due_x"].BoardID)
60+
require.Equal(t, "arduino_due_x", packages["arduino"].Platforms["sam"].Releases["1.6.7"].Boards["arduino_due_x"].BoardID)
6161

62-
require.Equal(t, "ATmega123", packages["arduino"].Platforms["avr"].Releases[""].Boards["diecimila"].Properties.Get("menu.cpu.atmega123"))
62+
require.Equal(t, "ATmega123", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["diecimila"].Properties.Get("menu.cpu.atmega123"))
6363

6464
avrPlatform := packages["arduino"].Platforms["avr"]
65-
require.Equal(t, "Arduino AVR Boards", avrPlatform.Releases[""].Properties.Get("name"))
66-
require.Equal(t, "-v", avrPlatform.Releases[""].Properties.Get("tools.avrdude.bootloader.params.verbose"))
67-
require.Equal(t, "/my/personal/avrdude", avrPlatform.Releases[""].Properties.Get("tools.avrdude.cmd.path"))
65+
require.Equal(t, "Arduino AVR Boards", avrPlatform.Releases["1.6.10"].Properties.Get("name"))
66+
require.Equal(t, "-v", avrPlatform.Releases["1.6.10"].Properties.Get("tools.avrdude.bootloader.params.verbose"))
67+
require.Equal(t, "/my/personal/avrdude", avrPlatform.Releases["1.6.10"].Properties.Get("tools.avrdude.cmd.path"))
6868

69-
require.Equal(t, "AVRISP mkII", avrPlatform.Releases[""].Programmers["avrispmkii"].Name)
69+
require.Equal(t, "AVRISP mkII", avrPlatform.Releases["1.6.10"].Programmers["avrispmkii"].Name)
7070

7171
//require.Equal(t, "{runtime.tools.ctags.path}", packages.Properties.Get("tools.ctags.path"])
7272
//require.Equal(t, "\"{cmd.path}\" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives \"{source_file}\"", packages.Properties.Get("tools.ctags.pattern"])
@@ -103,17 +103,17 @@ func TestLoadHardwareMixingUserHardwareFolder(t *testing.T) {
103103
require.NotNil(t, packages["arduino"])
104104
require.Equal(t, 2, len(packages["arduino"].Platforms))
105105

106-
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases[""].Boards["uno"].BoardID)
107-
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases[""].Boards["uno"].Properties.Get("_id"))
106+
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["uno"].BoardID)
107+
require.Equal(t, "uno", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["uno"].Properties.Get("_id"))
108108

109-
require.Equal(t, "yun", packages["arduino"].Platforms["avr"].Releases[""].Boards["yun"].BoardID)
110-
require.Equal(t, "true", packages["arduino"].Platforms["avr"].Releases[""].Boards["yun"].Properties.Get("upload.wait_for_upload_port"))
109+
require.Equal(t, "yun", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["yun"].BoardID)
110+
require.Equal(t, "true", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["yun"].Properties.Get("upload.wait_for_upload_port"))
111111

112-
require.Equal(t, "{build.usb_flags}", packages["arduino"].Platforms["avr"].Releases[""].Boards["robotMotor"].Properties.Get("build.extra_flags"))
112+
require.Equal(t, "{build.usb_flags}", packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards["robotMotor"].Properties.Get("build.extra_flags"))
113113

114-
require.Equal(t, "arduino_due_x", packages["arduino"].Platforms["sam"].Releases[""].Boards["arduino_due_x"].BoardID)
114+
require.Equal(t, "arduino_due_x", packages["arduino"].Platforms["sam"].Releases["1.6.7"].Boards["arduino_due_x"].BoardID)
115115

116-
avrPlatform := packages["arduino"].Platforms["avr"].Releases[""]
116+
avrPlatform := packages["arduino"].Platforms["avr"].Releases["1.6.10"]
117117
require.Equal(t, "Arduino AVR Boards", avrPlatform.Properties.Get("name"))
118118
require.Equal(t, "-v", avrPlatform.Properties.Get("tools.avrdude.bootloader.params.verbose"))
119119
require.Equal(t, "/my/personal/avrdude", avrPlatform.Properties.Get("tools.avrdude.cmd.path"))
@@ -128,7 +128,7 @@ func TestLoadHardwareMixingUserHardwareFolder(t *testing.T) {
128128
require.NotNil(t, packages["my_avr_platform"])
129129
myAVRPlatform := packages["my_avr_platform"]
130130
//require.Equal(t, "hello world", myAVRPlatform.Properties.Get("example"))
131-
myAVRPlatformAvrArch := myAVRPlatform.Platforms["avr"].Releases[""]
131+
myAVRPlatformAvrArch := myAVRPlatform.Platforms["avr"].Releases["9.9.9"]
132132
require.Equal(t, "custom_yun", myAVRPlatformAvrArch.Boards["custom_yun"].BoardID)
133133

134134
require.False(t, myAVRPlatformAvrArch.Properties.ContainsKey("preproc.includes.flags"))
@@ -219,15 +219,15 @@ func TestLoadLotsOfHardware(t *testing.T) {
219219
require.NotNil(t, packages["my_avr_platform"])
220220

221221
require.Equal(t, 3, len(packages["arduino"].Platforms))
222-
require.Equal(t, 20, len(packages["arduino"].Platforms["avr"].Releases[""].Boards))
223-
require.Equal(t, 2, len(packages["arduino"].Platforms["sam"].Releases[""].Boards))
222+
require.Equal(t, 20, len(packages["arduino"].Platforms["avr"].Releases["1.6.10"].Boards))
223+
require.Equal(t, 2, len(packages["arduino"].Platforms["sam"].Releases["1.6.7"].Boards))
224224
require.Equal(t, 3, len(packages["arduino"].Platforms["samd"].Releases["1.6.5"].Boards))
225225

226226
require.Equal(t, 1, len(packages["my_avr_platform"].Platforms))
227-
require.Equal(t, 2, len(packages["my_avr_platform"].Platforms["avr"].Releases[""].Boards))
227+
require.Equal(t, 2, len(packages["my_avr_platform"].Platforms["avr"].Releases["9.9.9"].Boards))
228228

229229
if runtime.GOOS != "windows" {
230230
require.Equal(t, 1, len(packages["my_symlinked_avr_platform"].Platforms))
231-
require.Equal(t, 2, len(packages["my_symlinked_avr_platform"].Platforms["avr"].Releases[""].Boards))
231+
require.Equal(t, 2, len(packages["my_symlinked_avr_platform"].Platforms["avr"].Releases["9.9.9"].Boards))
232232
}
233233
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy