diff options
Diffstat (limited to 'pkg/server/env')
| -rw-r--r-- | pkg/server/env/env.go | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/pkg/server/env/env.go b/pkg/server/env/env.go index b75d9a8..2c97669 100644 --- a/pkg/server/env/env.go +++ b/pkg/server/env/env.go @@ -10,11 +10,11 @@ import ( type env struct { m map[string]string sync.Mutex + p *env } type Env struct { *env - p *env } const namePattern = "[a-zA-Z][a-zA-Z0-9.]*" @@ -30,15 +30,15 @@ func New() Env { return Env{env: new(env)} } -func (e *env) init() { +func (e Env) init() { if e.m == nil { e.m = make(map[string]string) } } -func (e *env) Fork() Env { +func (e Env) Fork() Env { t := New() - t.p = e + t.p = e.env return t } @@ -47,12 +47,7 @@ func (e *env) Find(key string) (string, bool) { defer e.Unlock() v, ok := e.m[key] - - return v, ok -} - -func (e Env) Find(key string) (string, bool) { - if v, ok := e.env.Find(key); ok { + if ok { return v, ok } @@ -68,11 +63,6 @@ func (e Env) Get(key string) string { return v } -func (e Env) Has(key string) bool { - _, ok := e.Find(key) - return ok -} - func validKeyValue(key string, value string) error { if !isGoodName(key) { return errBadVariable @@ -119,7 +109,7 @@ func (e Env) Push(key string, value string) error { return nil } -func (e *env) Del(key string) bool { +func (e Env) Del(key string) bool { e.Lock() defer e.Unlock() @@ -136,7 +126,7 @@ func (e *env) Del(key string) bool { return true } -func (e *env) Each(f func(string, string) bool) { +func (e Env) Each(f func(string, string) bool) { var keys []string e.Lock() @@ -155,7 +145,7 @@ func (e *env) Each(f func(string, string) bool) { } } -func (e *env) Clear() { +func (e Env) Clear() { e.Lock() defer e.Unlock() @@ -163,10 +153,22 @@ func (e *env) Clear() { } func (e Env) replaceWith(r *regexp.Regexp, s string, f func(string) string) string { - for { - t := r.ReplaceAllStringFunc(s, f) + const maxIter = 16 + + for iter := 0; ; iter++ { + found := false + + t := r.ReplaceAllStringFunc(s, func(v string) string { + found = true + + if iter >= maxIter { + return "" + } + + return f(v) + }) - if t == s { + if !found && t == s { break } @@ -194,18 +196,22 @@ func (e Env) EvalStrings(s []string) []string { return t } +func (e Env) getLocal(key string) string { + if tunnel, ok := e.Find("tunnel"); ok { + if v, ok := e.Find("tunnel." + tunnel + "." + key); ok { + return v + } + } + + return e.Get(key) +} + func (e Env) Expand(s string) string { return e.replaceWith(expandRe, s, func(v string) string { - return e.Get(v[2 : len(v)-1]) + return e.getLocal(v[2 : len(v)-1]) }) } func (e Env) Value(key string) string { - if e.Has("tunnel") { - if v := e.Expand("@[tunnel.@[tunnel]." + key + "]"); v != "" { - return v - } - } - - return e.Expand(e.Get(key)) + return e.Expand(e.getLocal(key)) } |
