From e54b1cedd936f46260ab339c1d1e443bd760e7a3 Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Mon, 8 Jul 2019 15:39:46 -0700 Subject: [PATCH] text/template turns out to swallow custom error types. --- packer/core.go | 7 +++---- template/interpolate/funcs.go | 10 ++-------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packer/core.go b/packer/core.go index 2a6210356..c9672eb96 100644 --- a/packer/core.go +++ b/packer/core.go @@ -3,6 +3,7 @@ package packer import ( "fmt" "sort" + "strings" ttmp "text/template" @@ -367,12 +368,10 @@ func (c *Core) init() error { ctx.UserVariables = c.variables case ttmp.ExecError: castError := err.(ttmp.ExecError) - switch castError.Err.(type) { - case interpolate.ErrVariableNotSet: + if strings.Contains(castError.Error(), interpolate.ErrVariableNotSetString) { shouldRetry = true failedInterpolation = fmt.Sprintf(`"%s": "%s"; error: %s`, k, v, err) - continue - default: + } else { return err } default: diff --git a/template/interpolate/funcs.go b/template/interpolate/funcs.go index f2842bc16..1d76f8f06 100644 --- a/template/interpolate/funcs.go +++ b/template/interpolate/funcs.go @@ -47,13 +47,7 @@ var FuncGens = map[string]FuncGenerator{ "lower": funcGenPrimitive(strings.ToLower), } -type ErrVariableNotSet struct { - Var string // Name of template. -} - -func (e ErrVariableNotSet) Error() string { - return fmt.Sprintf("variable %s not set", e.Var) -} +var ErrVariableNotSetString = "Error: variable not set:" // FuncGenerator is a function that given a context generates a template // function for the template. @@ -176,7 +170,7 @@ func funcGenUser(ctx *Context) interface{} { // error and retry if we're interpolating UserVariables. But if // we're elsewhere in the template, just return the empty string. if !ok { - return "", ErrVariableNotSet{k} + return "", fmt.Errorf("%s %s", ErrVariableNotSetString, k) } } return val, nil