resource: Fix handling of very long image file names
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 15 Jan 2018 19:22:14 +0000 (20:22 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 15 Jan 2018 19:22:14 +0000 (20:22 +0100)
Fixes #4261

resource/image.go
resource/image_test.go
resource/testdata/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph.jpg [new file with mode: 0644]
resource/testhelpers_test.go

index 191aaf84c540ba575cb7ac8c31865fe010426b43..e9a617f9710cf9809ef25dd63bfd00b1fcca759b 100644 (file)
@@ -538,7 +538,14 @@ func (i *Image) filenameFromConfig(conf imageConfig) string {
        // for the different OSes to handle.
        if len(p1)+len(idStr)+len(p2) > md5Threshold {
                key = helpers.MD5String(p1 + key + p2)
-               p1 = p1[:strings.Index(p1, "_hu")]
+               huIdx := strings.Index(p1, "_hu")
+               if huIdx != -1 {
+                       p1 = p1[:huIdx]
+               } else {
+                       // This started out as a very long file name. Making it even longer
+                       // could melt ice in the Arctic.
+                       p1 = ""
+               }
        } else if strings.Contains(p1, idStr) {
                // On scaling an already scaled image, we get the file info from the original.
                // Repeating the same info in the filename makes it stuttery for no good reason.
index 073a16352e48ce34b3433424c672020a2ce80213..28f68a46c2c4408b887830fd5c1af47903b81395 100644 (file)
@@ -115,6 +115,25 @@ func TestImageTransform(t *testing.T) {
 
 }
 
+// https://github.com/gohugoio/hugo/issues/4261
+func TestImageTransformLongFilename(t *testing.T) {
+       assert := require.New(t)
+
+       image := fetchImage(assert, "1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph.jpg")
+       assert.NotNil(image)
+
+       resized, err := image.Resize("200x")
+       assert.NoError(err)
+       assert.NotNil(resized)
+       assert.Equal(200, resized.Width())
+       assert.Equal("/a/_hu59e56ffff1bc1d8d122b1403d34e039f_90587_fd0f8b23902abcf4092b68783834f7fe.jpg", resized.RelPermalink())
+       resized, err = resized.Resize("100x")
+       assert.NoError(err)
+       assert.NotNil(resized)
+       assert.Equal(100, resized.Width())
+       assert.Equal("/a/_hu59e56ffff1bc1d8d122b1403d34e039f_90587_5f399e62910070692b3034a925f1b2d7.jpg", resized.RelPermalink())
+}
+
 func TestDecodeImaging(t *testing.T) {
        assert := require.New(t)
        m := map[string]interface{}{
diff --git a/resource/testdata/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph.jpg b/resource/testdata/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph.jpg
new file mode 100644 (file)
index 0000000..7d7307b
Binary files /dev/null and b/resource/testdata/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph.jpg differ
index 6688856825c37eddd14fbc5e3d1a389b8012af4a..03a6d613448741ff6b0217272a0436036e875804 100644 (file)
@@ -37,12 +37,16 @@ func newTestResourceSpecForBaseURL(assert *require.Assertions, baseURL string) *
 }
 
 func fetchSunset(assert *require.Assertions) *Image {
-       src, err := os.Open("testdata/sunset.jpg")
+       return fetchImage(assert, "sunset.jpg")
+}
+
+func fetchImage(assert *require.Assertions, name string) *Image {
+       src, err := os.Open("testdata/" + name)
        assert.NoError(err)
 
        spec := newTestResourceSpec(assert)
 
-       out, err := spec.Fs.Source.Create("/b/sunset.jpg")
+       out, err := spec.Fs.Source.Create("/b/" + name)
        assert.NoError(err)
        _, err = io.Copy(out, src)
        out.Close()
@@ -53,7 +57,7 @@ func fetchSunset(assert *require.Assertions) *Image {
                return path.Join("/a", s)
        }
 
-       r, err := spec.NewResourceFromFilename(factory, "/public", "/b/sunset.jpg", "sunset.jpg")
+       r, err := spec.NewResourceFromFilename(factory, "/public", "/b/"+name, name)
        assert.NoError(err)
        assert.IsType(&Image{}, r)
        return r.(*Image)