hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit d139a037d98e4b388687eecb7831758412247c58
parent 0a88741fe85f4f7aedc02ed748dfeb8ccc073dbf
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Wed, 15 Aug 2018 20:41:19 +0200

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

Diffstat:
Mhugolib/hugo_sites.go | 5+++++
Mhugolib/page_bundler_capture.go | 25+++++++++++++++++++++++++
2 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go
@@ -740,6 +740,11 @@ func (m *contentChangeMap) resolveAndRemove(filename string) (string, string, bu
 		}
 	}
 
+	if isContent && fileTp != bundleNot {
+		// A new bundle.
+		return dir, dir, fileTp
+	}
+
 	// Not part of any bundle
 	return dir, filename, bundleNot
 }
diff --git a/hugolib/page_bundler_capture.go b/hugolib/page_bundler_capture.go
@@ -20,6 +20,7 @@ import (
 	"path"
 	"path/filepath"
 	"runtime"
+	"sort"
 	"strings"
 	"sync"
 
@@ -71,6 +72,30 @@ func newCapturer(
 		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),
 		handler:        handler,