comparison zs.go @ 7:11073a30f71f draft

simplified build process, added pre and post build hooks
author zaitsev.serge
date Fri, 05 Dec 2014 19:03:33 +0000
parents cb66f5b86616
children ece0d406f2db
comparison
equal deleted inserted replaced
6:cb66f5b86616 7:11073a30f71f
35 func md(path, s string) (map[string]string, string) { 35 func md(path, s string) (map[string]string, string) {
36 url := path[:len(path)-len(filepath.Ext(path))] + ".html" 36 url := path[:len(path)-len(filepath.Ext(path))] + ".html"
37 v := map[string]string{ 37 v := map[string]string{
38 "file": path, 38 "file": path,
39 "url": url, 39 "url": url,
40 "outdir": PUBDIR,
41 "output": filepath.Join(PUBDIR, url), 40 "output": filepath.Join(PUBDIR, url),
42 "layout": "index.html", 41 "layout": "index.html",
43 } 42 }
44 if strings.Index(s, "\n\n") == -1 { 43 if strings.Index(s, "\n\n") == -1 {
45 return map[string]string{}, s 44 return map[string]string{}, s
87 } 86 }
88 } 87 }
89 } 88 }
90 89
91 func env(vars map[string]string) []string { 90 func env(vars map[string]string) []string {
92 env := []string{"ZS=" + os.Args[0]} 91 env := []string{"ZS=" + os.Args[0], "ZS_OUTDIR=" + PUBDIR}
93 env = append(env, os.Environ()...) 92 env = append(env, os.Environ()...)
94 for k, v := range vars { 93 if vars != nil {
95 env = append(env, "ZS_"+strings.ToUpper(k)+"="+v) 94 for k, v := range vars {
95 env = append(env, "ZS_"+strings.ToUpper(k)+"="+v)
96 }
96 } 97 }
97 return env 98 return env
98 } 99 }
99 100
100 func run(cmd string, args []string, vars map[string]string, output io.Writer) error { 101 func run(cmd string, args []string, vars map[string]string, output io.Writer) error {
157 return err 158 return err
158 } 159 }
159 return nil 160 return nil
160 } 161 }
161 162
162 func copyFile(path string) error { 163 func copyFile(path string) (err error) {
163 if in, err := os.Open(path); err != nil { 164 var in, out *os.File
164 return err 165 if in, err = os.Open(path); err == nil {
165 } else {
166 defer in.Close() 166 defer in.Close()
167 if stat, err := in.Stat(); err != nil { 167 if out, err = os.Create(filepath.Join(PUBDIR, path)); err == nil {
168 return err
169 } else {
170 // Directory?
171 if stat.Mode().IsDir() {
172 os.Mkdir(filepath.Join(PUBDIR, path), 0755)
173 return nil
174 }
175 if !stat.Mode().IsRegular() {
176 return nil
177 }
178 }
179 if out, err := os.Create(filepath.Join(PUBDIR, path)); err != nil {
180 return err
181 } else {
182 defer out.Close() 168 defer out.Close()
183 _, err = io.Copy(out, in) 169 _, err = io.Copy(out, in)
184 return err 170 }
185 } 171 }
186 } 172 return err
187 } 173 }
188 174
189 func buildAll(once bool) { 175 func buildAll(once bool) {
190 lastModified := time.Unix(0, 0) 176 lastModified := time.Unix(0, 0)
177 modified := false
191 for { 178 for {
192 os.Mkdir(PUBDIR, 0755) 179 os.Mkdir(PUBDIR, 0755)
193 err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { 180 err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
194 // ignore hidden files and directories 181 // ignore hidden files and directories
195 if filepath.Base(path)[0] == '.' || strings.HasPrefix(path, ".") { 182 if filepath.Base(path)[0] == '.' || strings.HasPrefix(path, ".") {
196 return nil 183 return nil
197 } 184 }
198 185
199 if info.ModTime().After(lastModified) { 186 if info.IsDir() {
187 os.Mkdir(filepath.Join(PUBDIR, path), 0755)
188 return nil
189 } else if info.ModTime().After(lastModified) {
190 if !modified {
191 // About to be modified, so run pre-build hook
192 run(filepath.Join(ZSDIR, "pre"), []string{}, nil, nil)
193 modified = true
194 }
200 ext := filepath.Ext(path) 195 ext := filepath.Ext(path)
201 if ext == ".md" || ext == "mkd" { 196 if ext == ".md" || ext == "mkd" {
202 log.Println("mkd: ", path) 197 log.Println("mkd: ", path)
203 return buildMarkdown(path) 198 return buildMarkdown(path)
204 } else { 199 } else {
208 } 203 }
209 return nil 204 return nil
210 }) 205 })
211 if err != nil { 206 if err != nil {
212 log.Println("ERROR:", err) 207 log.Println("ERROR:", err)
208 }
209 if modified {
210 // Something was modified, so post-build hook
211 run(filepath.Join(ZSDIR, "post"), []string{}, nil, nil)
212 modified = false
213 } 213 }
214 lastModified = time.Now() 214 lastModified = time.Now()
215 if once { 215 if once {
216 break 216 break
217 } 217 }