@@ -428,14 +428,7 @@ func (c *Context) Funcs() []template.Function {
428428
429429// loadBackend determines the backend to use for executing the rendered template text (e.g. run in shell).
430430// During this phase, the template delimiters are changed to =% %= so put this in the comment {{/* */}}
431- func (c * Context ) loadBackends () error {
432- t , err := template .NewTemplate (c .src , template.Options {
433- DelimLeft : "=%" ,
434- DelimRight : "%=" ,
435- })
436- if err != nil {
437- return err
438- }
431+ func (c * Context ) loadBackends (t * template.Template ) error {
439432 t .AddFunc ("print" ,
440433 func () string {
441434 c .run = func (script string ) error {
@@ -567,35 +560,61 @@ func (c *Context) loadBackends() error {
567560 return ""
568561 })
569562
570- _ , err = t .Render (c )
563+ _ , err := t .Render (c )
564+
565+ // clean up after we rendered... remove the functions
566+ t .RemoveFunc ("sh" , "print" , "instanceProvision" , "managerCommit" )
571567 return err
572568}
573569
570+ func (c * Context ) getTemplate () (* template.Template , error ) {
571+ if c .template == nil {
572+ t , err := template .NewTemplate (c .src , template.Options {})
573+ if err != nil {
574+ return nil , err
575+ }
576+ c .template = t
577+ }
578+ return c .template , nil
579+ }
580+
574581// BuildFlags from parsing the body which is a template
575- func (c * Context ) BuildFlags () error {
576- t , err := template .NewTemplate (c .src , template.Options {})
582+ func (c * Context ) BuildFlags () (err error ) {
583+ var t * template.Template
584+
585+ t , err = c .getTemplate ()
577586 if err != nil {
578- return err
587+ return
579588 }
580-
589+ t . SetOptions (template. Options {})
581590 _ , err = configureTemplate (t , c .plugins ).Render (c )
582- return err
591+ return
583592}
584593
585594// Execute runs the command
586- func (c * Context ) Execute () error {
595+ func (c * Context ) Execute () (err error ) {
596+ var t * template.Template
587597
588- if err := c .loadBackends (); err != nil {
589- return err
598+ t , err = c .getTemplate ()
599+ if err != nil {
600+ return
590601 }
591602
592- t , err := template .NewTemplate (c .src , template.Options {
593- Stderr : func () io.Writer { return os .Stderr },
603+ // First pass to get the backends
604+ t .SetOptions (template.Options {
605+ DelimLeft : "=%" ,
606+ DelimRight : "%=" ,
594607 })
595- if err != nil {
608+
609+ if err := c .loadBackends (t ); err != nil {
596610 return err
597611 }
598612
613+ // Now regular processing
614+ t .SetOptions (template.Options {
615+ Stderr : func () io.Writer { return os .Stderr },
616+ })
617+
599618 c .exec = true
600619 c .template = t
601620 script , err := configureTemplate (t , c .plugins ).Render (c )
0 commit comments