fix: readFile and exec should run in the directory the template file resides in (#340)

Fixes #299
This commit is contained in:
KUOKA Yusuke 2018-09-16 22:43:17 +09:00 committed by GitHub
parent 37ea442515
commit 81d796c167
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 9 additions and 7 deletions

View File

@ -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 {

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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{

View File

@ -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)