github.com/ernestokarim/closurer@v0.0.0-20130119214741-f245d086c750/build.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "strings" 11 12 "github.com/ernestokarim/closurer/app" 13 "github.com/ernestokarim/closurer/config" 14 "github.com/ernestokarim/closurer/js" 15 ) 16 17 var ( 18 mapping = map[string]string{} 19 ) 20 21 func build() error { 22 if err := js.FullCompile(); err != nil { 23 return err 24 } 25 26 if err := copyCssFile(); err != nil { 27 return err 28 } 29 30 if err := copyJsFile(); err != nil { 31 return err 32 } 33 34 if err := outputMap(); err != nil { 35 return err 36 } 37 38 return nil 39 } 40 41 func copyCssFile() error { 42 conf := config.Current() 43 target := conf.Gss.CurTarget() 44 45 if conf.Gss == nil { 46 return nil 47 } 48 49 srcName := filepath.Join(conf.Build, config.CSS_NAME) 50 filename := target.Output 51 if strings.Contains(filename, "{sha1}") { 52 sha1, err := calcFileSha1(srcName) 53 if err != nil { 54 return err 55 } 56 filename = strings.Replace(filename, "{sha1}", sha1, -1) 57 } 58 59 mapping[config.SelectedTarget+"-css"] = filename 60 61 if err := copyFile(srcName, filename); err != nil { 62 return err 63 } 64 65 return nil 66 } 67 68 func copyJsFile() error { 69 conf := config.Current() 70 target := conf.Js.CurTarget() 71 72 if conf.Js == nil { 73 return nil 74 } 75 76 srcName := filepath.Join(conf.Build, config.JS_NAME) 77 78 filename := filepath.Join(conf.Js.Root, target.Output) 79 if strings.Contains(filename, "{sha1}") { 80 sha1, err := calcFileSha1(srcName) 81 if err != nil { 82 return err 83 } 84 filename = strings.Replace(filename, "{sha1}", sha1, -1) 85 } 86 87 mapping[config.SelectedTarget+"-js"] = filename 88 89 files := []string{} 90 for _, n := range conf.Js.Prepends { 91 files = append(files, filepath.Join(conf.Js.Root, n.File)) 92 } 93 files = append(files, srcName) 94 95 if err := copyFiles(files, filename); err != nil { 96 return err 97 } 98 99 return nil 100 } 101 102 func calcFileSha1(filename string) (string, error) { 103 cmd := exec.Command("sha1sum", filename) 104 output, err := cmd.CombinedOutput() 105 if err != nil { 106 return "", app.Error(err) 107 } 108 109 return strings.Split(string(output), " ")[0], nil 110 } 111 112 func outputMap() error { 113 conf := config.Current() 114 if conf.Map == nil { 115 return nil 116 } 117 118 f, err := os.Create(conf.Map.File) 119 if err != nil { 120 return app.Error(err) 121 } 122 defer f.Close() 123 124 fmt.Fprintf(f, "var mapping = ") 125 if err := json.NewEncoder(f).Encode(&mapping); err != nil { 126 return app.Error(err) 127 } 128 129 return nil 130 } 131 132 func copyFile(from, to string) error { 133 src, err := os.Open(from) 134 if err != nil { 135 return app.Error(err) 136 } 137 defer src.Close() 138 139 dest, err := os.Create(to) 140 if err != nil { 141 return app.Error(err) 142 } 143 defer dest.Close() 144 145 if _, err = io.Copy(dest, src); err != nil { 146 return app.Error(err) 147 } 148 149 return nil 150 } 151 152 func copyFiles(from []string, to string) error { 153 srcs := []io.Reader{} 154 for _, f := range from { 155 src, err := os.Open(f) 156 if err != nil { 157 return app.Error(err) 158 } 159 defer src.Close() 160 161 srcs = append(srcs, src) 162 } 163 164 src := io.MultiReader(srcs...) 165 166 dest, err := os.Create(to) 167 if err != nil { 168 return app.Error(err) 169 } 170 defer dest.Close() 171 172 if _, err = io.Copy(dest, src); err != nil { 173 return app.Error(err) 174 } 175 176 return nil 177 }