func (app *App) importAssets(included *includedApp) error { im := included.app.assetsManager if !app.shouldImportAssets() { im.SetPrefix(included.prefix + im.Prefix()) return nil } m := app.assetsManager prefix := strings.ToLower(included.name) renames := make(map[string]string) err := vfs.Walk(im.VFS(), "/", func(fs vfs.VFS, p string, info os.FileInfo, err error) error { if err != nil || info.IsDir() { return err } if p != "" && p[0] == '/' { p = p[1:] } log.Debugf("will import asset %v from app %s", p, included.name) src, err := im.Load(p) if err != nil { return err } defer src.Close() seeker, err := assets.Seeker(src) if err != nil { return err } sum := hashutil.Fnv32a(seeker) nonExt := p[:len(p)-len(path.Ext(p))] dest := path.Join(prefix, nonExt+".gen."+sum+path.Ext(p)) renames[p] = dest log.Debugf("importing asset %q as %q", p, dest) if m.Has(dest) { return nil } f, err := m.Create(dest, true) if err != nil { return err } defer f.Close() if _, err := seeker.Seek(0, os.SEEK_SET); err != nil { return err } if _, err := io.Copy(f, seeker); err != nil { return err } return nil }) if err != nil { return err } included.renames = renames return nil }
func Compile(m *Manager, name string, typ Type, opts Options) (string, error) { ext := path.Ext(name) compiler := compilers[typ][strings.ToLower(ext)] if compiler == nil { return name, nil } f, err := m.Load(name) if err != nil { return "", err } defer f.Close() seeker, err := Seeker(f) fnv := hashutil.Fnv32a(seeker) out := fmt.Sprintf("%s.gen.%s.%s", name, fnv, typ.Ext()) if o, _ := m.Load(out); o != nil { o.Close() log.Debugf("%s already compiled to %s", name, out) return out, nil } seeker.Seek(0, 0) var buf bytes.Buffer log.Debugf("compiling %s to %s", name, out) if err := compiler.Compile(&buf, seeker, opts); err != nil { return "", err } w, err := m.Create(out, true) if err != nil { return "", err } if _, err := io.Copy(w, bytes.NewReader(buf.Bytes())); err != nil { w.Close() return "", err } if err := w.Close(); err != nil { return "", err } return out, nil }