123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- // Copyright (C) 2014 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- //go:build ignore
- // +build ignore
- package main
- import (
- "bytes"
- "compress/gzip"
- "flag"
- "fmt"
- "go/format"
- "io"
- "os"
- "path/filepath"
- "strconv"
- "strings"
- "text/template"
- "time"
- )
- var tpl = template.Must(template.New("assets").Parse(`// Code generated by genassets.go - DO NOT EDIT.
- package auto
- import (
- "time"
- "github.com/syncthing/syncthing/lib/assets"
- )
- func Assets() map[string]assets.Asset {
- var ret = make(map[string]assets.Asset, {{.Assets | len}})
- t := time.Unix({{.Generated}}, 0)
- {{range $asset := .Assets}}
- ret["{{$asset.Name}}"] = assets.Asset{
- Content: {{$asset.Data}},
- Gzipped: {{$asset.Gzipped}},
- Length: {{$asset.Length}},
- Filename: {{$asset.Name | printf "%q"}},
- Modified: t,
- }
- {{end}}
- return ret
- }
- `))
- type asset struct {
- Name string
- Data string
- Length int
- Gzipped bool
- }
- var assets []asset
- func walkerFor(basePath string) filepath.WalkFunc {
- return func(name string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- if strings.HasPrefix(filepath.Base(name), ".") {
- // Skip dotfiles
- return nil
- }
- if info.Mode().IsRegular() {
- data, err := os.ReadFile(name)
- if err != nil {
- return err
- }
- length := len(data)
- var buf bytes.Buffer
- gw, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression)
- gw.Write(data)
- gw.Close()
- // Only replace asset by gzipped version if it is smaller.
- // In practice, this means HTML, CSS, SVG etc. get compressed,
- // while PNG and WOFF files are left uncompressed.
- // lib/assets detects gzip and sets headers/decompresses.
- gzipped := buf.Len() < len(data)
- if gzipped {
- data = buf.Bytes()
- }
- name, _ = filepath.Rel(basePath, name)
- assets = append(assets, asset{
- Name: filepath.ToSlash(name),
- Data: fmt.Sprintf("%q", string(data)),
- Length: length,
- Gzipped: gzipped,
- })
- }
- return nil
- }
- }
- type templateVars struct {
- Assets []asset
- Generated int64
- }
- func main() {
- outfile := flag.String("o", "", "Name of output file (default stdout)")
- flag.Parse()
- filepath.Walk(flag.Arg(0), walkerFor(flag.Arg(0)))
- var buf bytes.Buffer
- // Generated time is now, except if the SOURCE_DATE_EPOCH environment
- // variable is set (for reproducible builds).
- generated := time.Now().Unix()
- if s, _ := strconv.ParseInt(os.Getenv("SOURCE_DATE_EPOCH"), 10, 64); s > 0 {
- generated = s
- }
- tpl.Execute(&buf, templateVars{
- Assets: assets,
- Generated: generated,
- })
- bs, err := format.Source(buf.Bytes())
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- out := io.Writer(os.Stdout)
- if *outfile != "" {
- out, err = os.Create(*outfile)
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- }
- out.Write(bs)
- }
|