@@ -428,14 +428,7 @@ func (c *Context) Funcs() []template.Function {
428
428
429
429
// loadBackend determines the backend to use for executing the rendered template text (e.g. run in shell).
430
430
// 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 {
439
432
t .AddFunc ("print" ,
440
433
func () string {
441
434
c .run = func (script string ) error {
@@ -567,35 +560,61 @@ func (c *Context) loadBackends() error {
567
560
return ""
568
561
})
569
562
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" )
571
567
return err
572
568
}
573
569
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
+
574
581
// 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 ()
577
586
if err != nil {
578
- return err
587
+ return
579
588
}
580
-
589
+ t . SetOptions (template. Options {})
581
590
_ , err = configureTemplate (t , c .plugins ).Render (c )
582
- return err
591
+ return
583
592
}
584
593
585
594
// Execute runs the command
586
- func (c * Context ) Execute () error {
595
+ func (c * Context ) Execute () (err error ) {
596
+ var t * template.Template
587
597
588
- if err := c .loadBackends (); err != nil {
589
- return err
598
+ t , err = c .getTemplate ()
599
+ if err != nil {
600
+ return
590
601
}
591
602
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 : "%=" ,
594
607
})
595
- if err != nil {
608
+
609
+ if err := c .loadBackends (t ); err != nil {
596
610
return err
597
611
}
598
612
613
+ // Now regular processing
614
+ t .SetOptions (template.Options {
615
+ Stderr : func () io.Writer { return os .Stderr },
616
+ })
617
+
599
618
c .exec = true
600
619
c .template = t
601
620
script , err := configureTemplate (t , c .plugins ).Render (c )
0 commit comments