diff --git a/main.go b/main.go index 7f035294..9863850b 100644 --- a/main.go +++ b/main.go @@ -613,7 +613,7 @@ type twoPassRenderer struct { func (r *twoPassRenderer) renderEnvironment(content []byte) environment.Environment { firstPassEnv := environment.Environment{Name: r.env, Values: map[string]interface{}(nil)} - firstPassRenderer := tmpl.NewFirstPassRenderer(firstPassEnv) + firstPassRenderer := tmpl.NewFirstPassRenderer(filepath.Dir(r.filename), firstPassEnv) // parse as much as we can, tolerate errors, this is a preparse yamlBuf, err := firstPassRenderer.RenderTemplateContentToBuffer(content) @@ -641,7 +641,7 @@ func (r *twoPassRenderer) renderTemplate(content []byte) (*bytes.Buffer, error) // try a first pass render. This will always succeed, but can produce a limited env firstPassEnv := r.renderEnvironment(content) - secondPassRenderer := tmpl.NewFileRenderer(r.reader, "", firstPassEnv) + secondPassRenderer := tmpl.NewFileRenderer(r.reader, filepath.Dir(r.filename), firstPassEnv) yamlBuf, err := secondPassRenderer.RenderTemplateContentToBuffer(content) if err != nil { if r.logger != nil { diff --git a/state/create.go b/state/create.go index 6b525f78..9a5b7fbb 100644 --- a/state/create.go +++ b/state/create.go @@ -100,9 +100,10 @@ func (state *HelmState) loadEnv(name string, readFile func(string) ([]byte, erro envVals := map[string]interface{}{} envSpec, ok := state.Environments[name] if ok { - r := valuesfile.NewRenderer(readFile, state.basePath, environment.EmptyEnvironment) for _, envvalFile := range envSpec.Values { - bytes, err := r.RenderToBytes(filepath.Join(state.basePath, envvalFile)) + envvalFullPath := filepath.Join(state.basePath, envvalFile) + r := valuesfile.NewRenderer(readFile, filepath.Dir(envvalFullPath), environment.EmptyEnvironment) + bytes, err := r.RenderToBytes(envvalFullPath) if err != nil { return nil, fmt.Errorf("failed to load environment values file \"%s\": %v", envvalFile, err) } diff --git a/state/state.go b/state/state.go index 4995cab0..6329ae01 100644 --- a/state/state.go +++ b/state/state.go @@ -886,7 +886,7 @@ func (state *HelmState) flagsForLint(helm helmexec.Interface, release *ReleaseSp } func (state *HelmState) RenderValuesFileToBytes(path string) ([]byte, error) { - r := valuesfile.NewRenderer(state.readFile, state.basePath, state.Env) + r := valuesfile.NewRenderer(state.readFile, filepath.Dir(path), state.Env) return r.RenderToBytes(path) } diff --git a/tmpl/file.go b/tmpl/file.go index ebef172e..5b3e6b9b 100644 --- a/tmpl/file.go +++ b/tmpl/file.go @@ -35,12 +35,12 @@ func NewFileRenderer(readFile func(filename string) ([]byte, error), basePath st } } -func NewFirstPassRenderer(env environment.Environment) *templateFileRenderer { +func NewFirstPassRenderer(basePath string, env environment.Environment) *templateFileRenderer { return &templateFileRenderer{ ReadFile: ioutil.ReadFile, Context: &Context{ preRender: true, - basePath: "", + basePath: basePath, readFile: ioutil.ReadFile, }, Data: TemplateData{ diff --git a/tmpl/funcs.go b/tmpl/funcs.go index 5cfb48cd..4be25f4b 100644 --- a/tmpl/funcs.go +++ b/tmpl/funcs.go @@ -53,6 +53,7 @@ func (c *Context) Exec(command string, args []interface{}, inputs ...string) (st } cmd := exec.Command(command, strArgs...) + cmd.Dir = c.basePath writeErrs := make(chan error) cmdErrs := make(chan error)