]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
server: Fix SIGINT handling after loading bad configuration
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 15 May 2022 19:01:36 +0000 (21:01 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 15 May 2022 20:58:05 +0000 (22:58 +0200)
Also fix the config error messages.

Fixes #9664

commands/commandeer.go
commands/server.go
config/configLoader.go
hugolib/config.go

index b302cbfe0a39745c99085f32bb24fda2713e4f61..444d7598711f722bea6f7c5a2a554a3404c1d43f 100644 (file)
@@ -130,6 +130,15 @@ func (c *commandeerHugoState) hugo() *hugolib.HugoSites {
        return c.hugoSites
 }
 
+func (c *commandeerHugoState) hugoTry() *hugolib.HugoSites {
+       select {
+       case <-c.created:
+               return c.hugoSites
+       case <-time.After(time.Millisecond * 100):
+               return nil
+       }
+}
+
 func (c *commandeer) errCount() int {
        return int(c.logger.LogCounters().ErrorCounter.Count())
 }
index f616810039c9b2e9030b7c310a395ece5141340d..a339a176013926606bbdb834d7fa08c0c57d5645 100644 (file)
@@ -522,18 +522,20 @@ func (c *commandeer) serve(s *serverCmd) error {
                roots = []string{""}
        }
 
+       templHandler := c.hugo().Tmpl()
+       errTempl, found := templHandler.Lookup("_server/error.html")
+       if !found {
+               panic("template server/error.html not found")
+       }
+
        srv := &fileServer{
                baseURLs: baseURLs,
                roots:    roots,
                c:        c,
                s:        s,
                errorTemplate: func(ctx any) (io.Reader, error) {
-                       templ, found := c.hugo().Tmpl().Lookup("_server/error.html")
-                       if !found {
-                               panic("template server/error.html not found")
-                       }
                        b := &bytes.Buffer{}
-                       err := c.hugo().Tmpl().Execute(templ, b, ctx)
+                       err := templHandler.Execute(errTempl, b, ctx)
                        return b, err
                },
        }
@@ -579,16 +581,37 @@ func (c *commandeer) serve(s *serverCmd) error {
 
        jww.FEEDBACK.Println("Press Ctrl+C to stop")
 
-       if s.stop != nil {
-               select {
-               case <-sigs:
-               case <-s.stop:
+       err := func() error {
+               if s.stop != nil {
+                       for {
+                               select {
+                               case <-sigs:
+                                       return nil
+                               case <-s.stop:
+                                       return nil
+                               case <-ctx.Done():
+                                       return ctx.Err()
+                               }
+                       }
+               } else {
+                       for {
+                               select {
+                               case <-sigs:
+                                       return nil
+                               case <-ctx.Done():
+                                       return ctx.Err()
+                               }
+                       }
                }
-       } else {
-               <-sigs
+       }()
+
+       if err != nil {
+               jww.ERROR.Println("Error:", err)
        }
 
-       c.hugo().Close()
+       if h := c.hugoTry(); h != nil {
+               h.Close()
+       }
 
        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
        defer cancel()
index d25546cdbc79a134ee9ed4c4b69a2fca15d33ba1..6722c12fd73ee89ebb199878dbda243394646a40 100644 (file)
@@ -59,6 +59,13 @@ func FromConfigString(config, configType string) (Provider, error) {
 func FromFile(fs afero.Fs, filename string) (Provider, error) {
        m, err := loadConfigFromFile(fs, filename)
        if err != nil {
+               fe := herrors.UnwrapFileError(err)
+               if fe != nil {
+                       pos := fe.Position()
+                       pos.Filename = filename
+                       fe.UpdatePosition(pos)
+                       return nil, err
+               }
                return nil, herrors.NewFileErrorFromFile(err, filename, fs, nil)
        }
        return NewFrom(m), nil
index e63d6da4ec1284d9beb969ee24893ba27a2ac513..ef23086b533fc0b832e3ba3b32a1e38a76d8b177 100644 (file)
@@ -75,7 +75,7 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
                if err == nil {
                        configFiles = append(configFiles, filename)
                } else if err != ErrNoConfigFile {
-                       return nil, nil, err
+                       return nil, nil, l.wrapFileError(err, filename)
                }
        }
 
@@ -463,7 +463,7 @@ func (l configLoader) loadConfig(configName string) (string, error) {
 
        m, err := config.FromFileToMap(l.Fs, filename)
        if err != nil {
-               return "", l.wrapFileError(err, filename)
+               return filename, err
        }
 
        // Set overwrites keys of the same name, recursively.
@@ -511,5 +511,12 @@ func (configLoader) loadSiteConfig(cfg config.Provider) (scfg SiteConfig, err er
 }
 
 func (l configLoader) wrapFileError(err error, filename string) error {
+       fe := herrors.UnwrapFileError(err)
+       if fe != nil {
+               pos := fe.Position()
+               pos.Filename = filename
+               fe.UpdatePosition(pos)
+               return err
+       }
        return herrors.NewFileErrorFromFile(err, filename, l.Fs, nil)
 }