package main import ( "bytes" "compress/gzip" "crypto/sha256" "encoding/base64" "fmt" "io/ioutil" "path/filepath" "strings" "text/template" ) var code_template = `// autogenerated. do not edit! package server var assets_bundle = map[string]asset{ {{- range .}} "{{.Name}}": {etag: "{{.Etag}}", body: "{{.Body}}"}, {{- end }} } func init() { assets = assets_bundle } ` type asset struct { Name, Etag, Body string } func shasum(b []byte) string { h := sha256.New() h.Write(b) return fmt.Sprintf("%x", h.Sum(nil))[:16] } func encode(b []byte) string { var buf bytes.Buffer zw := gzip.NewWriter(&buf) zw.Write(b) zw.Close() return base64.StdEncoding.EncodeToString(buf.Bytes()) } func main() { outfile := "server/assets_bundle.go" assets := make([]asset, 0) filepatterns := []string{ "assets/index.html", "assets/graphicarts/*.svg", "assets/graphicarts/*.png", "assets/javascripts/*.js", "assets/stylesheets/*.css", "assets/stylesheets/*.map", } fmt.Printf("%8s %8s %s\n", "original", "encoded", "filename") for _, pattern := range filepatterns { filenames, _ := filepath.Glob(pattern) for _, filename := range filenames { content, _ := ioutil.ReadFile(filename) assets = append(assets, asset{ Name: strings.TrimPrefix(filename, "assets/"), Etag: shasum(content), Body: encode(content), }) fmt.Printf( "%8d %8d %s\n", len(content), len(assets[len(assets)-1].Body), filename, ) } } var buf bytes.Buffer template := template.Must(template.New("code").Parse(code_template)) template.Execute(&buf, assets) ioutil.WriteFile(outfile, buf.Bytes(), 0644) }