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 }