resource: Create target dir if not exists
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 1 Jan 2018 13:23:51 +0000 (14:23 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 1 Jan 2018 13:23:51 +0000 (14:23 +0100)
This is the case where image processing is triggered from shortcodes, i.e. before the target page's folder in /public is created.

Fixes #4202

resource/image.go

index f45c12c0b62f8f3e4371b88ef9fed1d084fb64bb..2e8dc5f02ed80ac565dcf71fa002eca3269cb5ae 100644 (file)
@@ -411,7 +411,19 @@ func (i *Image) copyToDestination(src string) error {
                defer in.Close()
 
                out, err := i.spec.Fs.Destination.Create(target)
-               if err != nil {
+               if err != nil && os.IsNotExist(err) {
+                       // When called from shortcodes, the target directory may not exist yet.
+                       // See https://github.com/gohugoio/hugo/issues/4202
+                       if err = i.spec.Fs.Source.MkdirAll(filepath.Dir(target), os.FileMode(0755)); err != nil {
+                               res = err
+                               return
+                       }
+                       out, err = i.spec.Fs.Destination.Create(target)
+                       if err != nil {
+                               res = err
+                               return
+                       }
+               } else if err != nil {
                        res = err
                        return
                }