diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-03-14 16:02:04 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-04-08 13:26:16 +0200 |
commit | 0a56f2af4e1969e76e94fdfb56d1bbed0e685625 (patch) | |
tree | db258649317ea350ce6c56f00483d5655963de16 /commands | |
parent | 9e360d3844f5077c65649e4c9c98f5cbd1c3efc0 (diff) |
Revert "Revert "Allow rendering static files to disk and dynamic to memory in server mode""
This reverts commit 64b7b7a89753a39661219b2fcb92d7f185a03f63.
Diffstat (limited to 'commands')
-rw-r--r-- | commands/commandeer.go | 14 | ||||
-rw-r--r-- | commands/hugo.go | 3 | ||||
-rw-r--r-- | commands/server.go | 23 | ||||
-rw-r--r-- | commands/static_syncer.go | 9 |
4 files changed, 38 insertions, 11 deletions
diff --git a/commands/commandeer.go b/commands/commandeer.go index 8a1925893..6f74bf864 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -94,6 +94,7 @@ type commandeer struct { languagesConfigured bool languages langs.Languages doLiveReload bool + renderStaticToDisk bool fastRenderMode bool showErrorInBrowser bool wasError bool @@ -375,8 +376,9 @@ func (c *commandeer) loadConfig() error { } createMemFs := config.GetBool("renderToMemory") + c.renderStaticToDisk = config.GetBool("renderStaticToDisk") - if createMemFs { + if createMemFs && !c.renderStaticToDisk { // Rendering to memoryFS, publish to Root regardless of publishDir. config.Set("publishDir", "/") } @@ -387,6 +389,14 @@ func (c *commandeer) loadConfig() error { if c.destinationFs != 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 + 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) @@ -404,11 +414,13 @@ func (c *commandeer) loadConfig() error { changeDetector.PrepareNew() fs.Destination = hugofs.NewHashingFs(fs.Destination, changeDetector) + fs.DestinationStatic = hugofs.NewHashingFs(fs.DestinationStatic, changeDetector) c.changeDetector = changeDetector } if c.Cfg.GetBool("logPathWarnings") { fs.Destination = hugofs.NewCreateCountingFs(fs.Destination) + fs.DestinationStatic = hugofs.NewCreateCountingFs(fs.DestinationStatic) } // To debug hard-to-find path issues. diff --git a/commands/hugo.go b/commands/hugo.go index 8c5294f00..21140fa43 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -652,6 +652,9 @@ func (c *commandeer) copyStaticTo(sourceFs *filesystems.SourceFilesystem) (uint6 syncer.ChmodFilter = chmodFilter syncer.SrcFs = fs syncer.DestFs = c.Fs.Destination + if c.renderStaticToDisk { + syncer.DestFs = c.Fs.DestinationStatic + } // Now that we are using a unionFs for the static directories // We can effectively clean the publishDir on initial sync syncer.Delete = c.Cfg.GetBool("cleanDestinationDir") diff --git a/commands/server.go b/commands/server.go index bb6a4e15d..23301d004 100644 --- a/commands/server.go +++ b/commands/server.go @@ -50,15 +50,16 @@ type serverCmd struct { // Can be used to stop the server. Useful in tests stop chan bool - disableLiveReload bool - navigateToChanged bool - renderToDisk bool - serverAppend bool - serverInterface string - serverPort int - liveReloadPort int - serverWatch bool - noHTTPCache bool + disableLiveReload bool + navigateToChanged bool + renderToDisk bool + renderStaticToDisk bool + serverAppend bool + serverInterface string + serverPort int + liveReloadPort int + serverWatch bool + noHTTPCache bool disableFastRender bool disableBrowserError bool @@ -109,6 +110,7 @@ of a second, you will be able to save and see your changes nearly instantly.`, cc.cmd.Flags().BoolVar(&cc.renderToDisk, "renderToDisk", false, "render to Destination path (default is render to memory & serve from there)") cc.cmd.Flags().BoolVar(&cc.disableFastRender, "disableFastRender", false, "enables full re-renders on changes") cc.cmd.Flags().BoolVar(&cc.disableBrowserError, "disableBrowserError", false, "do not show build errors in the browser") + cc.cmd.Flags().BoolVar(&cc.renderStaticToDisk, "renderStaticToDisk", false, "render static files to disk but dynamic files render to memory.") cc.cmd.Flags().String("memstats", "", "log memory usage to this file") cc.cmd.Flags().String("meminterval", "100ms", "interval to poll memory usage (requires --memstats), valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".") @@ -147,6 +149,7 @@ func (sc *serverCmd) server(cmd *cobra.Command, args []string) error { cfgInit := func(c *commandeer) (rerr error) { c.Set("renderToMemory", !sc.renderToDisk) + c.Set("renderStaticToDisk", sc.renderStaticToDisk) if cmd.Flags().Changed("navigateToChanged") { c.Set("navigateToChanged", sc.navigateToChanged) } @@ -340,6 +343,8 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, net.Listener, string if i == 0 { if f.s.renderToDisk { jww.FEEDBACK.Println("Serving pages from " + absPublishDir) + } else if f.s.renderStaticToDisk { + jww.FEEDBACK.Println("Serving pages from memory and static files from " + absPublishDir) } else { jww.FEEDBACK.Println("Serving pages from memory") } diff --git a/commands/static_syncer.go b/commands/static_syncer.go index 5569d4de6..2eb2b6662 100644 --- a/commands/static_syncer.go +++ b/commands/static_syncer.go @@ -56,6 +56,9 @@ func (s *staticSyncer) syncsStaticEvents(staticEvents []fsnotify.Event) error { syncer.ChmodFilter = chmodFilter syncer.SrcFs = sourceFs.Fs syncer.DestFs = c.Fs.Destination + if c.renderStaticToDisk { + syncer.DestFs = c.Fs.DestinationStatic + } // prevent spamming the log on changes logger := helpers.NewDistinctErrorLogger() @@ -101,7 +104,11 @@ func (s *staticSyncer) syncsStaticEvents(staticEvents []fsnotify.Event) error { toRemove := filepath.Join(publishDir, relPath) logger.Println("File no longer exists in static dir, removing", toRemove) - _ = c.Fs.Destination.RemoveAll(toRemove) + if c.renderStaticToDisk { + _ = c.Fs.DestinationStatic.RemoveAll(toRemove) + } else { + _ = c.Fs.Destination.RemoveAll(toRemove) + } } else if err == nil { // If file still exists, sync it logger.Println("Syncing", relPath, "to", publishDir) |