]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Prevent the global error collector to panic when sending on closed channel
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 13 Apr 2023 09:44:22 +0000 (11:44 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 13 Apr 2023 09:44:22 +0000 (11:44 +0200)
deps/deps.go
hugolib/hugo_sites_build.go

index 7b252d020c0fe69e7f9521b1ec8ed68665e5b897..511ee885c91c753446855ba4113e51400f00d272 100644 (file)
@@ -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
index 66abf4f1655ab84adf90e13941dbbb52e2372753..e61dc98768c42e2d399b2cfd058b4c4ce97ab1c0 100644 (file)
@@ -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 {