Skip to content

Commit

Permalink
Avoid writing the same processed image to /public twice
Browse files Browse the repository at this point in the history
Fixes #6307
  • Loading branch information
bep committed Sep 6, 2019
1 parent 901077c commit 9442937
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 27 deletions.
3 changes: 3 additions & 0 deletions hugolib/image_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,4 +211,7 @@ SUNSET2: {{ $resized2.RelPermalink }}/{{ $resized2.Width }}/Lat: {{ $resized2.Ex
b.AssertFileContent("resources/_gen/images/sunset_17701188623491591036.json",
"DateTimeDigitized|time.Time", "PENTAX")

// TODO(bep) add this as a default assertion after Build()?
b.AssertNoDuplicateWrites()

}
8 changes: 8 additions & 0 deletions hugolib/testhelpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,8 @@ func (s *sitesBuilder) CreateSitesE() error {
return errors.Wrap(err, "failed to load config")
}

s.Fs.Destination = hugofs.NewCreateCountingFs(s.Fs.Destination)

depsCfg := s.depsCfg
depsCfg.Fs = s.Fs
depsCfg.Cfg = s.Cfg
Expand Down Expand Up @@ -680,6 +682,12 @@ func (s *sitesBuilder) AssertImage(width, height int, filename string) {
s.Assert(cfg.Height, qt.Equals, height)
}

func (s *sitesBuilder) AssertNoDuplicateWrites() {
s.Helper()
d := s.Fs.Destination.(hugofs.DuplicatesReporter)
s.Assert(d.ReportDuplicates(), qt.Equals, "")
}

func (s *sitesBuilder) FileContent(filename string) string {
s.T.Helper()
filename = filepath.FromSlash(filename)
Expand Down
71 changes: 44 additions & 27 deletions resources/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -524,6 +539,8 @@ type permalinker interface {
type resourceContent struct {
content string
contentInit sync.Once

publishInit sync.Once
}

type resourceFileInfo struct {
Expand Down

0 comments on commit 9442937

Please sign in to comment.