mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-27 22:09:53 +02:00
Fix some server rebuild issues for non-HTML custom output formats
The failing test case here is * A custom search output format defined on the home page, marked as `noAlternative` and not `permalinkable` * In fast render mode, when making a change to a data source for that search output format, the JSON file was not refreshed. There are variants of the above, but the gist of it is: * The change set was correctly determined, but since the search JSON file was not in the recently visited browser stack, we skipped rendering it. Running with `hugo server --disableFastRender` would be a workaround for the above. This commit fixes this by: * Adding a check for the HTTP request header `Sec-Fetch-Mode = navigation` to the condition for if we should track server request as a user navigation (and not e.g. a HTTP request for a linked CSS stylesheet). * Making sure that we compare against the real relative URL for non-permalinkable output formats. Fixes #13014
This commit is contained in:
@@ -416,8 +416,8 @@ type BuildCfg struct {
|
||||
// Set in server mode when the last build failed for some reason.
|
||||
ErrRecovery bool
|
||||
|
||||
// Recently visited URLs. This is used for partial re-rendering.
|
||||
RecentlyVisited *types.EvictingStringQueue
|
||||
// Recently visited or touched URLs. This is used for partial re-rendering.
|
||||
RecentlyTouched *types.EvictingQueue[string]
|
||||
|
||||
// Can be set to build only with a sub set of the content source.
|
||||
ContentInclusionFilter *glob.FilenameFilter
|
||||
@@ -429,7 +429,7 @@ type BuildCfg struct {
|
||||
}
|
||||
|
||||
// shouldRender returns whether this output format should be rendered or not.
|
||||
func (cfg *BuildCfg) shouldRender(p *pageState) bool {
|
||||
func (cfg *BuildCfg) shouldRender(infol logg.LevelLogger, p *pageState) bool {
|
||||
if p.skipRender() {
|
||||
return false
|
||||
}
|
||||
@@ -457,18 +457,20 @@ func (cfg *BuildCfg) shouldRender(p *pageState) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if p.outputFormat().IsHTML {
|
||||
// This is fast render mode and the output format is HTML,
|
||||
// rerender if this page is one of the recently visited.
|
||||
return cfg.RecentlyVisited.Contains(p.RelPermalink())
|
||||
if relURL := p.getRelURL(); relURL != "" {
|
||||
if cfg.RecentlyTouched.Contains(relURL) {
|
||||
infol.Logf("render recently touched URL %q (%s)", relURL, p.outputFormat().Name)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// In fast render mode, we want to avoid re-rendering the sitemaps etc. and
|
||||
// other big listings whenever we e.g. change a content file,
|
||||
// but we want partial renders of the recently visited pages to also include
|
||||
// but we want partial renders of the recently touched pages to also include
|
||||
// alternative formats of the same HTML page (e.g. RSS, JSON).
|
||||
for _, po := range p.pageOutputs {
|
||||
if po.render && po.f.IsHTML && cfg.RecentlyVisited.Contains(po.RelPermalink()) {
|
||||
if po.render && po.f.IsHTML && cfg.RecentlyTouched.Contains(po.getRelURL()) {
|
||||
infol.Logf("render recently touched URL %q, %s version of %s", po.getRelURL(), po.f.Name, p.outputFormat().Name)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user