From ab9d2f0eab36fd821b62e8ae2e48e3a7e757e509 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 30 Jul 2024 20:31:18 +0200 Subject: [PATCH 1/3] Added --config-dir global flag --- internal/cli/cli.go | 9 +++++--- internal/cli/configuration/configuration.go | 24 +++++++++++++++++++++ main.go | 6 +++--- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/internal/cli/cli.go b/internal/cli/cli.go index 91651b03c23..0bc445b3632 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -181,9 +181,12 @@ func NewCommand(srv rpc.ArduinoCoreServiceServer) *cobra.Command { cmd.PersistentFlags().StringSliceVar(&additionalUrls, "additional-urls", defaultAdditionalURLs, i18n.Tr("Comma-separated list of additional URLs for the Boards Manager.")) cmd.PersistentFlags().BoolVar(&noColor, "no-color", defaultOutputNoColor, "Disable colored output.") - // We are not using cobra to parse this flag, because we manually parse it in main.go. - // Just leaving it here so cobra will not complain about it. - cmd.PersistentFlags().String("config-file", "", i18n.Tr("The custom config file (if not specified the default will be used).")) + // We are not using cobra to parse the following flags, because we manually parse them in main.go. + // Just leaving it here so cobra will output help usage and not complain about them. + cmd.PersistentFlags().String("config-file", "", + i18n.Tr("The custom config file (if not specified the default will be used).")) + cmd.PersistentFlags().String("config-dir", "", + i18n.Tr("Sets the default data directory (Arduino CLI will look for configuration file in this directory).")) return cmd } diff --git a/internal/cli/configuration/configuration.go b/internal/cli/configuration/configuration.go index 8ceef039af6..6827952e950 100644 --- a/internal/cli/configuration/configuration.go +++ b/internal/cli/configuration/configuration.go @@ -16,6 +16,7 @@ package configuration import ( + "fmt" "os" "path/filepath" "runtime" @@ -23,6 +24,7 @@ import ( "github.com/arduino/arduino-cli/internal/cli/feedback" "github.com/arduino/arduino-cli/internal/go-configmap" "github.com/arduino/arduino-cli/internal/i18n" + "github.com/arduino/go-paths-helper" "github.com/arduino/go-win32-utils" ) @@ -42,8 +44,15 @@ func NewSettings() *Settings { return res } +var userProvidedDefaultDataDir *string + // getDefaultArduinoDataDir returns the full path to the default arduino folder func getDefaultArduinoDataDir() string { + // This is overridden by --config-dir flag + if userProvidedDefaultDataDir != nil { + return *userProvidedDefaultDataDir + } + userHomeDir, err := os.UserHomeDir() if err != nil { feedback.Warning(i18n.Tr("Unable to get user home dir: %v", err)) @@ -96,6 +105,21 @@ func getDefaultUserDir() string { // argument '--config-file' (if specified), if empty looks for the ARDUINO_CONFIG_FILE env, // or looking in the current working dir func FindConfigFileInArgsFallbackOnEnv(args []string) string { + // Look for '--config-dir' argument + for i, arg := range args { + if arg == "--config-dir" { + if len(args) > i+1 { + absArgs, err := paths.New(args[i+1]).Abs() + if err != nil { + feedback.FatalError(fmt.Errorf("invalid --config-dir value: %w", err), feedback.ErrBadArgument) + } + configDir := absArgs.String() + userProvidedDefaultDataDir = &configDir + break + } + } + } + // Look for '--config-file' argument for i, arg := range args { if arg == "--config-file" { diff --git a/main.go b/main.go index 3bf2fdd77be..a7a8432df8d 100644 --- a/main.go +++ b/main.go @@ -37,13 +37,13 @@ func main() { // Disable logging until it is setup in the arduino-cli pre-run logrus.SetOutput(io.Discard) - // Create a new ArduinoCoreServer - srv := commands.NewArduinoCoreServer() - // Search for the configuration file in the command line arguments and in the environment configFile := configuration.FindConfigFileInArgsFallbackOnEnv(os.Args) ctx := config.SetConfigFile(context.Background(), configFile) + // Create a new ArduinoCoreServer + srv := commands.NewArduinoCoreServer() + // Read the settings from the configuration file openReq := &rpc.ConfigurationOpenRequest{SettingsFormat: "yaml"} var configFileLoadingWarnings []string From d72a2c2eb303c79c8f0a1ec7225d64b2929a9f2c Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 30 Jul 2024 20:32:08 +0200 Subject: [PATCH 2/3] Renamed function to better reflect his behaviour --- internal/cli/configuration/configuration.go | 4 ++-- internal/cli/configuration/configuration_test.go | 12 ++++++------ main.go | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/cli/configuration/configuration.go b/internal/cli/configuration/configuration.go index 6827952e950..c567955382a 100644 --- a/internal/cli/configuration/configuration.go +++ b/internal/cli/configuration/configuration.go @@ -101,10 +101,10 @@ func getDefaultUserDir() string { } } -// FindConfigFileInArgsFallbackOnEnv returns the config file path using the +// FindConfigFlagsInArgsOrFallbackOnEnv returns the config file path using the // argument '--config-file' (if specified), if empty looks for the ARDUINO_CONFIG_FILE env, // or looking in the current working dir -func FindConfigFileInArgsFallbackOnEnv(args []string) string { +func FindConfigFlagsInArgsOrFallbackOnEnv(args []string) string { // Look for '--config-dir' argument for i, arg := range args { if arg == "--config-dir" { diff --git a/internal/cli/configuration/configuration_test.go b/internal/cli/configuration/configuration_test.go index 23af3a964e1..7f15f3cdf59 100644 --- a/internal/cli/configuration/configuration_test.go +++ b/internal/cli/configuration/configuration_test.go @@ -43,23 +43,23 @@ func TestInit(t *testing.T) { func TestFindConfigFile(t *testing.T) { defaultConfigFile := filepath.Join(getDefaultArduinoDataDir(), "arduino-cli.yaml") - configFile := FindConfigFileInArgsFallbackOnEnv([]string{"--config-file"}) + configFile := FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file"}) require.Equal(t, defaultConfigFile, configFile) - configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "some/path/to/config"}) + configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file", "some/path/to/config"}) require.Equal(t, "some/path/to/config", configFile) - configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"}) + configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"}) require.Equal(t, "some/path/to/config/arduino-cli.yaml", configFile) - configFile = FindConfigFileInArgsFallbackOnEnv([]string{}) + configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{}) require.Equal(t, defaultConfigFile, configFile) t.Setenv("ARDUINO_CONFIG_FILE", "some/path/to/config") - configFile = FindConfigFileInArgsFallbackOnEnv([]string{}) + configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{}) require.Equal(t, "some/path/to/config", configFile) // when both env and flag are specified flag takes precedence - configFile = FindConfigFileInArgsFallbackOnEnv([]string{"--config-file", "flag/path"}) + configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file", "flag/path"}) require.Equal(t, "flag/path", configFile) } diff --git a/main.go b/main.go index a7a8432df8d..84896ac19fe 100644 --- a/main.go +++ b/main.go @@ -38,7 +38,7 @@ func main() { logrus.SetOutput(io.Discard) // Search for the configuration file in the command line arguments and in the environment - configFile := configuration.FindConfigFileInArgsFallbackOnEnv(os.Args) + configFile := configuration.FindConfigFlagsInArgsOrFallbackOnEnv(os.Args) ctx := config.SetConfigFile(context.Background(), configFile) // Create a new ArduinoCoreServer From 535e1da26de29aee765169657cf1f2fb5b369082 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 30 Jul 2024 20:39:32 +0200 Subject: [PATCH 3/3] Added test --- internal/cli/configuration/configuration_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internal/cli/configuration/configuration_test.go b/internal/cli/configuration/configuration_test.go index 7f15f3cdf59..8e448fa15b7 100644 --- a/internal/cli/configuration/configuration_test.go +++ b/internal/cli/configuration/configuration_test.go @@ -19,6 +19,7 @@ import ( "path/filepath" "testing" + "github.com/arduino/go-paths-helper" "github.com/stretchr/testify/require" ) @@ -63,3 +64,11 @@ func TestFindConfigFile(t *testing.T) { configFile = FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-file", "flag/path"}) require.Equal(t, "flag/path", configFile) } + +func TestFindConfigDir(t *testing.T) { + // Check behaviour with --config-dir + expected, err := paths.New("anotherpath", "arduino-cli.yaml").Abs() + require.NoError(t, err) + configFile := FindConfigFlagsInArgsOrFallbackOnEnv([]string{"--config-dir", "anotherpath"}) + require.Equal(t, expected.String(), configFile) +}