diff options
Diffstat (limited to 'commands/commandeer.go')
-rw-r--r-- | commands/commandeer.go | 78 |
1 files changed, 59 insertions, 19 deletions
diff --git a/commands/commandeer.go b/commands/commandeer.go index ced149e7a..1162a4b70 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -30,6 +30,7 @@ import ( "github.com/gohugoio/hugo/common/herrors" "github.com/gohugoio/hugo/common/hugo" + "github.com/gohugoio/hugo/common/paths" jww "github.com/spf13/jwalterweatherman" @@ -42,6 +43,7 @@ import ( "github.com/spf13/afero" "github.com/bep/debounce" + "github.com/bep/overlayfs" "github.com/gohugoio/hugo/common/types" "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/helpers" @@ -73,8 +75,10 @@ type commandeer struct { // be fast enough that we could maybe just add it for all server modes. changeDetector *fileChangeDetector - // We need to reuse this on server rebuilds. - destinationFs afero.Fs + // We need to reuse these on server rebuilds. + // These 2 will be different if --renderStaticToDisk is set. + publishDirFs afero.Fs + publishDirServerFs afero.Fs h *hugoBuilderCommon ftch flagsToConfigHandler @@ -162,7 +166,8 @@ func (c *commandeer) Set(key string, value any) { } func (c *commandeer) initFs(fs *hugofs.Fs) error { - c.destinationFs = fs.Destination + c.publishDirFs = fs.PublishDir + c.publishDirServerFs = fs.PublishDirServer c.DepsCfg.Fs = fs return nil @@ -378,28 +383,63 @@ func (c *commandeer) loadConfig() error { createMemFs := config.GetBool("renderToMemory") c.renderStaticToDisk = config.GetBool("renderStaticToDisk") - if createMemFs && !c.renderStaticToDisk { + if createMemFs { // Rendering to memoryFS, publish to Root regardless of publishDir. config.Set("publishDir", "/") + config.Set("publishDirStatic", "/") + } else if c.renderStaticToDisk { + // Hybrid, render dynamic content to Root. + config.Set("publishDirStatic", config.Get("publishDir")) + config.Set("publishDir", "/") + } c.fsCreate.Do(func() { fs := hugofs.NewFrom(sourceFs, config) - if c.destinationFs != nil { + if c.publishDirFs != nil { // Need to reuse the destination on server rebuilds. - fs.Destination = c.destinationFs - } else if createMemFs && c.renderStaticToDisk { - // Writes the dynamic output on memory, - // while serve others directly from publishDir + fs.PublishDir = c.publishDirFs + fs.PublishDirServer = c.publishDirServerFs + } else { publishDir := config.GetString("publishDir") - writableFs := afero.NewBasePathFs(afero.NewMemMapFs(), publishDir) - publicFs := afero.NewOsFs() - fs.Destination = afero.NewCopyOnWriteFs(afero.NewReadOnlyFs(publicFs), writableFs) - fs.DestinationStatic = publicFs - } else if createMemFs { - // Hugo writes the output to memory instead of the disk. - fs.Destination = new(afero.MemMapFs) + publishDirStatic := config.GetString("publishDirStatic") + workingDir := config.GetString("workingDir") + absPublishDir := paths.AbsPathify(workingDir, publishDir) + absPublishDirStatic := paths.AbsPathify(workingDir, publishDirStatic) + + if c.renderStaticToDisk { + // Writes the dynamic output oton memory, + // while serve others directly from /public on disk. + dynamicFs := afero.NewMemMapFs() + staticFs := afero.NewBasePathFs(afero.NewOsFs(), absPublishDirStatic) + + // Serve from both the static and dynamic fs, + // the first will take priority. + // THis is a read-only filesystem, + // we do all the writes to + // fs.Destination and fs.DestinationStatic. + fs.PublishDirServer = overlayfs.New( + overlayfs.Options{ + Fss: []afero.Fs{ + dynamicFs, + staticFs, + }, + }, + ) + fs.PublishDir = dynamicFs + fs.PublishDirStatic = staticFs + } else if createMemFs { + // Hugo writes the output to memory instead of the disk. + fs.PublishDir = new(afero.MemMapFs) + fs.PublishDirServer = fs.PublishDir + fs.PublishDirStatic = fs.PublishDir + } else { + // Write everything to disk. + fs.PublishDir = afero.NewBasePathFs(afero.NewOsFs(), absPublishDir) + fs.PublishDirServer = fs.PublishDir + fs.PublishDirStatic = fs.PublishDir + } } if c.fastRenderMode { @@ -413,15 +453,15 @@ func (c *commandeer) loadConfig() error { } changeDetector.PrepareNew() - fs.Destination = hugofs.NewHashingFs(fs.Destination, changeDetector) - fs.DestinationStatic = hugofs.NewHashingFs(fs.DestinationStatic, changeDetector) + fs.PublishDir = hugofs.NewHashingFs(fs.PublishDir, changeDetector) + fs.PublishDirStatic = hugofs.NewHashingFs(fs.PublishDirStatic, changeDetector) c.changeDetector = changeDetector } if c.Cfg.GetBool("logPathWarnings") { // Note that we only care about the "dynamic creates" here, // so skip the static fs. - fs.Destination = hugofs.NewCreateCountingFs(fs.Destination) + fs.PublishDir = hugofs.NewCreateCountingFs(fs.PublishDir) } // To debug hard-to-find path issues. |