resources: Fix image publish ordering issue - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 439ab0339d9ac6972caabaa55fa41887ace839cb
 (DIR) parent b6a60f718e376066456da37e7bb997a7697edc31
 (HTM) Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Sat, 30 Mar 2019 09:12:49 +0100
       
       resources: Fix image publish ordering issue
       
       Fixes #5730
       
       Diffstat:
         M resources/image.go                  |       3 +++
         M resources/image_test.go             |      44 +++++++++++++++++++++++++++++++
         M resources/testhelpers_test.go       |       3 ++-
       
       3 files changed, 49 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/resources/image.go b/resources/image.go
       @@ -510,6 +510,9 @@ func (i *Image) encodeTo(conf imageConfig, img image.Image, w io.Writer) error {
        func (i *Image) clone() *Image {
                g := *i.genericResource
                g.resourceContent = &resourceContent{}
       +        if g.publishOnce != nil {
       +                g.publishOnce = &publishOnce{logger: g.publishOnce.logger}
       +        }
        
                return &Image{
                        imaging:         i.imaging,
 (DIR) diff --git a/resources/image_test.go b/resources/image_test.go
       @@ -152,6 +152,50 @@ func TestImageTransformLongFilename(t *testing.T) {
                assert.Equal("/a/_hu59e56ffff1bc1d8d122b1403d34e039f_90587_c876768085288f41211f768147ba2647.jpg", resized.RelPermalink())
        }
        
       +// https://github.com/gohugoio/hugo/issues/5730
       +func TestImagePermalinkPublishOrder(t *testing.T) {
       +        for _, checkOriginalFirst := range []bool{true, false} {
       +                name := "OriginalFirst"
       +                if !checkOriginalFirst {
       +                        name = "ResizedFirst"
       +                }
       +
       +                t.Run(name, func(t *testing.T) {
       +
       +                        assert := require.New(t)
       +                        spec := newTestResourceOsFs(assert)
       +
       +                        check1 := func(img *Image) {
       +                                resizedLink := "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_100x50_resize_q75_box.jpg"
       +                                assert.Equal(resizedLink, img.RelPermalink())
       +                                assertImageFile(assert, spec.PublishFs, resizedLink, 100, 50)
       +                        }
       +
       +                        check2 := func(img *Image) {
       +                                assert.Equal("/a/sunset.jpg", img.RelPermalink())
       +                                assertImageFile(assert, spec.PublishFs, "a/sunset.jpg", 900, 562)
       +                        }
       +
       +                        orignal := fetchImageForSpec(spec, assert, "sunset.jpg")
       +                        assert.NotNil(orignal)
       +
       +                        if checkOriginalFirst {
       +                                check2(orignal)
       +                        }
       +
       +                        resized, err := orignal.Resize("100x50")
       +                        assert.NoError(err)
       +
       +                        check1(resized)
       +
       +                        if !checkOriginalFirst {
       +                                check2(orignal)
       +                        }
       +                })
       +        }
       +
       +}
       +
        func TestImageTransformConcurrent(t *testing.T) {
        
                var wg sync.WaitGroup
 (DIR) diff --git a/resources/testhelpers_test.go b/resources/testhelpers_test.go
       @@ -135,13 +135,14 @@ func fetchResourceForSpec(spec *Spec, assert *require.Assertions, name string) r
        
                factory := newTargetPaths("/a")
        
       -        r, err := spec.New(ResourceSourceDescriptor{TargetPaths: factory, SourceFilename: name})
       +        r, err := spec.New(ResourceSourceDescriptor{TargetPaths: factory, LazyPublish: true, SourceFilename: name})
                assert.NoError(err)
        
                return r.(resource.ContentResource)
        }
        
        func assertImageFile(assert *require.Assertions, fs afero.Fs, filename string, width, height int) {
       +        filename = filepath.Clean(filename)
                f, err := fs.Open(filename)
                if err != nil {
                        printFs(fs, "", os.Stdout)