Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 21 additions & 14 deletions pkg/utils/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down Expand Up @@ -126,27 +126,34 @@ 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
var err error

// 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)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the cli should return an error instead of automagically appending a config.yaml suffix. it should be enough to check here whether the path is a file or dir. if dir fail

}
// 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
Expand Down
38 changes: 38 additions & 0 deletions pkg/utils/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
package utils_test

import (
"os"
"path/filepath"
"testing"

Expand Down Expand Up @@ -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)
}