summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-03-14 16:02:04 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-04-08 13:26:16 +0200
commit0a56f2af4e1969e76e94fdfb56d1bbed0e685625 (patch)
treedb258649317ea350ce6c56f00483d5655963de16 /commands
parent9e360d3844f5077c65649e4c9c98f5cbd1c3efc0 (diff)
Revert "Revert "Allow rendering static files to disk and dynamic to memory in server mode""
Diffstat (limited to 'commands')
-rw-r--r--commands/commandeer.go14
-rw-r--r--commands/hugo.go3
-rw-r--r--commands/server.go23
-rw-r--r--commands/static_syncer.go9
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)