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
This commit is contained in:
Bjørn Erik Pedersen 2018-08-15 20:41:19 +02:00
parent 0a88741fe8
commit d139a037d9
2 changed files with 30 additions and 0 deletions

View file

@ -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 // Not part of any bundle
return dir, filename, bundleNot return dir, filename, bundleNot
} }

View file

@ -20,6 +20,7 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"runtime" "runtime"
"sort"
"strings" "strings"
"sync" "sync"
@ -71,6 +72,30 @@ func newCapturer(
numWorkers = n 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{ c := &capturer{
sem: make(chan bool, numWorkers), sem: make(chan bool, numWorkers),
handler: handler, handler: handler,