diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-04-03 14:24:55 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-04-03 14:24:55 +0200 |
commit | c6cd74032d58b2ee5afd6e3d78f748fabc0b9d04 (patch) | |
tree | f31e07a1649d1385ac4b6e260eea104a4bcfbca2 /client/go/internal/cli/cmd/config.go | |
parent | 7806b311fb7d2916e8eb8f3801f35223a2faffd8 (diff) |
Read local config when in an application package sub-directory
Diffstat (limited to 'client/go/internal/cli/cmd/config.go')
-rw-r--r-- | client/go/internal/cli/cmd/config.go | 75 |
1 files changed, 57 insertions, 18 deletions
diff --git a/client/go/internal/cli/cmd/config.go b/client/go/internal/cli/cmd/config.go index 2d32c454842..3dd4b04509c 100644 --- a/client/go/internal/cli/cmd/config.go +++ b/client/go/internal/cli/cmd/config.go @@ -150,6 +150,18 @@ $ vespa config set --local wait 600 if _, err := cli.applicationPackageFrom(nil, false); err != nil { return fmt.Errorf("failed to write local configuration: %w", err) } + if cli.config.local == nil { + wd, err := os.Getwd() + if err != nil { + return nil + } + localDir := filepath.Join(wd, ".vespa") + newConfig, err := readConfigIn(localDir, cli.config.environment, cli.config.flags) + if err != nil { + return err + } + cli.config.local = newConfig + } config = cli.config.local } if err := config.set(args[0], args[1]); err != nil { @@ -187,6 +199,10 @@ $ vespa config unset --local application return fmt.Errorf("failed to write local configuration: %w", err) } config = cli.config.local + if config == nil { + cli.printWarning("no local configuration present") + return nil + } } if err := config.unset(args[0]); err != nil { return err @@ -219,7 +235,7 @@ $ vespa config get --local RunE: func(cmd *cobra.Command, args []string) error { config := cli.config if localArg { - if cli.config.local.isEmpty() { + if cli.config.local == nil { cli.printWarning("no local configuration present") return nil } @@ -255,23 +271,36 @@ type KeyPair struct { PrivateKeyFile string } -func loadConfig(environment map[string]string, flags map[string]*pflag.Flag) (*Config, error) { - home, err := vespaCliHome(environment) +func loadConfig(environment map[string]string, flags map[string]*pflag.Flag, workDir string) (*Config, error) { + dir, err := vespaCliHome(environment) if err != nil { return nil, fmt.Errorf("could not detect config directory: %w", err) } - config, err := loadConfigFrom(home, environment, flags) + config, err := readConfigIn(dir, environment, flags) if err != nil { return nil, err } - // Load local config from working directory by default - if err := config.loadLocalConfigFrom("."); err != nil { + if workDir == "" { + workDir, err = os.Getwd() + if err != nil { + return nil, err + } + } + localDir, err := config.findLocalConfigDir(workDir) + if err != nil { return nil, err } + if localDir != "" { + localConfig, err := readConfigIn(localDir, environment, flags) + if err != nil { + return nil, err + } + config.local = localConfig + } return config, nil } -func loadConfigFrom(dir string, environment map[string]string, flags map[string]*pflag.Flag) (*Config, error) { +func readConfigIn(dir string, environment map[string]string, flags map[string]*pflag.Flag) (*Config, error) { cacheDir, err := vespaCliCacheDir(environment) if err != nil { return nil, fmt.Errorf("could not detect cache directory: %w", err) @@ -307,18 +336,30 @@ func athenzPath(filename string) (string, error) { return filepath.Join(userHome, ".athenz", filename), nil } -func (c *Config) loadLocalConfigFrom(parent string) error { - home := filepath.Join(parent, ".vespa") - _, err := os.Stat(home) - if err != nil && !os.IsNotExist(err) { - return err +func (c *Config) findLocalConfigDir(dir string) (string, error) { + userHome, err := os.UserHomeDir() + if err != nil { + return "", err } - config, err := loadConfigFrom(home, c.environment, c.flags) + dir, err = filepath.Abs(dir) if err != nil { - return err + return "", err } - c.local = config - return nil + for dir != userHome { + vespaDir := filepath.Join(dir, ".vespa") + _, err := os.Stat(vespaDir) + if err == nil { + return vespaDir, nil + } else if err != nil && !os.IsNotExist(err) { + return "", err + } + parent := filepath.Clean(filepath.Join(dir, "..")) + if parent == dir { + break + } + dir = parent + } + return "", nil } func (c *Config) write() error { @@ -527,8 +568,6 @@ func (c *Config) applicationFilePath(app vespa.ApplicationID, name string) (stri return filepath.Join(appDir, name), nil } -func (c *Config) isEmpty() bool { return len(c.config.Keys()) == 0 } - // list returns the options that have been set in this configuration. If includeUnset is true, also return options that // haven't been set. func (c *Config) list(includeUnset bool) []string { |