You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

101 lines
2.3 KiB

  1. package main
  2. import (
  3. "bufio"
  4. "bytes"
  5. "flag"
  6. "fmt"
  7. "os"
  8. "os/exec"
  9. "strings"
  10. )
  11. const bindatafile = "bindata.go"
  12. func isDebug(args []string) bool {
  13. flagset := flag.NewFlagSet("", flag.ContinueOnError)
  14. debug := flagset.Bool("debug", false, "")
  15. debugArgs := make([]string, 0)
  16. for _, arg := range args {
  17. if strings.HasPrefix(arg, "-debug") {
  18. debugArgs = append(debugArgs, arg)
  19. }
  20. }
  21. flagset.Parse(debugArgs)
  22. if debug == nil {
  23. return false
  24. }
  25. return *debug
  26. }
  27. func main() {
  28. if _, err := exec.LookPath("go-bindata"); err != nil {
  29. fmt.Println("Cannot find go-bindata executable in path")
  30. fmt.Println("Maybe you need: go get github.com/elazarl/go-bindata-assetfs/...")
  31. os.Exit(1)
  32. }
  33. cmd := exec.Command("go-bindata", os.Args[1:]...)
  34. cmd.Stdin = os.Stdin
  35. cmd.Stdout = os.Stdout
  36. cmd.Stderr = os.Stderr
  37. if err := cmd.Run(); err != nil {
  38. os.Exit(1)
  39. }
  40. in, err := os.Open(bindatafile)
  41. if err != nil {
  42. fmt.Fprintln(os.Stderr, "Cannot read", bindatafile, err)
  43. return
  44. }
  45. out, err := os.Create("bindata_assetfs.go")
  46. if err != nil {
  47. fmt.Fprintln(os.Stderr, "Cannot write 'bindata_assetfs.go'", err)
  48. return
  49. }
  50. debug := isDebug(os.Args[1:])
  51. r := bufio.NewReader(in)
  52. done := false
  53. for line, isPrefix, err := r.ReadLine(); err == nil; line, isPrefix, err = r.ReadLine() {
  54. if !isPrefix {
  55. line = append(line, '\n')
  56. }
  57. if _, err := out.Write(line); err != nil {
  58. fmt.Fprintln(os.Stderr, "Cannot write to 'bindata_assetfs.go'", err)
  59. return
  60. }
  61. if !done && !isPrefix && bytes.HasPrefix(line, []byte("import (")) {
  62. if debug {
  63. fmt.Fprintln(out, "\t\"net/http\"")
  64. } else {
  65. fmt.Fprintln(out, "\t\"github.com/elazarl/go-bindata-assetfs\"")
  66. }
  67. done = true
  68. }
  69. }
  70. if debug {
  71. fmt.Fprintln(out, `
  72. func assetFS() http.FileSystem {
  73. for k := range _bintree.Children {
  74. return http.Dir(k)
  75. }
  76. panic("unreachable")
  77. }`)
  78. } else {
  79. fmt.Fprintln(out, `
  80. func assetFS() *assetfs.AssetFS {
  81. assetInfo := func(path string) (os.FileInfo, error) {
  82. return os.Stat(path)
  83. }
  84. for k := range _bintree.Children {
  85. return &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, AssetInfo: assetInfo, Prefix: k}
  86. }
  87. panic("unreachable")
  88. }`)
  89. }
  90. // Close files BEFORE remove calls (don't use defer).
  91. in.Close()
  92. out.Close()
  93. if err := os.Remove(bindatafile); err != nil {
  94. fmt.Fprintln(os.Stderr, "Cannot remove", bindatafile, err)
  95. }
  96. }