mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
server: Fix SIGINT handling after loading bad configuration
Also fix the config error messages. Fixes #9664
This commit is contained in:
parent
fc9f315d86
commit
87a22eb6d6
4 changed files with 60 additions and 14 deletions
|
@ -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())
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
if s.stop != nil {
|
err := func() error {
|
||||||
select {
|
if s.stop != nil {
|
||||||
case <-sigs:
|
for {
|
||||||
case <-s.stop:
|
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)
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue