]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
server: Fix panic when the server browser error handler tried to use a config in...
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 5 Feb 2026 19:11:48 +0000 (20:11 +0100)
committerGitHub <noreply@github.com>
Thu, 5 Feb 2026 19:11:48 +0000 (20:11 +0100)
I tried and failed to create a test for this, but I have tested this manually.,

Fixes #14470

commands/commandeer.go
commands/hugobuilder.go
commands/server.go
common/loggers/logger.go
main_test.go

index d7c967c54781df5f3d976bec804dca2447d343bf..97cee7acbc1552ccc3c47a766cf2851196f752c3 100644 (file)
@@ -331,6 +331,9 @@ func (r *rootCommand) ConfigFromProvider(key configKey, cfg config.Provider) (*c
 }
 
 func (r *rootCommand) HugFromConfig(conf *commonConfig) (*hugolib.HugoSites, error) {
+       if conf == nil {
+               return nil, fmt.Errorf("conf must be set")
+       }
        k := configKey{counter: r.configVersionID.Load()}
        h, _, err := r.hugoSites.GetOrCreate(k, func(key configKey) (*hugolib.HugoSites, error) {
                depsCfg := r.newDepsConfig(conf)
index 038b9ad94780638f1321a8ff1e1287c8bc09d1c2..779c84e0392d1ca96ea8b072b22f89e2201d0271 100644 (file)
@@ -56,8 +56,9 @@ import (
 type hugoBuilder struct {
        r *rootCommand
 
-       confmu sync.Mutex
-       conf   *commonConfig
+       confmu  sync.Mutex
+       confOld *commonConfig
+       conf    *commonConfig
 
        // May be nil.
        s *serverCommand
@@ -94,6 +95,27 @@ func (c *hugoBuilder) withConf(fn func(conf *commonConfig)) {
        fn(c.conf)
 }
 
+func (c *hugoBuilder) withConfOrOldConf(fn func(conf *commonConfig)) {
+       c.confmu.Lock()
+       defer c.confmu.Unlock()
+       if c.conf != nil {
+               fn(c.conf)
+       } else if c.confOld != nil {
+               fn(c.confOld)
+       }
+}
+
+func (c *hugoBuilder) withConfOrOldConfE(fn func(conf *commonConfig) error) error {
+       c.confmu.Lock()
+       defer c.confmu.Unlock()
+       if c.conf != nil {
+               return fn(c.conf)
+       } else if c.confOld != nil {
+               return fn(c.confOld)
+       }
+       return errConfigNotSet
+}
+
 type hugoBuilderErrState struct {
        mu       sync.Mutex
        paused   bool
@@ -1095,6 +1117,7 @@ func (c *hugoBuilder) loadConfig(cd *simplecobra.Commandeer, running bool) error
        }
 
        c.conf = conf
+       c.confOld = conf
        if c.onConfigLoaded != nil {
                if err := c.onConfigLoaded(false); err != nil {
                        return err
@@ -1158,8 +1181,9 @@ func (c *hugoBuilder) reloadConfig() error {
        c.r.resetLogs()
        c.r.configVersionID.Add(1)
 
-       if err := c.withConfE(func(conf *commonConfig) error {
+       if err := c.withConfOrOldConfE(func(conf *commonConfig) error {
                oldConf := conf
+               c.conf = nil
                newConf, err := c.r.ConfigFromConfig(configKey{counter: c.r.configVersionID.Load()}, conf)
                if err != nil {
                        return err
index 1f5c584634c6355b901a67b1b497da02b15e06b7..48e4c79fb438e755f91d261122562c1ba1c776d0 100644 (file)
@@ -282,7 +282,7 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, net.Listener, string
                                        }
 
                                        port = 1313
-                                       f.c.withConf(func(conf *commonConfig) {
+                                       f.c.withConfOrOldConf(func(conf *commonConfig) {
                                                if lrport := conf.configs.GetFirstLanguageConfig().BaseURLLiveReload().Port(); lrport != 0 {
                                                        port = lrport
                                                }
index 785405033e817c372869f8bef4b4af9e1cf9b71b..b49a0b746b74fd2007e9dfcd00bab3e9f39ad534 100644 (file)
@@ -20,6 +20,7 @@ import (
        "io"
        "os"
        "strings"
+       "sync"
        "time"
 
        "github.com/bep/logg"
@@ -123,8 +124,11 @@ func New(opts Options) Logger {
        )
 
        l := logger.WithLevel(opts.Level)
+       logMu := &sync.Mutex{}
 
        reset := func() {
+               logMu.Lock()
+               defer logMu.Unlock()
                logCounters.mu.Lock()
                defer logCounters.mu.Unlock()
                logCounters.counters = make(map[logg.Level]int)
@@ -135,6 +139,7 @@ func New(opts Options) Logger {
        }
 
        return &logAdapter{
+               mu:          logMu,
                logCounters: logCounters,
                errors:      errorsw,
                reset:       reset,
@@ -204,6 +209,7 @@ type Logger interface {
 }
 
 type logAdapter struct {
+       mu          *sync.Mutex
        logCounters *logLevelCounter
        errors      *strings.Builder
        reset       func()
@@ -328,6 +334,8 @@ func (l *logAdapter) Errorln(v ...any) {
 }
 
 func (l *logAdapter) Errors() string {
+       l.mu.Lock()
+       defer l.mu.Unlock()
        return l.errors.String()
 }
 
index 79d0c554edbb169ccbf4d5d4617fee8b3ff3ccce..facd8ed46afc3b576839b2d267f2a7dee4c9422d 100644 (file)
@@ -241,7 +241,9 @@ var commonTestScriptsParam = testscript.Params{
                        if err != nil {
                                ts.Fatalf("failed to read file %v", err)
                        }
-                       newContent := bytes.Replace(oldContent, []byte(args[1]), []byte(args[2]), -1)
+                       old, new := args[1], args[2]
+
+                       newContent := bytes.Replace(oldContent, []byte(old), []byte(new), -1)
                        err = os.WriteFile(filename, newContent, 0o644)
                        if err != nil {
                                ts.Fatalf("failed to write file: %v", err)