summaryrefslogtreecommitdiff
path: root/template.go
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2020-05-13 22:02:23 -0400
committerDave Henderson <dhenderson@gmail.com>2020-05-13 22:58:58 -0400
commite43499c6c2cd58e4dabf2d0438b6120f279825da (patch)
tree83668ec8d0e1dfacf2bb3981f8b880adf29f5b17 /template.go
parent892e28078137c3b2aba4cad85b94b17cd7835cd0 (diff)
Defer writing until output differs
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'template.go')
-rw-r--r--template.go20
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
}