resources: Fix image publish ordering issue
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 30 Mar 2019 08:12:49 +0000 (09:12 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 30 Mar 2019 09:17:25 +0000 (10:17 +0100)
Fixes #5730

resources/image.go
resources/image_test.go
resources/testhelpers_test.go

index 202b54fc2246ff6cdd1f61f6a8dcdd03184d7ed2..f1aae2996ee61c5389fc28871e21cd9bffd31c31 100644 (file)
@@ -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,
index fd1eb5410db8b9b9c4d160a332bcbaa0fbac95c1..6639dbb2448cfb71bd8fa97cdcc9e156c5126eec 100644 (file)
@@ -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
index 200a795e330af04b4358123f129002fe837eba46..d064fa57052582d2d676d8760ff6b90342d4a865 100644 (file)
@@ -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)