github.com/psexton/git-lfs@v2.1.1-0.20170517224304-289a18b2bc53+incompatible/config/git_environment.go (about)

     1  package config
     2  
     3  // gitEnvironment is an implementation of the Environment which wraps the legacy
     4  // behavior or `*config.Configuration.loadGitConfig()`.
     5  //
     6  // It is functionally equivelant to call `cfg.loadGitConfig()` before calling
     7  // methods on the Environment type.
     8  type gitEnvironment struct {
     9  	// git is the Environment which gitEnvironment wraps.
    10  	git Environment
    11  	// config is the *Configuration instance which is mutated by
    12  	// `loadGitConfig`.
    13  	config *Configuration
    14  }
    15  
    16  // Get is shorthand for calling the loadGitConfig, and then returning
    17  // `g.git.Get(key)`.
    18  func (g *gitEnvironment) Get(key string) (val string, ok bool) {
    19  	g.loadGitConfig()
    20  
    21  	return g.git.Get(key)
    22  }
    23  
    24  // Get is shorthand for calling the loadGitConfig, and then returning
    25  // `g.git.GetAll(key)`.
    26  func (g *gitEnvironment) GetAll(key string) []string {
    27  	g.loadGitConfig()
    28  
    29  	return g.git.GetAll(key)
    30  }
    31  
    32  // Get is shorthand for calling the loadGitConfig, and then returning
    33  // `g.git.Bool(key, def)`.
    34  func (g *gitEnvironment) Bool(key string, def bool) (val bool) {
    35  	g.loadGitConfig()
    36  
    37  	return g.git.Bool(key, def)
    38  }
    39  
    40  // Get is shorthand for calling the loadGitConfig, and then returning
    41  // `g.git.Int(key, def)`.
    42  func (g *gitEnvironment) Int(key string, def int) (val int) {
    43  	g.loadGitConfig()
    44  
    45  	return g.git.Int(key, def)
    46  }
    47  
    48  // All returns a copy of all the key/value pairs for the current git config.
    49  func (g *gitEnvironment) All() map[string][]string {
    50  	g.loadGitConfig()
    51  
    52  	return g.git.All()
    53  }
    54  
    55  // loadGitConfig reads and parses the .gitconfig by calling ReadGitConfig. It
    56  // also sets values on the configuration instance `g.config`.
    57  //
    58  // If loadGitConfig has already been called, this method will bail out early,
    59  // and return false. Otherwise it will preform the entire parse and return true.
    60  //
    61  // loadGitConfig is safe to call across multiple goroutines.
    62  func (g *gitEnvironment) loadGitConfig() bool {
    63  	g.config.loading.Lock()
    64  	defer g.config.loading.Unlock()
    65  
    66  	if g.git != nil {
    67  		return false
    68  	}
    69  
    70  	gf, extensions, uniqRemotes := ReadGitConfig(getGitConfigs()...)
    71  
    72  	g.git = EnvironmentOf(gf)
    73  
    74  	g.config.extensions = extensions
    75  
    76  	g.config.remotes = make([]string, 0, len(uniqRemotes))
    77  	for remote, isOrigin := range uniqRemotes {
    78  		if isOrigin {
    79  			continue
    80  		}
    81  		g.config.remotes = append(g.config.remotes, remote)
    82  	}
    83  
    84  	return true
    85  }