From e43499c6c2cd58e4dabf2d0438b6120f279825da Mon Sep 17 00:00:00 2001 From: Dave Henderson Date: Wed, 13 May 2020 22:02:23 -0400 Subject: Defer writing until output differs Signed-off-by: Dave Henderson --- template.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'template.go') diff --git a/template.go b/template.go index 3559b5ca..b500ce73 100644 --- a/template.go +++ b/template.go @@ -249,10 +249,26 @@ func createOutFile(filename string, mode os.FileMode, modeOverride bool) (out io return nil, fmt.Errorf("failed to chmod output file '%s' with mode %q: %w", filename, mode.Perm(), err) } } - out, err = fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode.Perm()) - if err != nil { + + open := func() (out io.WriteCloser, err error) { + out, err = fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode.Perm()) + if err != nil { + return out, fmt.Errorf("failed to open output file '%s' for writing: %w", filename, err) + } + return out, err } + + // if the output file already exists, we'll use a SameSkipper + f, err := fs.OpenFile(filename, os.O_RDONLY, mode.Perm()) + if err != nil { + // likely means the file just doesn't exist - open's error will be more useful + return open() + } + out = writers.SameSkipper(f, func() (io.WriteCloser, error) { + return open() + }) + return out, err } -- cgit v1.2.3