diff --git a/gapi/helpers.go b/gapi/helpers.go index 804631e8..51f25bcc 100644 --- a/gapi/helpers.go +++ b/gapi/helpers.go @@ -89,3 +89,9 @@ func CopyDirToFsForceAll(fs engine.Fs, src, dst string) error { func CopyDirContentsToFs(fs engine.Fs, src, dst string) error { return util.CopyDiskContentsToFs(fs, src, dst, false) } + +// MkdirAllOnFs writes a dir to a dst path on fs. It makes the parent dirs if +// they don't exist. +func MkdirAllOnFs(fs engine.WriteableFS, dst string, perm os.FileMode) error { + return fs.MkdirAll(dst, perm) +} diff --git a/lang/gapi/gapi.go b/lang/gapi/gapi.go index 1013f140..3d2fb6e9 100644 --- a/lang/gapi/gapi.go +++ b/lang/gapi/gapi.go @@ -463,6 +463,11 @@ func (obj *GAPI) Cli(info *gapi.Info) (*gapi.Deploy, error) { continue } // it's a regular file path + + // Occasionally, we need the dir to exist first or we'll error. + if err := gapi.MkdirAllOnFs(writeableFS, util.Dirname(dst), 0700); err != nil { + return nil, errwrap.Wrapf(err, "can't mkdir at `%s`", dst) + } if err := gapi.CopyFileToFs(writeableFS, src, dst); err != nil { return nil, errwrap.Wrapf(err, "can't copy file from `%s` to `%s`", src, dst) }