summaryrefslogtreecommitdiffstats
path: root/client/go/internal/cli/cmd/config.go
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-04-03 14:24:55 +0200
committerMartin Polden <mpolden@mpolden.no>2023-04-03 14:24:55 +0200
commitc6cd74032d58b2ee5afd6e3d78f748fabc0b9d04 (patch)
treef31e07a1649d1385ac4b6e260eea104a4bcfbca2 /client/go/internal/cli/cmd/config.go
parent7806b311fb7d2916e8eb8f3801f35223a2faffd8 (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.go75
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 {