shithub: hugo

Download patch

ref: b580a25d1f9308d71aa20673cd3e271711943846
parent: 764abd20672ced48144c1ab63328a6f1a9e3899e
author: spf13 <[email protected]>
date: Fri Oct 25 14:03:14 EDT 2013

Better error handling when rendering error found when in watch mode
In watch mode it should continue to watch for changes, in any other mode it should exit with a -1 error code so can check for success when scripting

--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -84,9 +84,13 @@
 	}
 }
 
-func build() {
+func build(watches ...bool) {
 	utils.CheckErr(copyStatic(), fmt.Sprintf("Error copying static files to %s", Config.GetAbsPath(Config.PublishDir)))
-	utils.StopOnErr(buildSite())
+	watch := false
+	if len(watches) > 0 && watches[0] {
+		watch = true
+	}
+	utils.StopOnErr(buildSite(BuildWatch || watch))
 
 	if BuildWatch {
 		fmt.Println("Watching for changes in", Config.GetAbsPath(Config.ContentDir))
@@ -121,9 +125,12 @@
 	return a
 }
 
-func buildSite() (err error) {
+func buildSite(watching ...bool) (err error) {
 	startTime := time.Now()
 	site := &hugolib.Site{Config: *Config}
+	if len(watching) > 0 && watching[0] {
+		site.RunMode.Watching = true
+	}
 	err = site.Build()
 	if err != nil {
 		return
@@ -185,7 +192,7 @@
 			// Ignoring temp files created by editors (vim)
 			if !strings.HasSuffix(ev.Name, "~") && !strings.HasSuffix(ev.Name, ".swp") {
 				fmt.Println("Change detected, rebuilding site\n")
-				utils.StopOnErr(buildSite())
+				utils.StopOnErr(buildSite(true))
 			}
 		}
 	}
--- a/commands/server.go
+++ b/commands/server.go
@@ -45,7 +45,7 @@
 		Config.BaseUrl = "http://localhost:" + strconv.Itoa(serverPort)
 	}
 
-	build()
+	build(serverWatch)
 
 	// Watch runs its own server as part of the routine
 	if serverWatch {
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -68,6 +68,7 @@
 	Target      target.Output
 	Alias       target.AliasPublisher
 	Completed   chan bool
+	RunMode     runmode
 }
 
 type SiteInfo struct {
@@ -79,6 +80,14 @@
 	Config     *Config
 }
 
+type runmode struct {
+	Watching bool
+}
+
+func (s *Site) Running() bool {
+	return s.RunMode.Watching
+}
+
 func init() {
 	DefaultTimer = nitro.Initalize()
 }
@@ -576,7 +585,11 @@
 	go func() {
 		err = s.renderThing(d, layout, renderWriter)
 		if err != nil {
-			panic(err)
+			// Behavior here should be dependent on if running in server or watch mode.
+			fmt.Println(fmt.Errorf("Rendering error: %v", err))
+			if !s.Running() {
+				os.Exit(-1)
+			}
 		}
 	}()