// ExpandEnv expands all instances of the JIRI_ROOT variable in the supplied // environment with the root from jirix. func ExpandEnv(x *X, env *envvar.Vars) { e := env.ToMap() rootEnv := "${" + RootEnv + "}" for k, v := range e { n := strings.Replace(v, rootEnv, x.Root, -1) if n != v { env.Set(k, n) } } }
// 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) } } } }