diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2023-07-30 11:26:29 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2023-07-30 18:52:34 +0200 |
commit | fbb8eb39ecda4151e1f50355688071c67f8bbcf1 (patch) | |
tree | f1148914a743bbd4fd16c4a42e4c09165e067422 /resources/resource.go | |
parent | 87d9bffe7402fabb8e91cc8c2b48e01e830aeb36 (diff) |
Fix so temporary images do not get published
Fixes #10255
Diffstat (limited to 'resources/resource.go')
-rw-r--r-- | resources/resource.go | 53 |
1 files changed, 24 insertions, 29 deletions
diff --git a/resources/resource.go b/resources/resource.go index d1acc1026..884900d58 100644 --- a/resources/resource.go +++ b/resources/resource.go @@ -161,7 +161,6 @@ type baseResourceInternal interface { specProvider getResourcePaths() *resourcePathDescriptor getTargetFilenames() []string - openDestinationsForWriting() (io.WriteCloser, error) openPublishFileForWriting(relTargetPath string) (io.WriteCloser, error) relTargetPathForRel(rel string, addBaseTargetPath, isAbs, isURL bool) string @@ -216,6 +215,7 @@ func (d dirFile) path() string { type fileInfo interface { getSourceFilename() string setSourceFilename(string) + setSourfeFilenameIsHash(bool) setSourceFs(afero.Fs) getFileInfo() hugofs.FileMetaInfo hash() (string, error) @@ -304,6 +304,21 @@ func (l *genericResource) Permalink() string { func (l *genericResource) Publish() error { var err error l.publishInit.Do(func() { + targetFilenames := l.getTargetFilenames() + if l.sourceFilenameIsHash { + // This is a processed image. We want to avoid copying it if it hasn't changed. + var changedFilenames []string + for _, targetFilename := range targetFilenames { + if _, err := l.getSpec().BaseFs.PublishFs.Stat(targetFilename); err == nil { + continue + } + changedFilenames = append(changedFilenames, targetFilename) + } + if len(changedFilenames) == 0 { + return + } + targetFilenames = changedFilenames + } var fr hugio.ReadSeekCloser fr, err = l.ReadSeekCloser() if err != nil { @@ -312,7 +327,7 @@ func (l *genericResource) Publish() error { defer fr.Close() var fw io.WriteCloser - fw, err = helpers.OpenFilesForWriting(l.spec.BaseFs.PublishFs, l.getTargetFilenames()...) + fw, err = helpers.OpenFilesForWriting(l.spec.BaseFs.PublishFs, targetFilenames...) if err != nil { return } @@ -475,33 +490,6 @@ func (l genericResource) clone() *genericResource { return &l } -// 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 exists at the destination. - for _, targetFilename := range targetFilenames { - if _, err := l.getSpec().BaseFs.PublishFs.Stat(targetFilename); err == nil { - continue - } - - changedFilenames = append(changedFilenames, targetFilename) - } - - if len(changedFilenames) == 0 { - return - } - - w, err = helpers.OpenFilesForWriting(l.getSpec().BaseFs.PublishFs, changedFilenames...) - }) - - return -} - func (r *genericResource) openPublishFileForWriting(relTargetPath string) (io.WriteCloser, error) { return helpers.OpenFilesForWriting(r.spec.BaseFs.PublishFs, r.relTargetPathsFor(relTargetPath)...) } @@ -622,6 +610,9 @@ type resourceFileInfo struct { // the path to the file on the real filesystem. sourceFilename string + // For performance. This means that whenever the content changes, the filename changes. + sourceFilenameIsHash bool + fi hugofs.FileMetaInfo // A hash of the source content. Is only calculated in caching situations. @@ -654,6 +645,10 @@ func (fi *resourceFileInfo) setSourceFilename(s string) { fi.sourceFilename = s } +func (fi *resourceFileInfo) setSourfeFilenameIsHash(b bool) { + fi.sourceFilenameIsHash = b +} + func (fi *resourceFileInfo) getSourceFs() afero.Fs { return fi.sourceFs } |