| 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 |
| } |