Skip to content

Commit 95753fc

Browse files
Allow to specify the config file through ARDUINO_CONFIG_FILE env (#2488)
1 parent cdbf2f5 commit 95753fc

File tree

7 files changed

+61
-12
lines changed

7 files changed

+61
-12
lines changed

docs/configuration.md

+1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ The configuration file must be named `arduino-cli`, with the appropriate file ex
127127
Configuration files in the following locations are recognized by Arduino CLI:
128128

129129
1. Location specified by the [`--config-file`][arduino cli command reference] command line flag
130+
1. Location specified by the `ARDUINO_CONFIG_FILE` environment variable
130131
1. Arduino CLI data directory (as configured by `directories.data`)
131132

132133
If multiple configuration files are present, the one highest on the above list is used. Configuration files are not

internal/cli/configuration/configuration.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ func GetDefaultBuiltinLibrariesDir() string {
133133
return filepath.Join(getDefaultArduinoDataDir(), "libraries")
134134
}
135135

136-
// FindConfigFileInArgs returns the config file path using the
137-
// argument '--config-file' (if specified) or looking in the current working dir
138-
func FindConfigFileInArgs(args []string) string {
136+
// FindConfigFileInArgsFallbackOnEnv returns the config file path using the
137+
// argument '--config-file' (if specified), if empty looks for the ARDUINO_CONFIG_FILE env,
138+
// or looking in the current working dir
139+
func FindConfigFileInArgsFallbackOnEnv(args []string) string {
139140
// Look for '--config-file' argument
140141
for i, arg := range args {
141142
if arg == "--config-file" {
@@ -144,5 +145,5 @@ func FindConfigFileInArgs(args []string) string {
144145
}
145146
}
146147
}
147-
return ""
148+
return os.Getenv("ARDUINO_CONFIG_FILE")
148149
}

internal/cli/configuration/configuration_test.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,23 @@ func TestInit(t *testing.T) {
6060
}
6161

6262
func TestFindConfigFile(t *testing.T) {
63-
configFile := FindConfigFileInArgs([]string{"--config-file"})
63+
configFile := FindConfigFileInArgsFallbackOnEnv([]string{"--config-file"})
6464
require.Equal(t, "", configFile)
6565

66-
configFile = FindConfigFileInArgs([]string{"--config-file", "some/path/to/config"})
66+
configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "some/path/to/config"})
6767
require.Equal(t, "some/path/to/config", configFile)
6868

69-
configFile = FindConfigFileInArgs([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"})
69+
configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"})
7070
require.Equal(t, "some/path/to/config/arduino-cli.yaml", configFile)
7171

72-
configFile = FindConfigFileInArgs([]string{})
72+
configFile = FindConfigFileInArgsFallbackOnEnv([]string{})
7373
require.Equal(t, "", configFile)
74+
75+
t.Setenv("ARDUINO_CONFIG_FILE", "some/path/to/config")
76+
configFile = FindConfigFileInArgsFallbackOnEnv([]string{})
77+
require.Equal(t, "some/path/to/config", configFile)
78+
79+
// when both env and flag are specified flag takes precedence
80+
configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "flag/path"})
81+
require.Equal(t, "flag/path", configFile)
7482
}

internal/docsgen/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func main() {
3131

3232
os.MkdirAll(os.Args[1], 0755) // Create the output folder if it doesn't already exist
3333

34-
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgs(os.Args))
34+
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgsFallbackOnEnv(os.Args))
3535
cli := cli.NewCommand()
3636
cli.DisableAutoGenTag = true // Disable addition of auto-generated date stamp
3737
err := doc.GenMarkdownTree(cli, os.Args[1])

internal/integrationtest/config/config_test.go

+39
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
package config_test
1717

1818
import (
19+
"path/filepath"
1920
"testing"
2021

2122
"github.com/arduino/arduino-cli/internal/integrationtest"
23+
"github.com/arduino/go-paths-helper"
2224
"github.com/stretchr/testify/require"
2325
"go.bug.st/testifyjson/requirejson"
2426
"gopkg.in/yaml.v3"
@@ -815,3 +817,40 @@ func TestDelete(t *testing.T) {
815817
require.NotContains(t, configLines, "additional_urls")
816818
require.NotContains(t, configLines, "board_manager")
817819
}
820+
821+
func TestInitializationOrderOfConfigThroughFlagAndEnv(t *testing.T) {
822+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
823+
defer env.CleanUp()
824+
825+
createConfig := func(path *paths.Path, content string) {
826+
f, err := path.Create()
827+
require.NoError(t, err)
828+
_, err = f.WriteString(content)
829+
require.NoError(t, err)
830+
}
831+
tmp := t.TempDir()
832+
cliConfig, envConfig := paths.New(filepath.Join(tmp, "cli.yaml")), paths.New(filepath.Join(tmp, "env.yaml"))
833+
createConfig(cliConfig, `cli-test: "test"`)
834+
createConfig(envConfig, `env-test: "test"`)
835+
836+
// No flag nor env specified.
837+
stdout, _, err := cli.Run("config", "dump", "--format", "json")
838+
require.NoError(t, err)
839+
requirejson.NotEmpty(t, stdout)
840+
841+
// Flag specified
842+
stdout, _, err = cli.Run("config", "dump", "--config-file", cliConfig.String(), "--format", "json")
843+
require.NoError(t, err)
844+
requirejson.Contains(t, stdout, `{"config":{ "cli-test": "test" }}`)
845+
846+
// Env specified
847+
customEnv := map[string]string{"ARDUINO_CONFIG_FILE": envConfig.String()}
848+
stdout, _, err = cli.RunWithCustomEnv(customEnv, "config", "dump", "--format", "json")
849+
require.NoError(t, err)
850+
requirejson.Contains(t, stdout, `{"config":{ "env-test": "test" }}`)
851+
852+
// Flag and env specified, flag takes precedence
853+
stdout, _, err = cli.RunWithCustomEnv(customEnv, "config", "dump", "--config-file", cliConfig.String(), "--format", "json")
854+
require.NoError(t, err)
855+
requirejson.Contains(t, stdout, `{"config":{ "cli-test": "test" }}`)
856+
}

internal/integrationtest/monitor/monitor_grpc_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func TestMonitorGRPCClose(t *testing.T) {
5858
tmpFileMatcher := regexp.MustCompile("Tmpfile: (.*)\n")
5959
{
6060
ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
61-
mon, err := grpcInst.Monitor(ctx, ports[0].Port)
61+
mon, err := grpcInst.Monitor(ctx, ports[0].GetPort())
6262
var tmpFile *paths.Path
6363
for {
6464
monResp, err := mon.Recv()
@@ -85,7 +85,7 @@ func TestMonitorGRPCClose(t *testing.T) {
8585
{
8686
// Keep a timeout to allow the test to exit in any case
8787
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
88-
mon, err := grpcInst.Monitor(ctx, ports[0].Port)
88+
mon, err := grpcInst.Monitor(ctx, ports[0].GetPort())
8989
var tmpFile *paths.Path
9090
for {
9191
monResp, err := mon.Recv()

main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
)
2626

2727
func main() {
28-
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgs(os.Args))
28+
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgsFallbackOnEnv(os.Args))
2929
i18n.Init(configuration.Settings.GetString("locale"))
3030
arduinoCmd := cli.NewCommand()
3131
if err := arduinoCmd.Execute(); err != nil {

0 commit comments

Comments
 (0)