shithub: hugo

Download patch

ref: d139a037d98e4b388687eecb7831758412247c58
parent: 0a88741fe85f4f7aedc02ed748dfeb8ccc073dbf
author: Bjørn Erik Pedersen <[email protected]>
date: Wed Aug 15 16:41:19 EDT 2018

hugoblib: Fix "adding a bundle" in server mode

Before this commit, the live reload logic in `hugo server` got confused when you dropped a new bundle into the project while the server was running. The workaround was to restart the server.

This commit fixes the "live reload bundle detection" in server mode, and also makes sure that the bundle headers are always processed first.

Fixes #5075

--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -740,6 +740,11 @@
 		}
 	}
 
+	if isContent && fileTp != bundleNot {
+		// A new bundle.
+		return dir, dir, fileTp
+	}
+
 	// Not part of any bundle
 	return dir, filename, bundleNot
 }
--- a/hugolib/page_bundler_capture.go
+++ b/hugolib/page_bundler_capture.go
@@ -20,6 +20,7 @@
 	"path"
 	"path/filepath"
 	"runtime"
+	"sort"
 	"strings"
 	"sync"
 
@@ -70,6 +71,30 @@
 	if n := runtime.NumCPU(); n > numWorkers {
 		numWorkers = n
 	}
+
+	// TODO(bep) the "index" vs "_index" check/strings should be moved in one place.
+	isBundleHeader := func(filename string) bool {
+		base := filepath.Base(filename)
+		name := helpers.Filename(base)
+		return isContentFile(base) && (name == "index" || name == "_index")
+	}
+
+	// Make sure that any bundle header files are processed before the others. This makes
+	// sure that any bundle head is processed before its resources.
+	sort.Slice(filenames, func(i, j int) bool {
+		a, b := filenames[i], filenames[j]
+		ac, bc := isBundleHeader(a), isBundleHeader(b)
+
+		if ac {
+			return true
+		}
+
+		if bc {
+			return false
+		}
+
+		return a < b
+	})
 
 	c := &capturer{
 		sem:            make(chan bool, numWorkers),