aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiall Sheridan <nsheridan@gmail.com>2018-08-01 00:37:11 +0100
committerNiall Sheridan <nsheridan@gmail.com>2018-08-01 00:37:11 +0100
commite2b4c3882762406fd3da16f5865cfc3e36e048b5 (patch)
tree4554004f44fe69a759d37191b8a6236ec0f2c90e
parent925bc7eb676e25341e30d64da4d12c0e93102cdf (diff)
Migrate from esc to packr for static files
-rw-r--r--generate/static.go17
-rw-r--r--server/a_server-packr.go15
-rw-r--r--server/static/generate.go3
-rw-r--r--server/static/static.go432
-rw-r--r--server/web.go6
-rw-r--r--vendor/github.com/gobuffalo/packr/LICENSE.txt8
-rw-r--r--vendor/github.com/gobuffalo/packr/README.md145
-rw-r--r--vendor/github.com/gobuffalo/packr/box.go241
-rw-r--r--vendor/github.com/gobuffalo/packr/builder/box.go76
-rw-r--r--vendor/github.com/gobuffalo/packr/builder/builder.go168
-rw-r--r--vendor/github.com/gobuffalo/packr/builder/clean.go32
-rw-r--r--vendor/github.com/gobuffalo/packr/builder/file.go10
-rw-r--r--vendor/github.com/gobuffalo/packr/builder/pkg.go7
-rw-r--r--vendor/github.com/gobuffalo/packr/builder/tmpl.go18
-rw-r--r--vendor/github.com/gobuffalo/packr/builder/visitor.go248
-rw-r--r--vendor/github.com/gobuffalo/packr/env.go27
-rw-r--r--vendor/github.com/gobuffalo/packr/file.go15
-rw-r--r--vendor/github.com/gobuffalo/packr/file_info.go38
-rw-r--r--vendor/github.com/gobuffalo/packr/go.mod3
-rw-r--r--vendor/github.com/gobuffalo/packr/packr.go55
-rw-r--r--vendor/github.com/gobuffalo/packr/physical_file.go13
-rw-r--r--vendor/github.com/gobuffalo/packr/virtual_file.go57
-rw-r--r--vendor/golang.org/x/sync/LICENSE27
-rw-r--r--vendor/golang.org/x/sync/PATENTS22
-rw-r--r--vendor/golang.org/x/sync/errgroup/errgroup.go67
-rw-r--r--vendor/vendor.json26
26 files changed, 1336 insertions, 440 deletions
diff --git a/generate/static.go b/generate/static.go
new file mode 100644
index 0000000..4a02562
--- /dev/null
+++ b/generate/static.go
@@ -0,0 +1,17 @@
+package main
+
+import (
+ "context"
+ "log"
+ "os"
+
+ "github.com/gobuffalo/packr/builder"
+)
+
+func main() {
+ b := builder.New(context.Background(), os.Args[1])
+ b.Compress = true
+ if err := b.Run(); err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/server/a_server-packr.go b/server/a_server-packr.go
new file mode 100644
index 0000000..09934f8
--- /dev/null
+++ b/server/a_server-packr.go
@@ -0,0 +1,15 @@
+// Code generated by github.com/gobuffalo/packr. DO NOT EDIT
+
+package server
+
+import "github.com/gobuffalo/packr"
+
+// You can use the "packr clean" command to clean up this,
+// and any other packr generated files.
+func init() {
+ packr.PackJSONBytes("static", "css/normalize.css", "\"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\"")
+ packr.PackJSONBytes("static", "css/skeleton.css", "\"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\"")
+ packr.PackJSONBytes("static", "generate.go", "\"H4sIAAAAAAAA/ypITM5OTE9VKC5JLMlM5uLS10/Pt0pPzUstSixJVUjPVygqzVPQ09PX09OHiepD1Oql5yuoBIS7cAECAAD//7fo0FxDAAAA\"")
+ packr.PackJSONBytes("static", "js/list.min.js", "\"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\"")
+ packr.PackJSONBytes("static", "js/table.js", "\"H4sIAAAAAAAA/3xUXW8aOxB951dMnIc1CjHk5ublcjdXVxEqrUgjBaRWiiJk1gO4GHtje/lQxX+v7AV2E2hfEGufM3PmeGamhc68NBosvg2k86jR0ib8bACsuAWLmYMUvgyfvrKcW4fUz6VjFl1utMMRbnyzu8d6PlEIKQiTFUvUnr0VaLdDVJh5Y2lymaH11xGVVKSJEVtIS/IHBrlU0nkSseu5VAg0wpk1a8cU6pmfwz10SrlQxmICFXp8NmvaicxdA0A6V6AI9bFMIbc03oTi2NTYHs/m9GjEki9wFNRQVC2QLeDWHjJES8w66I25pHZofch1fRNDQrjeHz+gUrTTZFJrtP3R4wBSQMUWuB1LcRZ8cwLOLHKPYsz9WcJfJwTc5NKiO4u+PUHnVupM5lydJ/x9QrC4Mgvcq2+34bMWuIEFbqUArgVUAdkxYIZKuZfOK8sUdy48AqTwQiKJvHY/4G4/4qqQdXBN5V0znsop0ItK4uHJ6rHvXt/Vk/wrdV54cH6rMCVLbmdS/9PpEvDbHFOSzTFbTMyGwIqrAlOSXFUPCFeQENB8GYBo/VgKAlLUPtr3Sal3V+tOnueoxcNcKkGtWZcdGn9rPWox+hq6dNdoHDtTGS4e0HpHuVK1GYUUNK7h++Og733+jG8FOk+PI4Za5Ebq4GbS5mIpdTtodOyHMzpKDNYdQ0JFuEoh+Y8rlXpbYHIYJstMjpomn3qjpHUElxPFuBC9FWp/3CVJUJ206vtlD3WoBW2GCoPKYf/p2/j/QXiXKVcOu7XCvZnNFPZia4vadpoU3hv9+5VDLkvmday3XCS1PBeH/+G8Mvdw2jxYU1H22g5Glfnf9RQZzs0a9lJJtAxQOfwDoy8Fvmc0do1fAQAA//8XtlT2mAUAAA==\"")
+}
diff --git a/server/static/generate.go b/server/static/generate.go
new file mode 100644
index 0000000..ee015c5
--- /dev/null
+++ b/server/static/generate.go
@@ -0,0 +1,3 @@
+package static
+
+//go:generate go run ../../generate/static.go $PWD
diff --git a/server/static/static.go b/server/static/static.go
deleted file mode 100644
index c0e4c64..0000000
--- a/server/static/static.go
+++ /dev/null
@@ -1,432 +0,0 @@
-// Code generated by "esc -ignore \.go -prefix server -o server/static/static.go -pkg static server/static"; DO NOT EDIT.
-
-package static
-
-import (
- "bytes"
- "compress/gzip"
- "encoding/base64"
- "io/ioutil"
- "net/http"
- "os"
- "path"
- "sync"
- "time"
-)
-
-type _escLocalFS struct{}
-
-var _escLocal _escLocalFS
-
-type _escStaticFS struct{}
-
-var _escStatic _escStaticFS
-
-type _escDirectory struct {
- fs http.FileSystem
- name string
-}
-
-type _escFile struct {
- compressed string
- size int64
- modtime int64
- local string
- isDir bool
-
- once sync.Once
- data []byte
- name string
-}
-
-func (_escLocalFS) Open(name string) (http.File, error) {
- f, present := _escData[path.Clean(name)]
- if !present {
- return nil, os.ErrNotExist
- }
- return os.Open(f.local)
-}
-
-func (_escStaticFS) prepare(name string) (*_escFile, error) {
- f, present := _escData[path.Clean(name)]
- if !present {
- return nil, os.ErrNotExist
- }
- var err error
- f.once.Do(func() {
- f.name = path.Base(name)
- if f.size == 0 {
- return
- }
- var gr *gzip.Reader
- b64 := base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(f.compressed))
- gr, err = gzip.NewReader(b64)
- if err != nil {
- return
- }
- f.data, err = ioutil.ReadAll(gr)
- })
- if err != nil {
- return nil, err
- }
- return f, nil
-}
-
-func (fs _escStaticFS) Open(name string) (http.File, error) {
- f, err := fs.prepare(name)
- if err != nil {
- return nil, err
- }
- return f.File()
-}
-
-func (dir _escDirectory) Open(name string) (http.File, error) {
- return dir.fs.Open(dir.name + name)
-}
-
-func (f *_escFile) File() (http.File, error) {
- type httpFile struct {
- *bytes.Reader
- *_escFile
- }
- return &httpFile{
- Reader: bytes.NewReader(f.data),
- _escFile: f,
- }, nil
-}
-
-func (f *_escFile) Close() error {
- return nil
-}
-
-func (f *_escFile) Readdir(count int) ([]os.FileInfo, error) {
- return nil, nil
-}
-
-func (f *_escFile) Stat() (os.FileInfo, error) {
- return f, nil
-}
-
-func (f *_escFile) Name() string {
- return f.name
-}
-
-func (f *_escFile) Size() int64 {
- return f.size
-}
-
-func (f *_escFile) Mode() os.FileMode {
- return 0
-}
-
-func (f *_escFile) ModTime() time.Time {
- return time.Unix(f.modtime, 0)
-}
-
-func (f *_escFile) IsDir() bool {
- return f.isDir
-}
-
-func (f *_escFile) Sys() interface{} {
- return f
-}
-
-// FS returns a http.Filesystem for the embedded assets. If useLocal is true,
-// the filesystem's contents are instead used.
-func FS(useLocal bool) http.FileSystem {
- if useLocal {
- return _escLocal
- }
- return _escStatic
-}
-
-// Dir returns a http.Filesystem for the embedded assets on a given prefix dir.
-// If useLocal is true, the filesystem's contents are instead used.
-func Dir(useLocal bool, name string) http.FileSystem {
- if useLocal {
- return _escDirectory{fs: _escLocal, name: name}
- }
- return _escDirectory{fs: _escStatic, name: name}
-}
-
-// FSByte returns the named file from the embedded assets. If useLocal is
-// true, the filesystem's contents are instead used.
-func FSByte(useLocal bool, name string) ([]byte, error) {
- if useLocal {
- f, err := _escLocal.Open(name)
- if err != nil {
- return nil, err
- }
- b, err := ioutil.ReadAll(f)
- _ = f.Close()
- return b, err
- }
- f, err := _escStatic.prepare(name)
- if err != nil {
- return nil, err
- }
- return f.data, nil
-}
-
-// FSMustByte is the same as FSByte, but panics if name is not present.
-func FSMustByte(useLocal bool, name string) []byte {
- b, err := FSByte(useLocal, name)
- if err != nil {
- panic(err)
- }
- return b
-}
-
-// FSString is the string version of FSByte.
-func FSString(useLocal bool, name string) (string, error) {
- b, err := FSByte(useLocal, name)
- return string(b), err
-}
-
-// FSMustString is the string version of FSMustByte.
-func FSMustString(useLocal bool, name string) string {
- return string(FSMustByte(useLocal, name))
-}
-
-var _escData = map[string]*_escFile{
-
- "/static/css/normalize.css": {
- local: "server/static/css/normalize.css",
- size: 7797,
- modtime: 1508096488,
- compressed: `
-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
-`,
- },
-
- "/static/css/skeleton.css": {
- local: "server/static/css/skeleton.css",
- size: 11458,
- modtime: 1508096488,
- compressed: `
-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
-T++HaGcN7f8DAAD//7viGWrCLAAA
-`,
- },
-
- "/static/js/list.min.js": {
- local: "server/static/js/list.min.js",
- size: 15785,
- modtime: 1508096488,
- compressed: `
-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
-/zgbhRSpPQAA
-`,
- },
-
- "/static/js/table.js": {
- local: "server/static/js/table.js",
- size: 1432,
- modtime: 1508096488,
- compressed: `
-H4sIAAAAAAAC/3xUXW8aOxB951dMnIc1CjHk5ublcjdXVxEqrUgjBaRWiiJk1gO4GHtje/lQxX+v7AV2
-E2hfEGufM3PmeGamhc68NBosvg2k86jR0ib8bACsuAWLmYMUvgyfvrKcW4fUz6VjFl1utMMRbnyzu8d6
-PlEIKQiTFUvUnr0VaLdDVJh5Y2lymaH11xGVVKSJEVtIS/IHBrlU0nkSseu5VAg0wpk1a8cU6pmfwz10
-SrlQxmICFXp8NmvaicxdA0A6V6AI9bFMIbc03oTi2NTYHs/m9GjEki9wFNRQVC2QLeDWHjJES8w66I25
-pHZofch1fRNDQrjeHz+gUrTTZFJrtP3R4wBSQMUWuB1LcRZ8cwLOLHKPYsz9WcJfJwTc5NKiO4u+PUHn
-VupM5lydJ/x9QrC4Mgvcq2+34bMWuIEFbqUArgVUAdkxYIZKuZfOK8sUdy48AqTwQiKJvHY/4G4/4qqQ
-dXBN5V0znsop0ItK4uHJ6rHvXt/Vk/wrdV54cH6rMCVLbmdS/9PpEvDbHFOSzTFbTMyGwIqrAlOSXFUP
-CFeQENB8GYBo/VgKAlLUPtr3Sal3V+tOnueoxcNcKkGtWZcdGn9rPWox+hq6dNdoHDtTGS4e0HpHuVK1
-GYUUNK7h++Og733+jG8FOk+PI4Za5Ebq4GbS5mIpdTtodOyHMzpKDNYdQ0JFuEoh+Y8rlXpbYHIYJstM
-jpomn3qjpHUElxPFuBC9FWp/3CVJUJ206vtlD3WoBW2GCoPKYf/p2/j/QXiXKVcOu7XCvZnNFPZia4va
-dpoU3hv9+5VDLkvmday3XCS1PBeH/+G8Mvdw2jxYU1H22g5Glfnf9RQZzs0a9lJJtAxQOfwDoy8Fvmc0
-do1fAQAA//8XtlT2mAUAAA==
-`,
- },
-
- "/": {
- isDir: true,
- local: "server",
- },
-
- "/static": {
- isDir: true,
- local: "server/static",
- },
-
- "/static/css": {
- isDir: true,
- local: "server/static/css",
- },
-
- "/static/js": {
- isDir: true,
- local: "server/static/js",
- },
-}
diff --git a/server/web.go b/server/web.go
index 08162d5..a32dd40 100644
--- a/server/web.go
+++ b/server/web.go
@@ -14,6 +14,8 @@ import (
"strconv"
"strings"
+ "github.com/gobuffalo/packr"
+
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus/promhttp"
@@ -26,7 +28,6 @@ import (
"github.com/nsheridan/cashier/lib"
"github.com/nsheridan/cashier/server/auth"
"github.com/nsheridan/cashier/server/config"
- "github.com/nsheridan/cashier/server/static"
"github.com/nsheridan/cashier/server/templates"
)
@@ -309,7 +310,8 @@ func runHTTPServer(conf *config.Server, l net.Listener) {
r.Methods("GET").Path("/admin/certs.json").Handler(appHandler{ctx, listCertsJSONHandler})
r.Methods("GET").Path("/metrics").Handler(promhttp.Handler())
r.Methods("GET").Path("/healthcheck").HandlerFunc(healthcheck)
- r.PathPrefix("/").Handler(http.FileServer(static.FS(false)))
+ box := packr.NewBox("static")
+ r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(box)))
h := handlers.LoggingHandler(logfile, r)
s := &http.Server{
Handler: h,
diff --git a/vendor/github.com/gobuffalo/packr/LICENSE.txt b/vendor/github.com/gobuffalo/packr/LICENSE.txt
new file mode 100644
index 0000000..3ccb336
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/LICENSE.txt
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2016 Mark Bates
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/gobuffalo/packr/README.md b/vendor/github.com/gobuffalo/packr/README.md
new file mode 100644
index 0000000..d1144b1
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/README.md
@@ -0,0 +1,145 @@
+# packr
+
+[![GoDoc](https://godoc.org/github.com/gobuffalo/packr?status.svg)](https://godoc.org/github.com/gobuffalo/packr)
+
+Packr is a simple solution for bundling static assets inside of Go binaries. Most importantly it does it in a way that is friendly to developers while they are developing.
+
+## Intro Video
+
+To get an idea of the what and why of packr, please enjoy this short video: [https://vimeo.com/219863271](https://vimeo.com/219863271).
+
+## Installation
+
+```text
+$ go get -u github.com/gobuffalo/packr/...
+```
+
+## Usage
+
+### In Code
+
+The first step in using Packr is to create a new box. A box represents a folder on disk. Once you have a box you can get `string` or `[]byte` representations of the file.
+
+```go
+// set up a new box by giving it a (relative) path to a folder on disk:
+box := packr.NewBox("./templates")
+
+// Get the string representation of a file:
+html := box.String("index.html")
+
+// Get the string representation of a file, or an error if it doesn't exist:
+html, err := box.MustString("index.html")
+
+// Get the []byte representation of a file:
+html := box.Bytes("index.html")
+
+// Get the []byte representation of a file, or an error if it doesn't exist:
+html, err := box.MustBytes("index.html")
+```
+
+### What is a Box?
+
+A box represents a folder, and any sub-folders, on disk that you want to have access to in your binary. When compiling a binary using the `packr` CLI the contents of the folder will be converted into Go files that can be compiled inside of a "standard" go binary. Inside of the compiled binary the files will be read from memory. When working locally the files will be read directly off of disk. This is a seamless switch that doesn't require any special attention on your part.
+
+#### Example
+
+Assume the follow directory structure:
+
+```
+├── main.go
+└── templates
+ ├── admin
+ │   └── index.html
+ └── index.html
+```
+
+The following program will read the `./templates/admin/index.html` file and print it out.
+
+```go
+package main
+
+import (
+ "fmt"
+
+ "github.com/gobuffalo/packr"
+)
+
+func main() {
+ box := packr.NewBox("./templates")
+
+ s := box.String("admin/index.html")
+ fmt.Println(s)
+}
+```
+
+### Development Made Easy
+
+In order to get static files into a Go binary, those files must first be converted to Go code. To do that, Packr, ships with a few tools to help build binaries. See below.
+
+During development, however, it is painful to have to keep running a tool to compile those files.
+
+Packr uses the following resolution rules when looking for a file:
+
+1. Look for the file in-memory (inside a Go binary)
+1. Look for the file on disk (during development)
+
+Because Packr knows how to fall through to the file system, developers don't need to worry about constantly compiling their static files into a binary. They can work unimpeded.
+
+Packr takes file resolution a step further. When declaring a new box you use a relative path, `./templates`. When Packr recieves this call it calculates out the absolute path to that directory. By doing this it means you can be guaranteed that Packr can find your files correctly, even if you're not running in the directory that the box was created in. This helps with the problem of testing, where Go changes the `pwd` for each package, making relative paths difficult to work with. This is not a problem when using Packr.
+
+---
+
+## Usage with HTTP
+
+A box implements the [`http.FileSystem`](https://golang.org/pkg/net/http/#FileSystemhttps://golang.org/pkg/net/http/#FileSystem) interface, meaning it can be used to serve static files.
+
+```go
+package main
+
+import (
+ "net/http"
+
+ "github.com/gobuffalo/packr"
+)
+
+func main() {
+ box := packr.NewBox("./templates")
+
+ http.Handle("/", http.FileServer(box))
+ http.ListenAndServe(":3000", nil)
+}
+```
+
+---
+
+## Building a Binary (the easy way)
+
+When it comes time to build, or install, your Go binary, simply use `packr build` or `packr install` just as you would `go build` or `go install`. All flags for the `go` tool are supported and everything works the way you expect, the only difference is your static assets are now bundled in the generated binary. If you want more control over how this happens, looking at the following section on building binaries (the hard way).
+
+## Building a Binary (the hard way)
+
+Before you build your Go binary, run the `packr` command first. It will look for all the boxes in your code and then generate `.go` files that pack the static files into bytes that can be bundled into the Go binary.
+
+```
+$ packr
+```
+
+Then run your `go build command` like normal.
+
+*NOTE*: It is not recommended to check-in these generated `-packr.go` files. They can be large, and can easily become out of date if not careful. It is recommended that you always run `packr clean` after running the `packr` tool.
+
+#### Cleaning Up
+
+When you're done it is recommended that you run the `packr clean` command. This will remove all of the generated files that Packr created for you.
+
+```
+$ packr clean
+```
+
+Why do you want to do this? Packr first looks to the information stored in these generated files, if the information isn't there it looks to disk. This makes it easy to work with in development.
+
+---
+
+## Debugging
+
+The `packr` command passes all arguments down to the underlying `go` command, this includes the `-v` flag to print out `go build` information. Packr looks for the `-v` flag, and will turn on its own verbose logging. This is very useful for trying to understand what the `packr` command is doing when it is run.
diff --git a/vendor/github.com/gobuffalo/packr/box.go b/vendor/github.com/gobuffalo/packr/box.go
new file mode 100644
index 0000000..30eb6e2
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/box.go
@@ -0,0 +1,241 @@
+package packr
+
+import (
+ "bytes"
+ "compress/gzip"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "path"
+ "path/filepath"
+ "runtime"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+var (
+ ErrResOutsideBox = errors.New("Can't find a resource outside the box")
+)
+
+// NewBox returns a Box that can be used to
+// retrieve files from either disk or the embedded
+// binary.
+func NewBox(path string) Box {
+ var cd string
+ if !filepath.IsAbs(path) {
+ _, filename, _, _ := runtime.Caller(1)
+ cd = filepath.Dir(filename)
+ }
+
+ // this little hack courtesy of the `-cover` flag!!
+ cov := filepath.Join("_test", "_obj_test")
+ cd = strings.Replace(cd, string(filepath.Separator)+cov, "", 1)
+ if !filepath.IsAbs(cd) && cd != "" {
+ cd = filepath.Join(GoPath(), "src", cd)
+ }
+
+ return Box{
+ Path: path,
+ callingDir: cd,
+ data: map[string][]byte{},
+ }
+}
+
+// Box represent a folder on a disk you want to
+// have access to in the built Go binary.
+type Box struct {
+ Path string
+ callingDir string
+ data map[string][]byte
+ directories map[string]bool
+}
+
+func (b Box) AddString(path string, t string) {
+ b.AddBytes(path, []byte(t))
+}
+
+func (b Box) AddBytes(path string, t []byte) {
+ b.data[path] = t
+}
+
+// String of the file asked for or an empty string.
+func (b Box) String(name string) string {
+ return string(b.Bytes(name))
+}
+
+// MustString returns either the string of the requested
+// file or an error if it can not be found.
+func (b Box) MustString(name string) (string, error) {
+ bb, err := b.MustBytes(name)
+ return string(bb), err
+}
+
+// Bytes of the file asked for or an empty byte slice.
+func (b Box) Bytes(name string) []byte {
+ bb, _ := b.MustBytes(name)
+ return bb
+}
+
+// MustBytes returns either the byte slice of the requested
+// file or an error if it can not be found.
+func (b Box) MustBytes(name string) ([]byte, error) {
+ f, err := b.find(name)
+ if err == nil {
+ bb := &bytes.Buffer{}
+ bb.ReadFrom(f)
+ return bb.Bytes(), err
+ }
+ return nil, err
+}
+
+// Has returns true if the resource exists in the box
+func (b Box) Has(name string) bool {
+ _, err := b.find(name)
+ if err != nil {
+ return false
+ }
+ return true
+}
+
+func (b Box) decompress(bb []byte) []byte {
+ reader, err := gzip.NewReader(bytes.NewReader(bb))
+ if err != nil {
+ return bb
+ }
+ data, err := ioutil.ReadAll(reader)
+ if err != nil {
+ return bb
+ }
+ return data
+}
+
+func (b Box) find(name string) (File, error) {
+ if bb, ok := b.data[name]; ok {
+ return newVirtualFile(name, bb), nil
+ }
+ if b.directories == nil {
+ b.indexDirectories()
+ }
+
+ cleanName := filepath.ToSlash(filepath.Clean(name))
+ // Ensure name is not outside the box
+ if strings.HasPrefix(cleanName, "../") {
+ return nil, ErrResOutsideBox
+ }
+ // Absolute name is considered as relative to the box root
+ cleanName = strings.TrimPrefix(cleanName, "/")
+
+ // Try to get the resource from the box
+ if _, ok := data[b.Path]; ok {
+ if bb, ok := data[b.Path][cleanName]; ok {
+ bb = b.decompress(bb)
+ return newVirtualFile(cleanName, bb), nil
+ }
+ if filepath.Ext(cleanName) != "" {
+ // The Handler created by http.FileSystem checks for those errors and
+ // returns http.StatusNotFound instead of http.StatusInternalServerError.
+ return nil, os.ErrNotExist
+ }
+ if _, ok := b.directories[cleanName]; ok {
+ return newVirtualDir(cleanName), nil
+ }
+ return nil, os.ErrNotExist
+ }
+
+ // Not found in the box virtual fs, try to get it from the file system
+ cleanName = filepath.FromSlash(cleanName)
+ p := filepath.Join(b.callingDir, b.Path, cleanName)
+ return fileFor(p, cleanName)
+}
+
+type WalkFunc func(string, File) error
+
+func (b Box) Walk(wf WalkFunc) error {
+ if data[b.Path] == nil {
+ base, err := filepath.EvalSymlinks(filepath.Join(b.callingDir, b.Path))
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ return filepath.Walk(base, func(path string, info os.FileInfo, err error) error {
+ cleanName, err := filepath.Rel(base, path)
+ if err != nil {
+ cleanName = strings.TrimPrefix(path, base)
+ }
+ cleanName = filepath.ToSlash(filepath.Clean(cleanName))
+ cleanName = strings.TrimPrefix(cleanName, "/")
+ cleanName = filepath.FromSlash(cleanName)
+ if info == nil || info.IsDir() {
+ return nil
+ }
+
+ file, err := fileFor(path, cleanName)
+ if err != nil {
+ return err
+ }
+ return wf(cleanName, file)
+ })
+ }
+ for n := range data[b.Path] {
+ f, err := b.find(n)
+ if err != nil {
+ return err
+ }
+ err = wf(n, f)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// Open returns a File using the http.File interface
+func (b Box) Open(name string) (http.File, error) {
+ return b.find(name)
+}
+
+// List shows "What's in the box?"
+func (b Box) List() []string {
+ var keys []string
+
+ if b.data == nil || len(b.data) == 0 {
+ b.Walk(func(path string, info File) error {
+ finfo, _ := info.FileInfo()
+ if !finfo.IsDir() {
+ keys = append(keys, finfo.Name())
+ }
+ return nil
+ })
+ } else {
+ for k := range b.data {
+ keys = append(keys, k)
+ }
+ }
+ return keys
+}
+
+func (b *Box) indexDirectories() {
+ b.directories = map[string]bool{}
+ if _, ok := data[b.Path]; ok {
+ for name := range data[b.Path] {
+ prefix, _ := path.Split(name)
+ // Even on Windows the suffix appears to be a /
+ prefix = strings.TrimSuffix(prefix, "/")
+ b.directories[prefix] = true
+ }
+ }
+}
+
+func fileFor(p string, name string) (File, error) {
+ fi, err := os.Stat(p)
+ if err != nil {
+ return nil, err
+ }
+ if fi.IsDir() {
+ return newVirtualDir(p), nil
+ }
+ if bb, err := ioutil.ReadFile(p); err == nil {
+ return newVirtualFile(name, bb), nil
+ }
+ return nil, os.ErrNotExist
+}
diff --git a/vendor/github.com/gobuffalo/packr/builder/box.go b/vendor/github.com/gobuffalo/packr/builder/box.go
new file mode 100644
index 0000000..8490455
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/builder/box.go
@@ -0,0 +1,76 @@
+package builder
+
+import (
+ "bytes"
+ "compress/gzip"
+ "encoding/json"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+type box struct {
+ Name string
+ Files []file
+ compress bool
+}
+
+func (b *box) Walk(root string) error {
+ root, err := filepath.EvalSymlinks(root)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ if _, err := os.Stat(root); err != nil {
+ // return nil
+ return errors.Errorf("could not find folder for box: %s", root)
+ }
+ return filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
+ if info == nil || info.IsDir() || strings.HasSuffix(info.Name(), "-packr.go") {
+ return nil
+ }
+ name := strings.Replace(path, root+string(os.PathSeparator), "", 1)
+ name = strings.Replace(name, "\\", "/", -1)
+ f := file{
+ Name: name,
+ }
+
+ DebugLog("packing file %s\n", f.Name)
+
+ bb, err := ioutil.ReadFile(path)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ if b.compress {
+ bb, err = compressFile(bb)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ bb, err = json.Marshal(bb)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ f.Contents = strings.Replace(string(bb), "\"", "\\\"", -1)
+
+ DebugLog("packed file %s\n", f.Name)
+ b.Files = append(b.Files, f)
+ return nil
+ })
+}
+
+func compressFile(bb []byte) ([]byte, error) {
+ var buf bytes.Buffer
+ writer := gzip.NewWriter(&buf)
+ _, err := writer.Write(bb)
+ if err != nil {
+ return bb, errors.WithStack(err)
+ }
+ err = writer.Close()
+ if err != nil {
+ return bb, errors.WithStack(err)
+ }
+ return buf.Bytes(), nil
+}
diff --git a/vendor/github.com/gobuffalo/packr/builder/builder.go b/vendor/github.com/gobuffalo/packr/builder/builder.go
new file mode 100644
index 0000000..c689500
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/builder/builder.go
@@ -0,0 +1,168 @@
+package builder
+
+import (
+ "context"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "sync"
+ "text/template"
+
+ "github.com/pkg/errors"
+ "golang.org/x/sync/errgroup"
+)
+
+var DebugLog func(string, ...interface{})
+
+func init() {
+ DebugLog = func(string, ...interface{}) {}
+}
+
+var invalidFilePattern = regexp.MustCompile(`(_test|-packr).go$`)
+
+// Builder scans folders/files looking for `packr.NewBox` and then compiling
+// the required static files into `<package-name>-packr.go` files so they can
+// be built into Go binaries.
+type Builder struct {
+ context.Context
+ RootPath string
+ IgnoredBoxes []string
+ IgnoredFolders []string
+ pkgs map[string]pkg
+ moot *sync.Mutex
+ Compress bool
+}
+
+// Run the builder.
+func (b *Builder) Run() error {
+ wg := &errgroup.Group{}
+ root, err := filepath.EvalSymlinks(b.RootPath)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
+ if info == nil {
+ return filepath.SkipDir
+ }
+
+ base := strings.ToLower(filepath.Base(path))
+ if strings.HasPrefix(base, "_") {
+ return filepath.SkipDir
+ }
+ for _, f := range b.IgnoredFolders {
+ if strings.ToLower(f) == base {
+ return filepath.SkipDir
+ }
+ }
+ if !info.IsDir() {
+ wg.Go(func() error {
+ return b.process(path)
+ })
+ }
+ return nil
+ })
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ if err := wg.Wait(); err != nil {
+ return errors.WithStack(err)
+ }
+ return b.dump()
+}
+
+func (b *Builder) dump() error {
+ for _, p := range b.pkgs {
+ name := filepath.Join(p.Dir, "a_"+p.Name+"-packr.go")
+ f, err := os.Create(name)
+ defer f.Close()
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ t, err := template.New("").Parse(tmpl)
+
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ err = t.Execute(f, p)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ return nil
+}
+
+func (b *Builder) process(path string) error {
+ ext := filepath.Ext(path)
+ if ext != ".go" || invalidFilePattern.MatchString(path) {
+ return nil
+ }
+
+ v := newVisitor(path)
+ if err := v.Run(); err != nil {
+ return errors.WithStack(err)
+ }
+
+ pk := pkg{
+ Dir: filepath.Dir(path),
+ Boxes: []box{},
+ Name: v.Package,
+ }
+
+ for _, n := range v.Boxes {
+ var ignored bool
+ for _, i := range b.IgnoredBoxes {
+ if n == i {
+ // this is an ignored box
+ ignored = true
+ break
+ }
+ }
+ if ignored {
+ continue
+ }
+ bx := &box{
+ Name: n,
+ Files: []file{},
+ compress: b.Compress,
+ }
+ DebugLog("building box %s\n", bx.Name)
+ p := filepath.Join(pk.Dir, bx.Name)
+ if err := bx.Walk(p); err != nil {
+ return errors.WithStack(err)
+ }
+ if len(bx.Files) > 0 {
+ pk.Boxes = append(pk.Boxes, *bx)
+ }
+ DebugLog("built box %s with %q\n", bx.Name, bx.Files)
+ }
+
+ if len(pk.Boxes) > 0 {
+ b.addPkg(pk)
+ }
+ return nil
+}
+
+func (b *Builder) addPkg(p pkg) {
+ b.moot.Lock()
+ defer b.moot.Unlock()
+ if _, ok := b.pkgs[p.Name]; !ok {
+ b.pkgs[p.Name] = p
+ return
+ }
+ pp := b.pkgs[p.Name]
+ pp.Boxes = append(pp.Boxes, p.Boxes...)
+ b.pkgs[p.Name] = pp
+}
+
+// New Builder with a given context and path
+func New(ctx context.Context, path string) *Builder {
+ return &Builder{
+ Context: ctx,
+ RootPath: path,
+ IgnoredBoxes: []string{},
+ IgnoredFolders: []string{"vendor", ".git", "node_modules", ".idea"},
+ pkgs: map[string]pkg{},
+ moot: &sync.Mutex{},
+ }
+}
diff --git a/vendor/github.com/gobuffalo/packr/builder/clean.go b/vendor/github.com/gobuffalo/packr/builder/clean.go
new file mode 100644
index 0000000..688ebf5
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/builder/clean.go
@@ -0,0 +1,32 @@
+package builder
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+// Clean up an *-packr.go files
+func Clean(root string) {
+ root, _ = filepath.EvalSymlinks(root)
+ filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
+ base := filepath.Base(path)
+ if base == ".git" || base == "vendor" || base == "node_modules" {
+ return filepath.SkipDir
+ }
+ if info == nil || info.IsDir() {
+ return nil
+ }
+ if strings.Contains(base, "-packr.go") {
+ err := os.Remove(path)
+ if err != nil {
+ fmt.Println(err)
+ return errors.WithStack(err)
+ }
+ }
+ return nil
+ })
+}
diff --git a/vendor/github.com/gobuffalo/packr/builder/file.go b/vendor/github.com/gobuffalo/packr/builder/file.go
new file mode 100644
index 0000000..d439d49
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/builder/file.go
@@ -0,0 +1,10 @@
+package builder
+
+type file struct {
+ Name string
+ Contents string
+}
+
+func (f file) String() string {
+ return f.Name
+}
diff --git a/vendor/github.com/gobuffalo/packr/builder/pkg.go b/vendor/github.com/gobuffalo/packr/builder/pkg.go
new file mode 100644
index 0000000..fbad2ac
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/builder/pkg.go
@@ -0,0 +1,7 @@
+package builder
+
+type pkg struct {
+ Name string
+ Dir string
+ Boxes []box
+}
diff --git a/vendor/github.com/gobuffalo/packr/builder/tmpl.go b/vendor/github.com/gobuffalo/packr/builder/tmpl.go
new file mode 100644
index 0000000..ffe47c1
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/builder/tmpl.go
@@ -0,0 +1,18 @@
+package builder
+
+var tmpl = `// Code generated by github.com/gobuffalo/packr. DO NOT EDIT
+
+package {{.Name}}
+
+import "github.com/gobuffalo/packr"
+
+// You can use the "packr clean" command to clean up this,
+// and any other packr generated files.
+func init() {
+ {{- range $box := .Boxes }}
+ {{- range .Files }}
+ packr.PackJSONBytes("{{$box.Name}}", "{{.Name}}", "{{.Contents}}")
+ {{- end }}
+ {{- end }}
+}
+`
diff --git a/vendor/github.com/gobuffalo/packr/builder/visitor.go b/vendor/github.com/gobuffalo/packr/builder/visitor.go
new file mode 100644
index 0000000..ea24bde
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/builder/visitor.go
@@ -0,0 +1,248 @@
+package builder
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "io/ioutil"
+ "sort"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+type visitor struct {
+ Path string
+ Package string
+ Boxes []string
+ Errors []error
+}
+
+func newVisitor(path string) *visitor {
+ return &visitor{
+ Path: path,
+ Boxes: []string{},
+ Errors: []error{},
+ }
+}
+
+func (v *visitor) Run() error {
+ b, err := ioutil.ReadFile(v.Path)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+
+ fset := token.NewFileSet()
+ file, err := parser.ParseFile(fset, v.Path, string(b), parser.ParseComments)
+ if err != nil {
+ return errors.WithStack(err)
+ }
+
+ v.Package = file.Name.Name
+ ast.Walk(v, file)
+
+ m := map[string]string{}
+ for _, s := range v.Boxes {
+ m[s] = s
+ }
+ v.Boxes = []string{}
+ for k := range m {
+ v.Boxes = append(v.Boxes, k)
+ }
+
+ sort.Strings(v.Boxes)
+
+ if len(v.Errors) > 0 {
+ s := make([]string, len(v.Errors))
+ for i, e := range v.Errors {
+ s[i] = e.Error()
+ }
+ return errors.New(strings.Join(s, "\n"))
+ }
+ return nil
+}
+
+func (v *visitor) Visit(node ast.Node) ast.Visitor {
+ if node == nil {
+ return v
+ }
+ if err := v.eval(node); err != nil {
+ v.Errors = append(v.Errors, err)
+ }
+ return v
+}
+
+func (v *visitor) eval(node ast.Node) error {
+ switch t := node.(type) {
+ case *ast.CallExpr:
+ return v.evalExpr(t)
+ case *ast.Ident:
+ return v.evalIdent(t)
+ case *ast.GenDecl:
+ for _, n := range t.Specs {
+ if err := v.eval(n); err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ case *ast.FuncDecl:
+ if t.Body == nil {
+ return nil
+ }
+ for _, b := range t.Body.List {
+ if err := v.evalStmt(b); err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ return nil
+ case *ast.ValueSpec:
+ for _, e := range t.Values {
+ if err := v.evalExpr(e); err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ }
+ return nil
+}
+
+func (v *visitor) evalStmt(stmt ast.Stmt) error {
+ switch t := stmt.(type) {
+ case *ast.ExprStmt:
+ return v.evalExpr(t.X)
+ case *ast.AssignStmt:
+ for _, e := range t.Rhs {
+ if err := v.evalArgs(e); err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ }
+ return nil
+}
+
+func (v *visitor) evalExpr(expr ast.Expr) error {
+ switch t := expr.(type) {
+ case *ast.CallExpr:
+ if t.Fun == nil {
+ return nil
+ }
+ for _, a := range t.Args {
+ switch at := a.(type) {
+ case *ast.CallExpr:
+ if sel, ok := t.Fun.(*ast.SelectorExpr); ok {
+ return v.evalSelector(at, sel)
+ }
+
+ if err := v.evalArgs(at); err != nil {
+ return errors.WithStack(err)
+ }
+ case *ast.CompositeLit:
+ for _, e := range at.Elts {
+ if err := v.evalExpr(e); err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ }
+ }
+ if ft, ok := t.Fun.(*ast.SelectorExpr); ok {
+ return v.evalSelector(t, ft)
+ }
+ case *ast.KeyValueExpr:
+ return v.evalExpr(t.Value)
+ }
+ return nil
+}
+
+func (v *visitor) evalArgs(expr ast.Expr) error {
+ switch at := expr.(type) {
+ case *ast.CompositeLit:
+ for _, e := range at.Elts {
+ if err := v.evalExpr(e); err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ // case *ast.BasicLit:
+ // fmt.Println("evalArgs", at.Value)
+ // v.addBox(at.Value)
+ case *ast.CallExpr:
+ if at.Fun == nil {
+ return nil
+ }
+ switch st := at.Fun.(type) {
+ case *ast.SelectorExpr:
+ if err := v.evalSelector(at, st); err != nil {
+ return errors.WithStack(err)
+ }
+ case *ast.Ident:
+ return v.evalIdent(st)
+ }
+ for _, a := range at.Args {
+ if err := v.evalArgs(a); err != nil {
+ return errors.WithStack(err)
+ }
+ }
+ }
+ return nil
+}
+
+func (v *visitor) evalSelector(expr *ast.CallExpr, sel *ast.SelectorExpr) error {
+ x, ok := sel.X.(*ast.Ident)
+ if !ok {
+ return nil
+ }
+ if x.Name == "packr" && sel.Sel.Name == "NewBox" {
+ for _, e := range expr.Args {
+ switch at := e.(type) {
+ case *ast.Ident:
+ switch at.Obj.Kind {
+ case ast.Var:
+ if as, ok := at.Obj.Decl.(*ast.AssignStmt); ok {
+ v.addVariable(as)
+ }
+ case ast.Con:
+ if vs, ok := at.Obj.Decl.(*ast.ValueSpec); ok {
+ v.addConstant(vs)
+ }
+ }
+ return v.evalIdent(at)
+ case *ast.BasicLit:
+ v.addBox(at.Value)
+ case *ast.CallExpr:
+ return v.evalExpr(at)
+ }
+ }
+ }
+
+ return nil
+}
+
+func (v *visitor) evalIdent(i *ast.Ident) error {
+ if i.Obj == nil {
+ return nil
+ }
+ if s, ok := i.Obj.Decl.(*ast.AssignStmt); ok {
+ return v.evalStmt(s)
+ }
+ return nil
+}
+
+func (v *visitor) addBox(b string) {
+ b = strings.Replace(b, "\"", "", -1)
+ v.Boxes = append(v.Boxes, b)
+}
+
+func (v *visitor) addVariable(as *ast.AssignStmt) error {
+ if len(as.Rhs) == 1 {
+ if bs, ok := as.Rhs[0].(*ast.BasicLit); ok {
+ v.addBox(bs.Value)
+ }
+ }
+ return nil
+}
+
+func (v *visitor) addConstant(vs *ast.ValueSpec) error {
+ if len(vs.Values) == 1 {
+ if bs, ok := vs.Values[0].(*ast.BasicLit); ok {
+ v.addBox(bs.Value)
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/gobuffalo/packr/env.go b/vendor/github.com/gobuffalo/packr/env.go
new file mode 100644
index 0000000..2c744e7
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/env.go
@@ -0,0 +1,27 @@
+package packr
+
+import (
+ "go/build"
+ "os"
+ "strings"
+)
+
+// GoPath returns the current GOPATH env var
+// or if it's missing, the default.
+func GoPath() string {
+ go_path := strings.Split(os.Getenv("GOPATH"), string(os.PathListSeparator))
+ if len(go_path) == 0 || go_path[0] == "" {
+ return build.Default.GOPATH
+ }
+ return go_path[0]
+}
+
+// GoBin returns the current GO_BIN env var
+// or if it's missing, a default of "go"
+func GoBin() string {
+ go_bin := os.Getenv("GO_BIN")
+ if go_bin == "" {
+ return "go"
+ }
+ return go_bin
+}
diff --git a/vendor/github.com/gobuffalo/packr/file.go b/vendor/github.com/gobuffalo/packr/file.go
new file mode 100644
index 0000000..8337d62
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/file.go
@@ -0,0 +1,15 @@
+package packr
+
+import (
+ "io"
+ "os"
+)
+
+type File interface {
+ io.ReadCloser
+ io.Writer
+ FileInfo() (os.FileInfo, error)
+ Readdir(count int) ([]os.FileInfo, error)
+ Seek(offset int64, whence int) (int64, error)
+ Stat() (os.FileInfo, error)
+}
diff --git a/vendor/github.com/gobuffalo/packr/file_info.go b/vendor/github.com/gobuffalo/packr/file_info.go
new file mode 100644
index 0000000..e7931d2
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/file_info.go
@@ -0,0 +1,38 @@
+package packr
+
+import (
+ "os"
+ "time"
+)
+
+type fileInfo struct {
+ Path string
+ Contents []byte
+ size int64
+ modTime time.Time
+ isDir bool
+}
+
+func (f fileInfo) Name() string {
+ return f.Path
+}
+
+func (f fileInfo) Size() int64 {
+ return f.size
+}
+
+func (f fileInfo) Mode() os.FileMode {
+ return 0444
+}
+
+func (f fileInfo) ModTime() time.Time {
+ return f.modTime
+}
+
+func (f fileInfo) IsDir() bool {
+ return f.isDir
+}
+
+func (f fileInfo) Sys() interface{} {
+ return nil
+}
diff --git a/vendor/github.com/gobuffalo/packr/go.mod b/vendor/github.com/gobuffalo/packr/go.mod
new file mode 100644
index 0000000..482c1a8
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/go.mod
@@ -0,0 +1,3 @@
+module github.com/gobuffalo/packr
+
+require github.com/pkg/errors v0.8.0
diff --git a/vendor/github.com/gobuffalo/packr/packr.go b/vendor/github.com/gobuffalo/packr/packr.go
new file mode 100644
index 0000000..d282994
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/packr.go
@@ -0,0 +1,55 @@
+package packr
+
+import (
+ "bytes"
+ "compress/gzip"
+ "encoding/json"
+ "sync"
+)
+
+var gil = &sync.Mutex{}
+var data = map[string]map[string][]byte{}
+
+// PackBytes packs bytes for a file into a box.
+func PackBytes(box string, name string, bb []byte) {
+ gil.Lock()
+ defer gil.Unlock()
+ if _, ok := data[box]; !ok {
+ data[box] = map[string][]byte{}
+ }
+ data[box][name] = bb
+}
+
+// PackBytesGzip packets the gzipped compressed bytes into a box.
+func PackBytesGzip(box string, name string, bb []byte) error {
+ var buf bytes.Buffer
+ w := gzip.NewWriter(&buf)
+ _, err := w.Write(bb)
+ if err != nil {
+ return err
+ }
+ err = w.Close()
+ if err != nil {
+ return err
+ }
+ PackBytes(box, name, buf.Bytes())
+ return nil
+}
+
+// PackJSONBytes packs JSON encoded bytes for a file into a box.
+func PackJSONBytes(box string, name string, jbb string) error {
+ var bb []byte
+ err := json.Unmarshal([]byte(jbb), &bb)
+ if err != nil {
+ return err
+ }
+ PackBytes(box, name, bb)
+ return nil
+}
+
+// UnpackBytes unpacks bytes for specific box.
+func UnpackBytes(box string) {
+ gil.Lock()
+ defer gil.Unlock()
+ delete(data, box)
+}
diff --git a/vendor/github.com/gobuffalo/packr/physical_file.go b/vendor/github.com/gobuffalo/packr/physical_file.go
new file mode 100644
index 0000000..bf2d817
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/physical_file.go
@@ -0,0 +1,13 @@
+package packr
+
+import "os"
+
+var _ File = physicalFile{}
+
+type physicalFile struct {
+ *os.File
+}
+
+func (p physicalFile) FileInfo() (os.FileInfo, error) {
+ return os.Stat(p.Name())
+}
diff --git a/vendor/github.com/gobuffalo/packr/virtual_file.go b/vendor/github.com/gobuffalo/packr/virtual_file.go
new file mode 100644
index 0000000..955db8c
--- /dev/null
+++ b/vendor/github.com/gobuffalo/packr/virtual_file.go
@@ -0,0 +1,57 @@
+package packr
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "time"
+)
+
+var virtualFileModTime = time.Now()
+var _ File = virtualFile{}
+
+type virtualFile struct {
+ *bytes.Reader
+ Name string
+ info fileInfo
+}
+
+func (f virtualFile) FileInfo() (os.FileInfo, error) {
+ return f.info, nil
+}
+
+func (f virtualFile) Close() error {
+ return nil
+}
+
+func (f virtualFile) Write(p []byte) (n int, err error) {
+ return 0, fmt.Errorf("not implemented")
+}
+
+func (f virtualFile) Readdir(count int) ([]os.FileInfo, error) {
+ return []os.FileInfo{f.info}, nil
+}
+
+func (f virtualFile) Stat() (os.FileInfo, error) {
+ return f.info, nil
+}
+
+func newVirtualFile(name string, b []byte) File {
+ return virtualFile{
+ Reader: bytes.NewReader(b),
+ Name: name,
+ info: fileInfo{
+ Path: name,
+ Contents: b,
+ size: int64(len(b)),
+ modTime: virtualFileModTime,
+ },
+ }
+}
+
+func newVirtualDir(name string) File {
+ var b []byte
+ v := newVirtualFile(name, b).(virtualFile)
+ v.info.isDir = true
+ return v
+}
diff --git a/vendor/golang.org/x/sync/LICENSE b/vendor/golang.org/x/sync/LICENSE
new file mode 100644
index 0000000..6a66aea
--- /dev/null
+++ b/vendor/golang.org/x/sync/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/golang.org/x/sync/PATENTS b/vendor/golang.org/x/sync/PATENTS
new file mode 100644
index 0000000..7330990
--- /dev/null
+++ b/vendor/golang.org/x/sync/PATENTS
@@ -0,0 +1,22 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Go project.
+
+Google hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+transfer and otherwise run, modify and propagate the contents of this
+implementation of Go, where such license applies only to those patent
+claims, both currently owned or controlled by Google and acquired in
+the future, licensable by Google that are necessarily infringed by this
+implementation of Go. This grant does not include claims that would be
+infringed only as a consequence of further modification of this
+implementation. If you or your agent or exclusive licensee institute or
+order or agree to the institution of patent litigation against any
+entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that this implementation of Go or any code incorporated within this
+implementation of Go constitutes direct or contributory patent
+infringement, or inducement of patent infringement, then any patent
+rights granted to you under this License for this implementation of Go
+shall terminate as of the date such litigation is filed.
diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go
new file mode 100644
index 0000000..533438d
--- /dev/null
+++ b/vendor/golang.org/x/sync/errgroup/errgroup.go
@@ -0,0 +1,67 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package errgroup provides synchronization, error propagation, and Context
+// cancelation for groups of goroutines working on subtasks of a common task.
+package errgroup
+
+import (
+ "sync"
+
+ "golang.org/x/net/context"
+)
+
+// A Group is a collection of goroutines working on subtasks that are part of
+// the same overall task.
+//
+// A zero Group is valid and does not cancel on error.
+type Group struct {
+ cancel func()
+
+ wg sync.WaitGroup
+
+ errOnce sync.Once
+ err error
+}
+
+// WithContext returns a new Group and an associated Context derived from ctx.
+//
+// The derived Context is canceled the first time a function passed to Go
+// returns a non-nil error or the first time Wait returns, whichever occurs
+// first.
+func WithContext(ctx context.Context) (*Group, context.Context) {
+ ctx, cancel := context.WithCancel(ctx)
+ return &Group{cancel: cancel}, ctx
+}
+
+// Wait blocks until all function calls from the Go method have returned, then
+// returns the first non-nil error (if any) from them.
+func (g *Group) Wait() error {
+ g.wg.Wait()
+ if g.cancel != nil {
+ g.cancel()
+ }
+ return g.err
+}
+
+// Go calls the given function in a new goroutine.
+//
+// The first call to return a non-nil error cancels the group; its error will be
+// returned by Wait.
+func (g *Group) Go(f func() error) {
+ g.wg.Add(1)
+
+ go func() {
+ defer g.wg.Done()
+
+ if err := f(); err != nil {
+ g.errOnce.Do(func() {
+ g.err = err
+ if g.cancel != nil {
+ g.cancel()
+ }
+ })
+ }
+ }()
+}
diff --git a/vendor/vendor.json b/vendor/vendor.json
index 01e666c..653dfd7 100644
--- a/vendor/vendor.json
+++ b/vendor/vendor.json
@@ -259,6 +259,18 @@
"revisionTime": "2018-06-18T11:59:01Z"
},
{
+ "checksumSHA1": "miq6rtrLoaiB6tqIWAp+gmaPVGk=",
+ "path": "github.com/gobuffalo/packr",
+ "revision": "9e76dbe10b00dd1fa8f29cfa4fac72297beb32a4",
+ "revisionTime": "2018-07-29T13:15:38Z"
+ },
+ {
+ "checksumSHA1": "uYAeGwdYQeBhbpT3O8Re3iLpuvk=",
+ "path": "github.com/gobuffalo/packr/builder",
+ "revision": "9e76dbe10b00dd1fa8f29cfa4fac72297beb32a4",
+ "revisionTime": "2018-07-29T13:15:38Z"
+ },
+ {
"checksumSHA1": "JZV+pLo8Z/kIYExrZr1Zu9KSKyU=",
"path": "github.com/golang/protobuf/proto",
"revision": "9f81198da99b79e14d70ca2c3cc1bbe44c6e69b6",
@@ -873,8 +885,8 @@
{
"checksumSHA1": "GtamqiJoL7PGHsN454AoffBFMa8=",
"path": "golang.org/x/net/context",
- "revision": "db08ff08e8622530d9ed3a0e8ac279f6d4c02196",
- "revisionTime": "2018-06-11T16:35:41Z"
+ "revision": "49c15d80dfbc983ea25246ee959d970efe09ec09",
+ "revisionTime": "2018-07-31T17:08:08Z"
},
{
"checksumSHA1": "WHc3uByvGaMcnSoI21fhzYgbOgg=",
@@ -913,10 +925,6 @@
"revisionTime": "2018-06-11T16:35:41Z"
},
{
- "path": "golang.org/x/net/lex/httplex",
- "revision": ""
- },
- {
"checksumSHA1": "rJn3m/27kO+2IU6KCCZ74Miby+8=",
"path": "golang.org/x/net/trace",
"revision": "db08ff08e8622530d9ed3a0e8ac279f6d4c02196",
@@ -959,6 +967,12 @@
"revisionTime": "2018-06-20T17:47:24Z"
},
{
+ "checksumSHA1": "S0DP7Pn7sZUmXc55IzZnNvERu6s=",
+ "path": "golang.org/x/sync/errgroup",
+ "revision": "1d60e4601c6fd243af51cc01ddf169918a5407ca",
+ "revisionTime": "2018-03-14T17:21:19Z"
+ },
+ {
"checksumSHA1": "USMsFbKZrNd1b9oRFbjevPr6PmI=",
"path": "golang.org/x/sys/unix",
"revision": "ad87a3a340fa7f3bed189293fbfa7a9b7e021ae1",