diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-09-06 10:28:43 +0300 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-09-06 12:04:57 +0300 |
commit | 9442937d82005b369780edcc557e0d15d6bf0bad (patch) | |
tree | 270776dff37cd161a56253a0284ad07bcb70af37 /resources | |
parent | 901077c0364eaf3fe4f997c3026aa18cfc7781ed (diff) |
Avoid writing the same processed image to /public twice
Fixes #6307
Diffstat (limited to 'resources')
-rw-r--r-- | resources/resource.go | 71 |
1 files changed, 44 insertions, 27 deletions
diff --git a/resources/resource.go b/resources/resource.go index 637f8e8fd..7e755bdbc 100644 --- a/resources/resource.go +++ b/resources/resource.go @@ -233,19 +233,26 @@ func (l *genericResource) Permalink() string { } func (l *genericResource) Publish() error { - fr, err := l.ReadSeekCloser() - if err != nil { - return err - } - defer fr.Close() + var err error + l.publishInit.Do(func() { + var fr hugio.ReadSeekCloser + fr, err = l.ReadSeekCloser() + if err != nil { + return + } + defer fr.Close() - fw, err := helpers.OpenFilesForWriting(l.spec.BaseFs.PublishFs, l.getTargetFilenames()...) - if err != nil { - return err - } - defer fw.Close() + var fw io.WriteCloser + fw, err = helpers.OpenFilesForWriting(l.spec.BaseFs.PublishFs, l.getTargetFilenames()...) + if err != nil { + return + } + defer fw.Close() + + _, err = io.Copy(fw, fr) + + }) - _, err = io.Copy(fw, fr) return err } @@ -400,26 +407,34 @@ func (l genericResource) clone() *genericResource { return &l } -// returns an opened file or nil if nothing to write. -func (l *genericResource) openDestinationsForWriting() (io.WriteCloser, error) { - targetFilenames := l.getTargetFilenames() - var changedFilenames []string +// returns an opened file or nil if nothing to write (it may already be published). +func (l *genericResource) openDestinationsForWriting() (w io.WriteCloser, err error) { + + l.publishInit.Do(func() { + targetFilenames := l.getTargetFilenames() + var changedFilenames []string + + // Fast path: + // This is a processed version of the original; + // check if it already existis at the destination. + for _, targetFilename := range targetFilenames { + if _, err := l.getSpec().BaseFs.PublishFs.Stat(targetFilename); err == nil { + continue + } - // Fast path: - // This is a processed version of the original; - // check if it already existis at the destination. - for _, targetFilename := range targetFilenames { - if _, err := l.getSpec().BaseFs.PublishFs.Stat(targetFilename); err == nil { - continue + changedFilenames = append(changedFilenames, targetFilename) } - changedFilenames = append(changedFilenames, targetFilename) - } - if len(changedFilenames) == 0 { - return nil, nil - } + if len(changedFilenames) == 0 { + return + } + + w, err = helpers.OpenFilesForWriting(l.getSpec().BaseFs.PublishFs, changedFilenames...) + + }) + + return - return helpers.OpenFilesForWriting(l.getSpec().BaseFs.PublishFs, changedFilenames...) } func (r *genericResource) openPublishFileForWriting(relTargetPath string) (io.WriteCloser, error) { @@ -524,6 +539,8 @@ type permalinker interface { type resourceContent struct { content string contentInit sync.Once + + publishInit sync.Once } type resourceFileInfo struct { |