package store import ( "bytes" "encoding/json" "html/template" "io" "os" "path/filepath" "sort" "strings" "github.com/gobuffalo/packr/v2/jam/parser" ) var _ Store = &Legacy{} type Legacy struct { *Disk boxes map[string][]legacyBox } func NewLegacy() *Legacy { return &Legacy{ Disk: NewDisk("", ""), boxes: map[string][]legacyBox{}, } } func (l *Legacy) Pack(box *parser.Box) error { files, err := l.Files(box) if err != nil { return err } var fcs []legacyFile for _, f := range files { n := strings.TrimPrefix(f.Name(), box.AbsPath+string(filepath.Separator)) c, err := l.prepFile(f) if err != nil { return err } fcs = append(fcs, legacyFile{Name: n, Contents: c}) } sort.Slice(fcs, func(a, b int) bool { return fcs[a].Name < fcs[b].Name }) lbs := l.boxes[box.PackageDir] lbs = append(lbs, legacyBox{ Box: box, Files: fcs, }) l.boxes[box.PackageDir] = lbs return nil } func (l *Legacy) prepFile(r io.Reader) (string, error) { bb := &bytes.Buffer{} if _, err := io.Copy(bb, r); err != nil { return "", err } b, err := json.Marshal(bb.Bytes()) if err != nil { return "", err } return strings.Replace(string(b), "\"", "\\\"", -1), nil } // Close ... func (l *Legacy) Close() error { for _, b := range l.boxes { if len(b) == 0 { continue } bx := b[0].Box pkg := bx.Package opts := map[string]interface{}{ "Package": pkg, "Boxes": b, } p := filepath.Join(bx.PackageDir, "a_"+bx.Package+"-packr.go.tmpl") tmpl, err := template.New(p).Parse(legacyTmpl) if err != nil { return err } f, err := os.Create(p) if err != nil { return err } if err := tmpl.Execute(f, opts); err != nil { return err } } return nil } type legacyBox struct { Box *parser.Box Files []legacyFile } type legacyFile struct { Name string Contents string } var legacyTmpl = `// Code generated by github.com/gobuffalo/packr. DO NOT EDIT. package {{.Package}} 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 $box.Files }} _ = packr.PackJSONBytes("{{$box.Box.Name}}", "{{.Name}}", "{{.Contents}}") {{- end }} {{- end }} } `