Skip to content

Commit a353f86

Browse files
authored
Added global --config-dir flag (arduino#2677)
* Added --config-dir global flag * Renamed function to better reflect his behaviour * Added test
1 parent faa6359 commit a353f86

File tree

4 files changed

+51
-15
lines changed

4 files changed

+51
-15
lines changed

internal/cli/cli.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,12 @@ func NewCommand(srv rpc.ArduinoCoreServiceServer) *cobra.Command {
181181
cmd.PersistentFlags().StringSliceVar(&additionalUrls, "additional-urls", defaultAdditionalURLs, i18n.Tr("Comma-separated list of additional URLs for the Boards Manager."))
182182
cmd.PersistentFlags().BoolVar(&noColor, "no-color", defaultOutputNoColor, "Disable colored output.")
183183

184-
// We are not using cobra to parse this flag, because we manually parse it in main.go.
185-
// Just leaving it here so cobra will not complain about it.
186-
cmd.PersistentFlags().String("config-file", "", i18n.Tr("The custom config file (if not specified the default will be used)."))
184+
// We are not using cobra to parse the following flags, because we manually parse them in main.go.
185+
// Just leaving it here so cobra will output help usage and not complain about them.
186+
cmd.PersistentFlags().String("config-file", "",
187+
i18n.Tr("The custom config file (if not specified the default will be used)."))
188+
cmd.PersistentFlags().String("config-dir", "",
189+
i18n.Tr("Sets the default data directory (Arduino CLI will look for configuration file in this directory)."))
187190
return cmd
188191
}
189192

internal/cli/configuration/configuration.go

+26-2
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
package configuration
1717

1818
import (
19+
"fmt"
1920
"os"
2021
"path/filepath"
2122
"runtime"
2223

2324
"github.com/arduino/arduino-cli/internal/cli/feedback"
2425
"github.com/arduino/arduino-cli/internal/go-configmap"
2526
"github.com/arduino/arduino-cli/internal/i18n"
27+
"github.com/arduino/go-paths-helper"
2628
"github.com/arduino/go-win32-utils"
2729
)
2830

@@ -42,8 +44,15 @@ func NewSettings() *Settings {
4244
return res
4345
}
4446

47+
var userProvidedDefaultDataDir *string
48+
4549
// getDefaultArduinoDataDir returns the full path to the default arduino folder
4650
func getDefaultArduinoDataDir() string {
51+
// This is overridden by --config-dir flag
52+
if userProvidedDefaultDataDir != nil {
53+
return *userProvidedDefaultDataDir
54+
}
55+
4756
userHomeDir, err := os.UserHomeDir()
4857
if err != nil {
4958
feedback.Warning(i18n.Tr("Unable to get user home dir: %v", err))
@@ -92,10 +101,25 @@ func getDefaultUserDir() string {
92101
}
93102
}
94103

95-
// FindConfigFileInArgsFallbackOnEnv returns the config file path using the
104+
// FindConfigFlagsInArgsOrFallbackOnEnv returns the config file path using the
96105
// argument '--config-file' (if specified), if empty looks for the ARDUINO_CONFIG_FILE env,
97106
// or looking in the current working dir
98-
func FindConfigFileInArgsFallbackOnEnv(args []string) string {
107+
func FindConfigFlagsInArgsOrFallbackOnEnv(args []string) string {
108+
// Look for '--config-dir' argument
109+
for i, arg := range args {
110+
if arg == "--config-dir" {
111+
if len(args) > i+1 {
112+
absArgs, err := paths.New(args[i+1]).Abs()
113+
if err != nil {
114+
feedback.FatalError(fmt.Errorf("invalid --config-dir value: %w", err), feedback.ErrBadArgument)
115+
}
116+
configDir := absArgs.String()
117+
userProvidedDefaultDataDir = &configDir
118+
break
119+
}
120+
}
121+
}
122+
99123
// Look for '--config-file' argument
100124
for i, arg := range args {
101125
if arg == "--config-file" {

internal/cli/configuration/configuration_test.go

+15-6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"path/filepath"
2020
"testing"
2121

22+
"github.com/arduino/go-paths-helper"
2223
"github.com/stretchr/testify/require"
2324
)
2425

@@ -43,23 +44,31 @@ func TestInit(t *testing.T) {
4344

4445
func TestFindConfigFile(t *testing.T) {
4546
defaultConfigFile := filepath.Join(getDefaultArduinoDataDir(), "arduino-cli.yaml")
46-
configFile := FindConfigFileInArgsFallbackOnEnv([]string{"--config-file"})
47+
configFile := FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file"})
4748
require.Equal(t, defaultConfigFile, configFile)
4849

49-
configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "some/path/to/config"})
50+
configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file", "some/path/to/config"})
5051
require.Equal(t, "some/path/to/config", configFile)
5152

52-
configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"})
53+
configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"})
5354
require.Equal(t, "some/path/to/config/arduino-cli.yaml", configFile)
5455

55-
configFile = FindConfigFileInArgsFallbackOnEnv([]string{})
56+
configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{})
5657
require.Equal(t, defaultConfigFile, configFile)
5758

5859
t.Setenv("ARDUINO_CONFIG_FILE", "some/path/to/config")
59-
configFile = FindConfigFileInArgsFallbackOnEnv([]string{})
60+
configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{})
6061
require.Equal(t, "some/path/to/config", configFile)
6162

6263
// when both env and flag are specified flag takes precedence
63-
configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "flag/path"})
64+
configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file", "flag/path"})
6465
require.Equal(t, "flag/path", configFile)
6566
}
67+
68+
func TestFindConfigDir(t *testing.T) {
69+
// Check behaviour with --config-dir
70+
expected, err := paths.New("anotherpath", "arduino-cli.yaml").Abs()
71+
require.NoError(t, err)
72+
configFile := FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-dir", "anotherpath"})
73+
require.Equal(t, expected.String(), configFile)
74+
}

main.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ func main() {
3737
// Disable logging until it is setup in the arduino-cli pre-run
3838
logrus.SetOutput(io.Discard)
3939

40-
// Create a new ArduinoCoreServer
41-
srv := commands.NewArduinoCoreServer()
42-
4340
// Search for the configuration file in the command line arguments and in the environment
44-
configFile := configuration.FindConfigFileInArgsFallbackOnEnv(os.Args)
41+
configFile := configuration.FindConfigFlagsInArgsOrFallbackOnEnv(os.Args)
4542
ctx := config.SetConfigFile(context.Background(), configFile)
4643

44+
// Create a new ArduinoCoreServer
45+
srv := commands.NewArduinoCoreServer()
46+
4747
// Read the settings from the configuration file
4848
openReq := &rpc.ConfigurationOpenRequest{SettingsFormat: "yaml"}
4949
var configFileLoadingWarnings []string

0 commit comments

Comments
 (0)