// MergeEnv merges environment variables in base with those // in vars according to the suppled policies. func MergeEnv(policies map[string]MergePolicy, base *envvar.Vars, vars ...[]string) { // Remove any variables that have the IgnoreBase policy. for k, _ := range base.ToMap() { switch policies[k].Action { case Ignore, IgnoreBaseAndAppend, IgnoreBaseAndPrepend, IgnoreBaseAndUseFirst, IgnoreBaseAndUseLast: base.Delete(k) } } for _, ev := range vars { for _, tmp := range ev { k, v := envvar.SplitKeyValue(tmp) policy := policies[k] action := policy.Action switch policy.Action { case IgnoreBaseAndAppend: action = Append case IgnoreBaseAndPrepend: action = Prepend case IgnoreBaseAndUseLast: action = Last case IgnoreBaseAndUseFirst: action = First } switch action { case Ignore, IgnoreProfiles: continue case Append, Prepend: sep := policy.Separator ov := base.GetTokens(k, sep) nv := envvar.SplitTokens(v, sep) if action == Append { base.SetTokens(k, append(ov, nv...), sep) } else { base.SetTokens(k, append(nv, ov...), sep) } case First: if !base.Contains(k) { base.Set(k, v) } case Last: base.Set(k, v) } } } }
// UnsetGoEnvVars unsets Go environment variables in the given environment. func UnsetGoEnvVars(env *envvar.Vars) { for _, k := range GoFlags { env.Delete(k) } }