summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-04-13 11:44:22 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-04-13 11:44:22 +0200
commit9906c1ae52e44f2e8ed45873ea36cd83a9e9bcc0 (patch)
tree2ddf2af8abbd12710c58e16ac6a6066f3b853587
parent5596dc24a0adc8907f52886a8e035e1bcd66dd8d (diff)
Prevent the global error collector to panic when sending on closed channel
-rw-r--r--deps/deps.go11
-rw-r--r--hugolib/hugo_sites_build.go7
2 files changed, 12 insertions, 6 deletions
diff --git a/deps/deps.go b/deps/deps.go
index 7b252d020..511ee885c 100644
--- a/deps/deps.go
+++ b/deps/deps.go
@@ -119,6 +119,8 @@ type Deps struct {
type globalErrHandler struct {
// Channel for some "hard to get to" build errors
buildErrors chan error
+ // Used to signal that the build is done.
+ quit chan struct{}
}
// SendErr sends the error on a channel to be handled later.
@@ -127,6 +129,7 @@ type globalErrHandler struct {
func (e *globalErrHandler) SendError(err error) {
if e.buildErrors != nil {
select {
+ case <-e.quit:
case e.buildErrors <- err:
default:
}
@@ -137,10 +140,18 @@ func (e *globalErrHandler) SendError(err error) {
}
func (e *globalErrHandler) StartErrorCollector() chan error {
+ e.quit = make(chan struct{})
e.buildErrors = make(chan error, 10)
return e.buildErrors
}
+func (e *globalErrHandler) StopErrorCollector() {
+ if e.buildErrors != nil {
+ close(e.quit)
+ close(e.buildErrors)
+ }
+}
+
// Listeners represents an event listener.
type Listeners struct {
sync.Mutex
diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go
index 66abf4f16..e61dc9876 100644
--- a/hugolib/hugo_sites_build.go
+++ b/hugolib/hugo_sites_build.go
@@ -163,12 +163,7 @@ func (h *HugoSites) Build(config BuildCfg, events ...fsnotify.Event) error {
h.Log.Println(b.String())
}
- select {
- // Make sure the channel always gets something.
- case errCollector <- nil:
- default:
- }
- close(errCollector)
+ h.StopErrorCollector()
err := <-errs
if err != nil {