diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/main.go b/main.go new file mode 100644 index 000000000..d7386c6c1 --- /dev/null +++ b/main.go @@ -0,0 +1,190 @@ +// Copyright © 2013 Steve Francia <[email protected]>. +// +// Licensed under the Simple Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://opensource.org/licenses/Simple-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "flag" + "fmt" + "github.com/howeyc/fsnotify" + "github.com/spf13/hugo/hugolib" + "net/http" + "os" + "path/filepath" + "runtime/pprof" + "sync" +) + +const ( + cfgFiledefault = "config.json" +) + +var ( + baseUrl = flag.String("b", "", "hostname (and path) to the root eg. http://spf13.com/") + cfgfile = flag.String("c", cfgFiledefault, "config file (default is path/config.json)") + checkMode = flag.Bool("k", false, "analyze content and provide feedback") + draft = flag.Bool("d", false, "include content marked as draft") + help = flag.Bool("h", false, "show this help") + path = flag.String("p", "", "filesystem path to read files relative from") + verbose = flag.Bool("v", false, "verbose output") + cpuprofile = flag.Int("cpuprofile", 0, "Number of times to create the site and profile it") + watchMode = flag.Bool("w", false, "watch filesystem for changes and recreate as needed") + server = flag.Bool("s", false, "run a (very) simple web server") + port = flag.String("port", "1313", "port to run web server on, default :1313") +) + +func usage() { + PrintErr("usage: hugo [flags]", "") + flag.PrintDefaults() + os.Exit(2) +} + +func main() { + + flag.Usage = usage + flag.Parse() + + if *help { + usage() + } + + config := hugolib.SetupConfig(cfgfile, path) + config.BuildDrafts = *draft + + if *baseUrl != "" { + config.BaseUrl = *baseUrl + } + + if *cpuprofile != 0 { + f, err := os.Create("/tmp/hugo-cpuprofile") + + if err != nil { + panic(err) + } + + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + + for i := 0; i < *cpuprofile; i++ { + _ = buildSite(config) + } + } + + if *checkMode { + site := hugolib.NewSite(config) + site.Analyze() + os.Exit(2) + } + + if *watchMode { + fmt.Println("Watching for changes. Press ctrl+c to stop") + _ = buildSite(config) + err := NewWatcher(config, *port, *server) + + if err != nil { + fmt.Println(err) + } + } + + _ = buildSite(config) + + if *server { + serve(*port, config) + } + +} + +func serve(port string, config *hugolib.Config) { + fmt.Println("Web Server is available at http://localhost:" + port) + fmt.Println("Press ctrl+c to stop") + panic(http.ListenAndServe(":"+port, http.FileServer(http.Dir(config.PublishDir)))) +} + +func buildSite(config *hugolib.Config) *hugolib.Site { + site := hugolib.NewSite(config) + site.Build() + + site.Stats() + + return site +} + +func watchChange(c *hugolib.Config) { + fmt.Println("Change detected, rebuilding site\n") + buildSite(c) +} + +func NewWatcher(c *hugolib.Config, port string, server bool) error { + watcher, err := fsnotify.NewWatcher() + var wg sync.WaitGroup + + if err != nil { + return err + fmt.Println(err) + } + + defer watcher.Close() + + wg.Add(1) + go func() { + for { + select { + case ev := <-watcher.Event: + var _ = ev + watchChange(c) + // TODO add newly created directories to the watch list + case err := <-watcher.Error: + if err != nil { + fmt.Println("error:", err) + } + } + } + }() + + for _, d := range getDirList(c) { + if d != "" { + _ = watcher.Watch(d) + } + } + + if server { + go serve(port, c) + } + + wg.Wait() + return nil +} + +func getDirList(c *hugolib.Config) []string { + var a []string + walker := func(path string, fi os.FileInfo, err error) error { + if err != nil { + PrintErr("Walker: ", err) + return nil + } + + if fi.IsDir() { + a = append(a, path) + } + return nil + } + + filepath.Walk(c.GetAbsPath(c.SourceDir), walker) + filepath.Walk(c.GetAbsPath(c.LayoutDir), walker) + + return a +} + +func PrintErr(str string, a ...interface{}) { + fmt.Fprintln(os.Stderr, str, a) +} |