github.com/cloudfoundry/cli@v7.1.0+incompatible/util/configv3/config.go (about)

     1  // Package configv3 package contains everything related to the CF CLI Configuration.
     2  package configv3
     3  
     4  import (
     5  	"path/filepath"
     6  	"strconv"
     7  
     8  	"code.cloudfoundry.org/cli/version"
     9  )
    10  
    11  // Config combines the settings taken from the .cf/config.json, os.ENV, and the
    12  // plugin config.
    13  type Config struct {
    14  	// ConfigFile stores the configuration from the .cf/config
    15  	ConfigFile JSONConfig
    16  
    17  	// ENV stores the configuration from os.ENV
    18  	ENV EnvOverride
    19  
    20  	// Flags stores the configuration from global flags
    21  	Flags FlagOverride
    22  
    23  	// detectedSettings are settings detected when the config is loaded.
    24  	detectedSettings detectedSettings
    25  
    26  	pluginsConfig PluginsConfig
    27  }
    28  
    29  // BinaryVersion is the current version of the CF binary.
    30  func (config *Config) BinaryVersion() string {
    31  	return version.VersionString()
    32  }
    33  
    34  // IsTTY returns true based off of:
    35  //   - The $FORCE_TTY is set to true/t/1
    36  //   - Detected from the STDOUT stream
    37  func (config *Config) IsTTY() bool {
    38  	if config.ENV.ForceTTY != "" {
    39  		envVal, err := strconv.ParseBool(config.ENV.ForceTTY)
    40  		if err == nil {
    41  			return envVal
    42  		}
    43  	}
    44  
    45  	return config.detectedSettings.tty
    46  }
    47  
    48  // TerminalWidth returns the width of the terminal from when the config
    49  // was loaded. If the terminal width has changed since the config has loaded,
    50  // it will **not** return the new width.
    51  func (config *Config) TerminalWidth() int {
    52  	return config.detectedSettings.terminalWidth
    53  }
    54  
    55  // Verbose returns true if verbose should be displayed to terminal, in addition
    56  // a slice of absolute paths in which verbose text will appear. This is based
    57  // off of:
    58  //   - The config file's trace value (true/false/file path)
    59  //   - The $CF_TRACE environment variable if set (true/false/file path)
    60  //   - The '-v/--verbose' global flag
    61  //   - Defaults to false
    62  func (config *Config) Verbose() (bool, []string) {
    63  	var (
    64  		verbose     bool
    65  		envOverride bool
    66  		filePath    []string
    67  	)
    68  	if config.ENV.CFTrace != "" {
    69  		envVal, err := strconv.ParseBool(config.ENV.CFTrace)
    70  		verbose = envVal
    71  		if err != nil {
    72  			filePath = []string{config.ENV.CFTrace}
    73  		} else {
    74  			envOverride = true
    75  		}
    76  	}
    77  	if config.ConfigFile.Trace != "" {
    78  		envVal, err := strconv.ParseBool(config.ConfigFile.Trace)
    79  		if !envOverride {
    80  			verbose = envVal || verbose
    81  		}
    82  		if err != nil {
    83  			filePath = append(filePath, config.ConfigFile.Trace)
    84  		}
    85  	}
    86  	verbose = config.Flags.Verbose || verbose
    87  
    88  	for i, path := range filePath {
    89  		if !filepath.IsAbs(path) {
    90  			filePath[i] = filepath.Join(config.detectedSettings.currentDirectory, path)
    91  		}
    92  		resolvedPath, err := filepath.EvalSymlinks(filePath[i])
    93  		if err == nil {
    94  			filePath[i] = resolvedPath
    95  		}
    96  	}
    97  
    98  	return verbose, filePath
    99  }