diff --git a/cmd/init.go b/cmd/init.go index 2cce42ed920..bdd0d2a2286 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -167,7 +167,7 @@ func (c *Config) promptString(field string) string { fmt.Fprintf(c.Stdout(), "%s? ", field) value, err := bufio.NewReader(c.Stdin()).ReadString('\n') if err != nil { - chezmoi.ReturnTemplateFuncError(err) + panic(err) } return strings.TrimSuffix(value, "\n") } diff --git a/cmd/secretbitwarden.go b/cmd/secretbitwarden.go index 11e951a6595..edf9deef7a4 100644 --- a/cmd/secretbitwarden.go +++ b/cmd/secretbitwarden.go @@ -8,7 +8,6 @@ import ( "strings" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" vfs "github.com/twpayne/go-vfs" ) @@ -51,11 +50,11 @@ func (c *Config) bitwardenFunc(args ...string) interface{} { cmd.Stderr = os.Stderr output, err := cmd.Output() if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("bitwarden: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("bitwarden: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } var data interface{} if err := json.Unmarshal(output, &data); err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("bitwarden: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("bitwarden: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } bitwardenCache[key] = data return data diff --git a/cmd/secretgeneric.go b/cmd/secretgeneric.go index 3a7b9883862..417c699af57 100644 --- a/cmd/secretgeneric.go +++ b/cmd/secretgeneric.go @@ -9,7 +9,6 @@ import ( "strings" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" vfs "github.com/twpayne/go-vfs" ) @@ -54,7 +53,7 @@ func (c *Config) secretFunc(args ...string) interface{} { cmd.Stderr = os.Stderr output, err := cmd.Output() if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("secret: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("secret: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } value := bytes.TrimSpace(output) secretCache[key] = value @@ -75,11 +74,11 @@ func (c *Config) secretJSONFunc(args ...string) interface{} { cmd.Stderr = os.Stderr output, err := cmd.Output() if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("secretJSON: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("secretJSON: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } var value interface{} if err := json.Unmarshal(output, &value); err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("secretJSON: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("secretJSON: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } secretJSONCache[key] = value return value diff --git a/cmd/secretkeepassxc.go b/cmd/secretkeepassxc.go index 5cc64ec4f38..fb3aad2fc98 100644 --- a/cmd/secretkeepassxc.go +++ b/cmd/secretkeepassxc.go @@ -11,7 +11,6 @@ import ( "strings" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" vfs "github.com/twpayne/go-vfs" "golang.org/x/crypto/ssh/terminal" ) @@ -51,7 +50,7 @@ func (c *Config) keePassXCFunc(entry string) interface{} { return data } if c.KeePassXC.Database == "" { - chezmoi.ReturnTemplateFuncError(errors.New("keepassxc: keepassxc.database not set")) + panic(errors.New("keepassxc: keepassxc.database not set")) } name := c.KeePassXC.Command args := []string{"show"} @@ -62,7 +61,7 @@ func (c *Config) keePassXCFunc(entry string) interface{} { } data, err := c.runKeePassXCCLICommand(name, args) if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("keepassxc: %s %s: %s", name, strings.Join(args, " "), err)) + panic(fmt.Errorf("keepassxc: %s %s: %s", name, strings.Join(args, " "), err)) } keePassXCCache[entry] = data return data diff --git a/cmd/secretkeyring.go b/cmd/secretkeyring.go index e6587cd9ad4..bbe6a722d8b 100644 --- a/cmd/secretkeyring.go +++ b/cmd/secretkeyring.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" keyring "github.com/zalando/go-keyring" ) @@ -51,7 +50,7 @@ func (*Config) keyringFunc(service, user string) string { } password, err := keyring.Get(service, user) if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("keyring %q %q: %v", service, user, err)) + panic(fmt.Errorf("keyring %q %q: %v", service, user, err)) } keyringCache[key] = password return password diff --git a/cmd/secretlastpass.go b/cmd/secretlastpass.go index b705201e585..2ca5753a0f4 100644 --- a/cmd/secretlastpass.go +++ b/cmd/secretlastpass.go @@ -14,7 +14,6 @@ import ( "github.com/coreos/go-semver/semver" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" vfs "github.com/twpayne/go-vfs" ) @@ -71,7 +70,7 @@ func (c *Config) lastpassOutput(args ...string) ([]byte, error) { func (c *Config) lastpassFunc(id string) interface{} { c.Lastpass.versionCheckOnce.Do(func() { if err := c.lastpassVersionCheck(); err != nil { - chezmoi.ReturnTemplateFuncError(err) + panic(err) } }) if data, ok := lastPassCache[id]; ok { @@ -79,11 +78,11 @@ func (c *Config) lastpassFunc(id string) interface{} { } output, err := c.lastpassOutput("show", "--json", id) if err != nil { - chezmoi.ReturnTemplateFuncError(err) + panic(err) } var data []map[string]interface{} if err := json.Unmarshal(output, &data); err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("lastpass: parse error: %v\n%q", err, output)) + panic(fmt.Errorf("lastpass: parse error: %v\n%q", err, output)) } for _, d := range data { if note, ok := d["note"].(string); ok { @@ -130,7 +129,7 @@ func lastpassParseNote(note string) map[string]string { } } if err := s.Err(); err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("lastpassParseNote: %v", err)) + panic(fmt.Errorf("lastpassParseNote: %v", err)) } return result } diff --git a/cmd/secretonepassword.go b/cmd/secretonepassword.go index c25e4a94782..7114ffc1910 100644 --- a/cmd/secretonepassword.go +++ b/cmd/secretonepassword.go @@ -8,7 +8,6 @@ import ( "strings" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" vfs "github.com/twpayne/go-vfs" ) @@ -50,11 +49,11 @@ func (c *Config) onepasswordFunc(item string) interface{} { cmd.Stderr = os.Stderr output, err := cmd.Output() if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("onepassword: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("onepassword: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } var data interface{} if err := json.Unmarshal(output, &data); err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("onepassword: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("onepassword: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } onepasswordCache[item] = data return data diff --git a/cmd/secretpass.go b/cmd/secretpass.go index eda64c03b67..3f870e27c1d 100644 --- a/cmd/secretpass.go +++ b/cmd/secretpass.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" vfs "github.com/twpayne/go-vfs" ) @@ -46,7 +45,7 @@ func (c *Config) passFunc(id string) string { } output, err := exec.Command(name, args...).Output() if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("pass: %s %s: %v", name, strings.Join(args, " "), err)) + panic(fmt.Errorf("pass: %s %s: %v", name, strings.Join(args, " "), err)) } var password string if index := bytes.IndexByte(output, '\n'); index != -1 { diff --git a/cmd/secretvault.go b/cmd/secretvault.go index 5b990143572..8fbac70ebb3 100644 --- a/cmd/secretvault.go +++ b/cmd/secretvault.go @@ -8,7 +8,6 @@ import ( "strings" "github.com/spf13/cobra" - "github.com/twpayne/chezmoi/lib/chezmoi" vfs "github.com/twpayne/go-vfs" ) @@ -50,11 +49,11 @@ func (c *Config) vaultFunc(key string) interface{} { cmd.Stderr = os.Stderr output, err := cmd.Output() if err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("vault: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("vault: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } var data interface{} if err := json.Unmarshal(output, &data); err != nil { - chezmoi.ReturnTemplateFuncError(fmt.Errorf("vault: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) + panic(fmt.Errorf("vault: %s %s: %v\n%s", name, strings.Join(args, " "), err, output)) } vaultCache[key] = data return data diff --git a/lib/chezmoi/chezmoi.go b/lib/chezmoi/chezmoi.go index 527fb836d7d..9d06c86ecba 100644 --- a/lib/chezmoi/chezmoi.go +++ b/lib/chezmoi/chezmoi.go @@ -26,12 +26,6 @@ const ( TemplateSuffix = ".tmpl" ) -// A templateFuncError is an error encountered while executing a template -// function. -type templateFuncError struct { - err error -} - // A PersistentState is an interface to a persistent state. type PersistentState interface { Delete(bucket, key []byte) error @@ -68,13 +62,6 @@ type parsedSourceFilePath struct { scriptAttributes *ScriptAttributes } -// ReturnTemplateFuncError causes template execution to return an error. -func ReturnTemplateFuncError(err error) { - panic(templateFuncError{ - err: err, - }) -} - // dirNames returns the dir names from dirAttributes. func dirNames(dirAttributes []DirAttributes) []string { dns := make([]string, len(dirAttributes)) diff --git a/lib/chezmoi/chezmoi_test.go b/lib/chezmoi/chezmoi_test.go index f7d1195ecc2..fa7e120841f 100644 --- a/lib/chezmoi/chezmoi_test.go +++ b/lib/chezmoi/chezmoi_test.go @@ -10,8 +10,7 @@ import ( func TestReturnTemplateError(t *testing.T) { funcs := map[string]interface{}{ "returnTemplateError": func() string { - ReturnTemplateFuncError(errors.New("error")) - return "foo" + panic(errors.New("error")) }, } for name, dataString := range map[string]string{ diff --git a/lib/chezmoi/targetstate.go b/lib/chezmoi/targetstate.go index 8e8818f3870..d2e0e94193a 100644 --- a/lib/chezmoi/targetstate.go +++ b/lib/chezmoi/targetstate.go @@ -657,7 +657,7 @@ func (ts *TargetState) executeTemplate(fs vfs.FS, path string) ([]byte, error) { return ts.executeTemplateData(path, data) } -func (ts *TargetState) executeTemplateData(name string, data []byte) (_ []byte, err error) { +func (ts *TargetState) executeTemplateData(name string, data []byte) ([]byte, error) { tmpl, err := template.New(name).Option("missingkey=error").Funcs(ts.TemplateFuncs).Parse(string(data)) if err != nil { return nil, err @@ -668,15 +668,6 @@ func (ts *TargetState) executeTemplateData(name string, data []byte) (_ []byte, return nil, err } } - defer func() { - if r := recover(); r != nil { - if tfe, ok := r.(templateFuncError); ok { - err = tfe.err - } else { - panic(r) - } - } - }() output := &bytes.Buffer{} if err = tmpl.Execute(output, ts.Data); err != nil { return nil, err