From 467b2a00bbd4814b7a25500683a105048f246f4d Mon Sep 17 00:00:00 2001 From: Jay2006sawant Date: Sun, 14 Jun 2026 15:33:07 +0530 Subject: [PATCH] fix(config): handle directory paths for --config and HARBOR_CLI_CONFIG Fixes #993 Signed-off-by: Jay2006sawant --- pkg/utils/config.go | 35 +++++++++++++++++++++-------------- pkg/utils/config_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/pkg/utils/config.go b/pkg/utils/config.go index cecc7628e..2aafa24e5 100644 --- a/pkg/utils/config.go +++ b/pkg/utils/config.go @@ -79,14 +79,14 @@ func InitConfig(cfgFile string, userSpecifiedConfig bool) { log.Fatalf("%v", configInitError) } - // Update or create data file - if err := ApplyDataFile(harborDataPath, harborConfigPath); err != nil { + // Ensure config file exists before persisting the path to data.yaml + if err := EnsureConfigFileExists(harborConfigPath); err != nil { configInitError = err log.Fatalf("%v", err) } - // Ensure config file exists - if err := EnsureConfigFileExists(harborConfigPath); err != nil { + // Update or create data file + if err := ApplyDataFile(harborDataPath, harborConfigPath); err != nil { configInitError = err log.Fatalf("%v", err) } @@ -126,6 +126,21 @@ func GetDataPaths() (harborDataPath string, harborDataDir string) { return } +// normalizeConfigPath resolves an absolute config file path. If the given path +// is an existing directory, it appends config.yaml to match the default layout. +func normalizeConfigPath(path string) (string, error) { + harborConfigPath, err := filepath.Abs(path) + if err != nil { + return "", fmt.Errorf("failed to resolve absolute path for config file: %w", err) + } + + if fileInfo, err := os.Stat(harborConfigPath); err == nil && fileInfo.IsDir() { + harborConfigPath = filepath.Join(harborConfigPath, "config.yaml") + } + + return harborConfigPath, nil +} + // Helper function to determine the config path func DetermineConfigPath(cfgFile string, userSpecifiedConfig bool) (string, error) { var harborConfigPath string @@ -133,20 +148,12 @@ func DetermineConfigPath(cfgFile string, userSpecifiedConfig bool) (string, erro // 1. Check if user specified --config if userSpecifiedConfig && cfgFile != "" { - harborConfigPath, err = filepath.Abs(cfgFile) - if err != nil { - return "", fmt.Errorf("failed to resolve absolute path for config file: %w", err) - } - return harborConfigPath, nil + return normalizeConfigPath(cfgFile) } // 2. Check HARBOR_CLI_CONFIG environment variable harborEnvVar := os.Getenv("HARBOR_CLI_CONFIG") if harborEnvVar != "" { - harborConfigPath, err = filepath.Abs(harborEnvVar) - if err != nil { - return "", fmt.Errorf("failed to resolve absolute path for config file from HARBOR_CLI_CONFIG: %w", err) - } - return harborConfigPath, nil + return normalizeConfigPath(harborEnvVar) } // 3. Use default XDG config path diff --git a/pkg/utils/config_test.go b/pkg/utils/config_test.go index 11fba03f3..784311b70 100644 --- a/pkg/utils/config_test.go +++ b/pkg/utils/config_test.go @@ -14,6 +14,7 @@ package utils_test import ( + "os" "path/filepath" "testing" @@ -107,3 +108,40 @@ func Test_Config_Flag(t *testing.T) { assert.NotNil(t, currentConfig.Credentials, "Credentials should not be nil") assert.NotNil(t, data.ConfigPath, "ConfigPath should not be nil") } + +func Test_Config_EnvVar_Directory(t *testing.T) { + utils.ConfigInitialization.Reset() + helpers.SetMockKeyring(t) + tempDir := t.TempDir() + configDir := filepath.Join(tempDir, "harbor-cli") + assert.NoError(t, os.MkdirAll(configDir, os.ModePerm)) + + helpers.SafeSetEnv("HARBOR_CLI_CONFIG", configDir) + helpers.SafeSetEnv("XDG_DATA_HOME", filepath.Join(tempDir, ".data")) + utils.InitConfig("", false) + + currentData, err := utils.GetCurrentHarborData() + assert.NoError(t, err) + defer helpers.ConfigCleanup(t, currentData) + + expectedConfigPath := filepath.Join(configDir, "config.yaml") + assert.Equal(t, expectedConfigPath, currentData.ConfigPath) +} + +func Test_Config_Flag_Directory(t *testing.T) { + utils.ConfigInitialization.Reset() + helpers.SetMockKeyring(t) + tempDir := t.TempDir() + configDir := filepath.Join(tempDir, "harbor-cli") + assert.NoError(t, os.MkdirAll(configDir, os.ModePerm)) + helpers.SafeSetEnv("XDG_DATA_HOME", filepath.Join(tempDir, ".data")) + + utils.InitConfig(configDir, true) + + currentData, err := utils.GetCurrentHarborData() + assert.NoError(t, err) + defer helpers.ConfigCleanup(t, currentData) + + expectedConfigPath := filepath.Join(configDir, "config.yaml") + assert.Equal(t, expectedConfigPath, currentData.ConfigPath) +}