Skip to content

Commit 7d00b5b

Browse files
authored
fix regression: setting 3rd party URL via ARDUINO_BOARD_MANAGER_ADDITIONAL_URLS env var (#2645)
1 parent 55753bd commit 7d00b5b

File tree

3 files changed

+68
-2
lines changed

3 files changed

+68
-2
lines changed

internal/cli/configuration/defaults.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func InjectEnvVars(settings *Settings) {
8484
// Bind env aliases to keep backward compatibility
8585
setIfEnvExists := func(key, env string) {
8686
if v, ok := os.LookupEnv(env); ok {
87-
settings.SetFromCLIArgs(key, v)
87+
settings.SetFromENV(key, v)
8888
}
8989
}
9090
setIfEnvExists("library.enable_unsafe_install", "ARDUINO_ENABLE_UNSAFE_LIBRARY_INSTALL")

internal/go-configmap/cli.go

+38-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,43 @@ import (
2121
"strings"
2222
)
2323

24+
func (c *Map) SetFromENV(key string, arg string) error {
25+
// in case of schemaless configuration, we don't know the type of the setting
26+
// we will save it as a string
27+
if len(c.schema) == 0 {
28+
c.Set(key, arg)
29+
return nil
30+
}
31+
32+
// Find the correct type for the given setting
33+
valueType, ok := c.schema[key]
34+
if !ok {
35+
return fmt.Errorf("key not found: %s", key)
36+
}
37+
38+
var value any
39+
{
40+
var conversionError error
41+
switch valueType.String() {
42+
case "uint":
43+
value, conversionError = strconv.Atoi(arg)
44+
case "bool":
45+
value, conversionError = strconv.ParseBool(arg)
46+
case "string":
47+
value = arg
48+
case "[]string":
49+
value = strings.Split(arg, " ")
50+
default:
51+
return fmt.Errorf("unhandled type: %s", valueType)
52+
}
53+
if conversionError != nil {
54+
return fmt.Errorf("error setting value: %v", conversionError)
55+
}
56+
}
57+
58+
return c.Set(key, value)
59+
}
60+
2461
func (c *Map) SetFromCLIArgs(key string, args ...string) error {
2562
if len(args) == 0 {
2663
c.Delete(key)
@@ -101,7 +138,7 @@ func (c *Map) InjectEnvVars(env []string, prefix string) []error {
101138
}
102139

103140
// Update the configuration value
104-
if err := c.SetFromCLIArgs(key, envValue); err != nil {
141+
if err := c.SetFromENV(key, envValue); err != nil {
105142
errs = append(errs, err)
106143
}
107144
}

internal/integrationtest/config/config_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -902,3 +902,32 @@ build.unk: 123
902902
require.NoError(t, err)
903903
require.Equal(t, "en", strings.TrimSpace(string(out)))
904904
}
905+
906+
func TestConfigViaEnvVars(t *testing.T) {
907+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
908+
defer env.CleanUp()
909+
910+
// array of strings
911+
out, _, err := cli.RunWithCustomEnv(
912+
map[string]string{"ARDUINO_BOARD_MANAGER_ADDITIONAL_URLS": "https://espressif.github.io/arduino-esp32/package_esp32_index.json https://arduino.esp8266.com/stable/package_esp8266com_index.json"},
913+
"config", "get", "board_manager.additional_urls",
914+
)
915+
require.NoError(t, err)
916+
require.Equal(t, "- https://espressif.github.io/arduino-esp32/package_esp32_index.json\n- https://arduino.esp8266.com/stable/package_esp8266com_index.json\n\n", string(out))
917+
918+
// boolean
919+
out, _, err = cli.RunWithCustomEnv(
920+
map[string]string{"ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL": "True"},
921+
"config", "get", "library.enable_unsafe_install",
922+
)
923+
require.NoError(t, err)
924+
require.Equal(t, "true\n\n", string(out))
925+
926+
// integer
927+
out, _, err = cli.RunWithCustomEnv(
928+
map[string]string{"ARDUINO_BUILD_CACHE_COMPILATIONS_BEFORE_PURGE": "20"},
929+
"config", "get", "build_cache.compilations_before_purge",
930+
)
931+
require.NoError(t, err)
932+
require.Equal(t, "20\n\n", string(out))
933+
}

0 commit comments

Comments
 (0)