diff options
| author | Dave Henderson <dhenderson@gmail.com> | 2020-05-13 22:02:23 -0400 |
|---|---|---|
| committer | Dave Henderson <dhenderson@gmail.com> | 2020-05-13 22:58:58 -0400 |
| commit | e43499c6c2cd58e4dabf2d0438b6120f279825da (patch) | |
| tree | 83668ec8d0e1dfacf2bb3981f8b880adf29f5b17 /template.go | |
| parent | 892e28078137c3b2aba4cad85b94b17cd7835cd0 (diff) | |
Defer writing until output differs
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'template.go')
| -rw-r--r-- | template.go | 20 |
1 files changed, 18 insertions, 2 deletions
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 } |
