Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-01-15 22:22:14 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-01-15 22:22:14 +0300
commitecaf14514e06321823bdd10235cf23e7d654ba77 (patch)
tree5df06870d994d326fb75ed03ac43f9e61e29ab3b /resource
parentd4f8f88e67f958b8010f90cb9b9854114e52dac2 (diff)
resource: Fix handling of very long image file names
Fixes #4261
Diffstat (limited to 'resource')
-rw-r--r--resource/image.go9
-rw-r--r--resource/image_test.go19
-rw-r--r--resource/testdata/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph.jpgbin0 -> 90587 bytes
-rw-r--r--resource/testhelpers_test.go10
4 files changed, 34 insertions, 4 deletions
diff --git a/resource/image.go b/resource/image.go
index 191aaf84c..e9a617f97 100644
--- a/resource/image.go
+++ b/resource/image.go
@@ -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.
diff --git a/resource/image_test.go b/resource/image_test.go
index 073a16352..28f68a46c 100644
--- a/resource/image_test.go
+++ b/resource/image_test.go
@@ -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
index 000000000..7d7307bed
--- /dev/null
+++ b/resource/testdata/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph.jpg
Binary files differ
diff --git a/resource/testhelpers_test.go b/resource/testhelpers_test.go
index 668885682..03a6d6134 100644
--- a/resource/testhelpers_test.go
+++ b/resource/testhelpers_test.go
@@ -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)