Skip to content

Commit 13f5203

Browse files
authored
Add --all flag to core list command and gRPC interface (#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

+6-5
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

+13-10
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

+3
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

+8-7
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

+15
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

+4-1
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

+23-23
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)