Skip to content

Commit 926251b

Browse files
committed
Autogenerated upload tool properties are searched in sub-configs too
Fix arduino#1444
1 parent 56cb82c commit 926251b

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

arduino/cores/packagemanager/loader.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,19 @@ func convertUploadToolsToPluggableDiscovery(props *properties.Map) {
579579
action += ".tool"
580580
defaultAction := action + ".default"
581581
if !props.ContainsKey(defaultAction) {
582+
// Search for "menu.MENU-ID.MENU-ITEM.ACTION.tool" (some platforms sets ACTION.tool on
583+
// submenu config entries). See https://github.com/arduino/arduino-cli/issues/1444
584+
for key, value := range props.AsMap() {
585+
if !strings.HasPrefix(key, "menu.") {
586+
continue
587+
}
588+
split := strings.Split(key, ".")
589+
if len(split) != 5 || split[3]+"."+split[4] != action {
590+
continue
591+
}
592+
prefix := split[0] + "." + split[1] + "." + split[2]
593+
propsToAdd.Set(prefix+"."+defaultAction, value)
594+
}
582595
tool, found := props.GetOk(action)
583596
if !found {
584597
// Just skip it, ideally this must never happen but if a platform

arduino/cores/packagemanager/loader_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,71 @@ program.extra_params=-P{serial.port}
254254

255255
require.Equal(t, expectedProps.AsMap(), props.AsMap())
256256
}
257+
258+
func TestConvertUploadToolsToPluggableDiscoveryWithMenus(t *testing.T) {
259+
props, err := properties.LoadFromBytes([]byte(`
260+
name=Nucleo-64
261+
262+
build.core=arduino
263+
build.board=Nucleo_64
264+
build.variant_h=variant_{build.board}.h
265+
build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
266+
267+
# Upload menu
268+
menu.upload_method.MassStorage=Mass Storage
269+
menu.upload_method.MassStorage.upload.protocol=
270+
menu.upload_method.MassStorage.upload.tool=massStorageCopy
271+
272+
menu.upload_method.swdMethod=STM32CubeProgrammer (SWD)
273+
menu.upload_method.swdMethod.upload.protocol=0
274+
menu.upload_method.swdMethod.upload.options=-g
275+
menu.upload_method.swdMethod.upload.tool=stm32CubeProg
276+
277+
menu.upload_method.serialMethod=STM32CubeProgrammer (Serial)
278+
menu.upload_method.serialMethod.upload.protocol=1
279+
menu.upload_method.serialMethod.upload.options={serial.port.file} -s
280+
menu.upload_method.serialMethod.upload.tool=stm32CubeProg
281+
282+
menu.upload_method.dfuMethod=STM32CubeProgrammer (DFU)
283+
menu.upload_method.dfuMethod.upload.protocol=2
284+
menu.upload_method.dfuMethod.upload.options=-g
285+
menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
286+
`))
287+
require.NoError(t, err)
288+
convertUploadToolsToPluggableDiscovery(props)
289+
290+
expectedProps, err := properties.LoadFromBytes([]byte(`
291+
name=Nucleo-64
292+
293+
build.core=arduino
294+
build.board=Nucleo_64
295+
build.variant_h=variant_{build.board}.h
296+
build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
297+
298+
# Upload menu
299+
menu.upload_method.MassStorage=Mass Storage
300+
menu.upload_method.MassStorage.upload.protocol=
301+
menu.upload_method.MassStorage.upload.tool=massStorageCopy
302+
menu.upload_method.MassStorage.upload.tool.default=massStorageCopy
303+
304+
menu.upload_method.swdMethod=STM32CubeProgrammer (SWD)
305+
menu.upload_method.swdMethod.upload.protocol=0
306+
menu.upload_method.swdMethod.upload.options=-g
307+
menu.upload_method.swdMethod.upload.tool=stm32CubeProg
308+
menu.upload_method.swdMethod.upload.tool.default=stm32CubeProg
309+
310+
menu.upload_method.serialMethod=STM32CubeProgrammer (Serial)
311+
menu.upload_method.serialMethod.upload.protocol=1
312+
menu.upload_method.serialMethod.upload.options={serial.port.file} -s
313+
menu.upload_method.serialMethod.upload.tool=stm32CubeProg
314+
menu.upload_method.serialMethod.upload.tool.default=stm32CubeProg
315+
316+
menu.upload_method.dfuMethod=STM32CubeProgrammer (DFU)
317+
menu.upload_method.dfuMethod.upload.protocol=2
318+
menu.upload_method.dfuMethod.upload.options=-g
319+
menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
320+
menu.upload_method.dfuMethod.upload.tool.default=stm32CubeProg
321+
`))
322+
require.NoError(t, err)
323+
require.Equal(t, expectedProps.AsMap(), props.AsMap())
324+
}

0 commit comments

Comments
 (0)