github.com/jmigpin/editor@v1.6.0/util/osutil/env.go (about)

     1  package osutil
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"strings"
     7  )
     8  
     9  //godebug:annotatefile
    10  
    11  func GetEnv(env []string, key string) string {
    12  	for _, s := range env {
    13  		k, v, ok := splitEnvVar(s)
    14  		if !ok {
    15  			continue
    16  		}
    17  		if k == key {
    18  			return v
    19  		}
    20  	}
    21  	return ""
    22  }
    23  
    24  func UnquoteEnvValues(env []string) []string {
    25  	for i, s := range env {
    26  		k, v, ok := splitEnvVar(s)
    27  		if ok {
    28  			if v2, err := strconv.Unquote(v); err == nil {
    29  				env[i] = keyvalStr(k, v2)
    30  			}
    31  		}
    32  	}
    33  	return env
    34  }
    35  
    36  //----------
    37  
    38  func SetEnv(env []string, key, value string) []string {
    39  	entry := keyvalStr(key, value)
    40  	set := false
    41  	for i, s := range env {
    42  		k, _, ok := splitEnvVar(s)
    43  		if !ok {
    44  			continue
    45  		}
    46  		if k == key {
    47  			if set {
    48  				env[i] = "" // clear entry
    49  			} else {
    50  				env[i] = entry
    51  				set = true // clear following entries
    52  			}
    53  		}
    54  	}
    55  
    56  	// clear empty entries
    57  	env2 := []string{}
    58  	for _, s := range env {
    59  		if s != "" {
    60  			env2 = append(env2, s)
    61  		}
    62  	}
    63  	env = env2
    64  
    65  	if !set {
    66  		return append(env, entry)
    67  	}
    68  	return env
    69  }
    70  
    71  func keyvalStr(key, value string) string {
    72  	return fmt.Sprintf("%v=%v", key, value)
    73  }
    74  
    75  func SetEnvs(env []string, addEnv []string) []string {
    76  	for _, s := range addEnv {
    77  		k, v, ok := splitEnvVar(s)
    78  		if !ok {
    79  			continue
    80  		}
    81  		env = SetEnv(env, k, v)
    82  	}
    83  	return env
    84  }
    85  
    86  func splitEnvVar(s string) (string, string, bool) {
    87  	u := strings.SplitN(s, "=", 2)
    88  	if len(u) != 2 {
    89  		return "", "", false
    90  	}
    91  	return u[0], u[1], true
    92  }