summaryrefslogtreecommitdiffstats
path: root/resources/resource.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-07-30 11:26:29 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-07-30 18:52:34 +0200
commitfbb8eb39ecda4151e1f50355688071c67f8bbcf1 (patch)
treef1148914a743bbd4fd16c4a42e4c09165e067422 /resources/resource.go
parent87d9bffe7402fabb8e91cc8c2b48e01e830aeb36 (diff)
Fix so temporary images do not get published
Fixes #10255
Diffstat (limited to 'resources/resource.go')
-rw-r--r--resources/resource.go53
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
}