github.com/kayoticsully/syncthing@v0.8.9-0.20140724133906-c45a2fdc03f8/cmd/genassets/main.go (about)

     1  // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
     2  // All rights reserved. Use of this source code is governed by an MIT-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"bytes"
     9  	"compress/gzip"
    10  	"flag"
    11  	"fmt"
    12  	"go/format"
    13  	"io"
    14  	"os"
    15  	"path/filepath"
    16  	"text/template"
    17  )
    18  
    19  var tpl = template.Must(template.New("assets").Parse(`package auto
    20  
    21  import (
    22  	"bytes"
    23  	"compress/gzip"
    24  	"encoding/hex"
    25  	"io/ioutil"
    26  )
    27  
    28  var Assets = make(map[string][]byte)
    29  
    30  func init() {
    31  	var bs []byte
    32  	var gr *gzip.Reader
    33  {{range $asset := .assets}}
    34  	bs, _ = hex.DecodeString("{{$asset.HexData}}")
    35  	gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
    36  	bs, _ = ioutil.ReadAll(gr)
    37  	Assets["{{$asset.Name}}"] = bs
    38  {{end}}
    39  }
    40  `))
    41  
    42  type asset struct {
    43  	Name    string
    44  	HexData string
    45  }
    46  
    47  var assets []asset
    48  
    49  func walkerFor(basePath string) filepath.WalkFunc {
    50  	return func(name string, info os.FileInfo, err error) error {
    51  		if err != nil {
    52  			return err
    53  		}
    54  
    55  		if info.Mode().IsRegular() {
    56  			fd, err := os.Open(name)
    57  			if err != nil {
    58  				return err
    59  			}
    60  
    61  			var buf bytes.Buffer
    62  			gw := gzip.NewWriter(&buf)
    63  			io.Copy(gw, fd)
    64  			fd.Close()
    65  			gw.Flush()
    66  			gw.Close()
    67  
    68  			name, _ = filepath.Rel(basePath, name)
    69  			assets = append(assets, asset{
    70  				Name:    filepath.ToSlash(name),
    71  				HexData: fmt.Sprintf("%x", buf.Bytes()),
    72  			})
    73  		}
    74  
    75  		return nil
    76  	}
    77  }
    78  
    79  func main() {
    80  	flag.Parse()
    81  
    82  	filepath.Walk(flag.Arg(0), walkerFor(flag.Arg(0)))
    83  	var buf bytes.Buffer
    84  	tpl.Execute(&buf, map[string][]asset{"assets": assets})
    85  	bs, err := format.Source(buf.Bytes())
    86  	if err != nil {
    87  		panic(err)
    88  	}
    89  	os.Stdout.Write(bs)
    90  }