server: Fix SIGINT handling after loading bad configuration

Also fix the config error messages.

Fixes #9664
This commit is contained in:
Bjørn Erik Pedersen 2022-05-15 21:01:36 +02:00
parent fc9f315d86
commit 87a22eb6d6
4 changed files with 60 additions and 14 deletions

View file

@ -130,6 +130,15 @@ func (c *commandeerHugoState) hugo() *hugolib.HugoSites {
return c.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 { func (c *commandeer) errCount() int {
return int(c.logger.LogCounters().ErrorCounter.Count()) return int(c.logger.LogCounters().ErrorCounter.Count())
} }

View file

@ -522,18 +522,20 @@ func (c *commandeer) serve(s *serverCmd) error {
roots = []string{""} roots = []string{""}
} }
templHandler := c.hugo().Tmpl()
errTempl, found := templHandler.Lookup("_server/error.html")
if !found {
panic("template server/error.html not found")
}
srv := &fileServer{ srv := &fileServer{
baseURLs: baseURLs, baseURLs: baseURLs,
roots: roots, roots: roots,
c: c, c: c,
s: s, s: s,
errorTemplate: func(ctx any) (io.Reader, error) { 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{} b := &bytes.Buffer{}
err := c.hugo().Tmpl().Execute(templ, b, ctx) err := templHandler.Execute(errTempl, b, ctx)
return b, err return b, err
}, },
} }
@ -579,16 +581,37 @@ func (c *commandeer) serve(s *serverCmd) error {
jww.FEEDBACK.Println("Press Ctrl+C to stop") jww.FEEDBACK.Println("Press Ctrl+C to stop")
err := func() error {
if s.stop != nil { if s.stop != nil {
for {
select { select {
case <-sigs: case <-sigs:
return nil
case <-s.stop: case <-s.stop:
return nil
case <-ctx.Done():
return ctx.Err()
}
} }
} else { } else {
<-sigs for {
select {
case <-sigs:
return nil
case <-ctx.Done():
return ctx.Err()
}
}
}
}()
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) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel() defer cancel()

View file

@ -59,6 +59,13 @@ func FromConfigString(config, configType string) (Provider, error) {
func FromFile(fs afero.Fs, filename string) (Provider, error) { func FromFile(fs afero.Fs, filename string) (Provider, error) {
m, err := loadConfigFromFile(fs, filename) m, err := loadConfigFromFile(fs, filename)
if err != nil { 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 nil, herrors.NewFileErrorFromFile(err, filename, fs, nil)
} }
return NewFrom(m), nil return NewFrom(m), nil

View file

@ -75,7 +75,7 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
if err == nil { if err == nil {
configFiles = append(configFiles, filename) configFiles = append(configFiles, filename)
} else if err != ErrNoConfigFile { } 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) m, err := config.FromFileToMap(l.Fs, filename)
if err != nil { if err != nil {
return "", l.wrapFileError(err, filename) return filename, err
} }
// Set overwrites keys of the same name, recursively. // 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 { 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) return herrors.NewFileErrorFromFile(err, filename, l.Fs, nil)
} }