Repository: gohugoio/hugo (language: go)

Issue:
Some issues with the new --clock flag

```bash
time hugo --clock 2023-12-01                                                                                                                                                 master ✱
Start building sites … 
hugo v0.99.0-DEV-855e5869c60ef8f41d5145bbbeeb7a0efbbef468 darwin/arm64 BuildDate=2022-05-08T14:57:29Z

                   | EN  | ZH   
-------------------+-----+------
  Pages            | 562 |  23  
  Paginator pages  |   2 |   1  
  Non-page files   |  92 |   1  
  Static files     | 147 | 147  
  Processed images | 474 |   0  
  Aliases          |  16 |   4  
  Sitemaps         |   2 |   1  
  Cleaned          |   0 |   0  

Total in 49360469577 ms
hugo --clock 2023-12-01  79.18s user 0.81s system 537% cpu 14.874 total
```

* So, the `Total in ...` I assume is coming from using a combination of the system time and the adjusted clock.
* But it's also actually much slower, which I don't understand , but that needs to be fixed.

Running without the flag:

```bash
time hugo                                                                                                                                                                    master ✱
Start building sites … 
hugo v0.99.0-DEV-855e5869c60ef8f41d5145bbbeeb7a0efbbef468 darwin/arm64 BuildDate=2022-05-08T14:57:29Z

                   | EN  | ZH   
-------------------+-----+------
  Pages            | 561 |  23  
  Paginator pages  |   2 |   1  
  Non-page files   |  92 |   1  
  Static files     | 147 | 147  
  Processed images | 473 |   0  
  Aliases          |  16 |   4  
  Sitemaps         |   2 |   1  
  Cleaned          |   0 |   0  

Total in 746 ms
hugo  2.47s user 0.30s system 353% cpu 0.782 total
```


Discussion / hints:

Fix patch:
diff --git a/cache/filecache/filecache.go b/cache/filecache/filecache.go
index 3104d8ac6da..63d939ef690 100644
--- a/cache/filecache/filecache.go
+++ b/cache/filecache/filecache.go
@@ -24,7 +24,6 @@ import (
 	"sync"
 	"time"
 
-	"github.com/gohugoio/hugo/common/htime"
 	"github.com/gohugoio/hugo/common/hugio"
 
 	"github.com/gohugoio/hugo/helpers"
@@ -296,7 +295,10 @@ func (c *Cache) isExpired(modTime time.Time) bool {
 	if c.maxAge < 0 {
 		return false
 	}
-	return c.maxAge == 0 || htime.Since(modTime) > c.maxAge
+
+	// Note the use of time.Since here.
+	// We cannot use Hugo's global Clock for this.
+	return c.maxAge == 0 || time.Since(modTime) > c.maxAge
 }
 
 // For testing
diff --git a/commands/commands.go b/commands/commands.go
index d55a4e9aab3..aee6a72841a 100644
--- a/commands/commands.go
+++ b/commands/commands.go
@@ -18,7 +18,6 @@ import (
 	"os"
 	"time"
 
-	"github.com/gohugoio/hugo/common/htime"
 	"github.com/gohugoio/hugo/common/hugo"
 	"github.com/gohugoio/hugo/common/loggers"
 	hpaths "github.com/gohugoio/hugo/common/paths"
@@ -152,7 +151,7 @@ built with love by spf13 and friends in Go.
 
 Complete documentation is available at https://gohugo.io/.`,
 		RunE: func(cmd *cobra.Command, args []string) error {
-			defer cc.timeTrack(htime.Now(), "Total")
+			defer cc.timeTrack(time.Now(), "Total")
 			cfgInit := func(c *commandeer) error {
 				if cc.buildWatch {
 					c.Set("disableLiveReload", true)
@@ -238,7 +237,7 @@ func (cc *hugoBuilderCommon) timeTrack(start time.Time, name string) {
 	if cc.quiet {
 		return
 	}
-	elapsed := htime.Since(start)
+	elapsed := time.Since(start)
 	fmt.Printf("%s in %v ms\n", name, int(1000*elapsed.Seconds()))
 }
 
diff --git a/commands/hugo.go b/commands/hugo.go
index 43ec7e5c708..c13fdce0604 100644
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -681,7 +681,11 @@ func (c *commandeer) firstPathSpec() *helpers.PathSpec {
 }
 
 func (c *commandeer) timeTrack(start time.Time, name string) {
-	elapsed := htime.Since(start)
+	// Note the use of time.Since here and time.Now in the callers.
+	// We have a htime.Sinnce, but that may be adjusted to the future,
+	// and that does not make sense here, esp. when used before the
+	// global Clock is initialized.
+	elapsed := time.Since(start)
 	c.logger.Printf("%s in %v ms", name, int(1000*elapsed.Seconds()))
 }
 
@@ -792,7 +796,7 @@ func (c *commandeer) fullRebuild(changeType string) {
 			time.Sleep(2 * time.Second)
 		}()
 
-		defer c.timeTrack(htime.Now(), "Rebuilt")
+		defer c.timeTrack(time.Now(), "Rebuilt")
 
 		c.commandeerHugoState = newCommandeerHugoState()
 		err := c.loadConfig()
@@ -1137,7 +1141,7 @@ func (c *commandeer) handleEvents(watcher *watcher.Batcher,
 		c.changeDetector.PrepareNew()
 
 		func() {
-			defer c.timeTrack(htime.Now(), "Total")
+			defer c.timeTrack(time.Now(), "Total")
 			if err := c.rebuildSites(dynamicEvents); err != nil {
 				c.handleBuildErr(err, "Rebuild failed")
 			}
diff --git a/commands/server.go b/commands/server.go
index 5fdde21c588..27b12cb32ed 100644
--- a/commands/server.go
+++ b/commands/server.go
@@ -251,7 +251,7 @@ func (sc *serverCmd) server(cmd *cobra.Command, args []string) error {
 	}
 
 	err = func() error {
-		defer c.timeTrack(htime.Now(), "Built")
+		defer c.timeTrack(time.Now(), "Built")
 		err := c.serverBuild()
 		if err != nil {
 			cmd.PrintErrln("Error:", err.Error())
diff --git a/common/loggers/loggers.go b/common/loggers/loggers.go
index 6b73c9f32c1..14c76ae4576 100644
--- a/common/loggers/loggers.go
+++ b/common/loggers/loggers.go
@@ -24,7 +24,6 @@ import (
 	"runtime"
 	"time"
 
-	"github.com/gohugoio/hugo/common/htime"
 	"github.com/gohugoio/hugo/common/terminal"
 
 	jww "github.com/spf13/jwalterweatherman"
@@ -177,7 +176,7 @@ func (l *logger) Out() io.Writer {
 // PrintTimerIfDelayed prints a time statement to the FEEDBACK logger
 // if considerable time is spent.
 func (l *logger) PrintTimerIfDelayed(start time.Time, name string) {
-	elapsed := htime.Since(start)
+	elapsed := time.Since(start)
 	milli := int(1000 * elapsed.Seconds())
 	if milli < 500 {
 		return
@@ -186,7 +185,7 @@ func (l *logger) PrintTimerIfDelayed(start time.Time, name string) {
 }
 
 func (l *logger) PrintTimer(start time.Time, name string) {
-	elapsed := htime.Since(start)
+	elapsed := time.Since(start)
 	milli := int(1000 * elapsed.Seconds())
 	l.Printf("%s in %v ms", name, milli)
 }
diff --git a/metrics/metrics.go b/metrics/metrics.go
index 471f48a0471..9c46fdf7ee3 100644
--- a/metrics/metrics.go
+++ b/metrics/metrics.go
@@ -25,7 +25,6 @@ import (
 	"sync"
 	"time"
 
-	"github.com/gohugoio/hugo/common/htime"
 	"github.com/gohugoio/hugo/common/types"
 	"github.com/gohugoio/hugo/compare"
 	"github.com/gohugoio/hugo/helpers"
@@ -130,7 +129,7 @@ func (s *Store) TrackValue(key string, value any, cached bool) {
 // MeasureSince adds a measurement for key to the metric store.
 func (s *Store) MeasureSince(key string, start time.Time) {
 	s.mu.Lock()
-	s.metrics[key] = append(s.metrics[key], htime.Since(start))
+	s.metrics[key] = append(s.metrics[key], time.Since(start))
 	s.mu.Unlock()
 }
 
diff --git a/modules/collect.go b/modules/collect.go
index 4f5b1c36faa..ff83f9ecca8 100644
--- a/modules/collect.go
+++ b/modules/collect.go
@@ -23,7 +23,6 @@ import (
 	"time"
 
 	"github.com/bep/debounce"
-	"github.com/gohugoio/hugo/common/htime"
 	"github.com/gohugoio/hugo/common/loggers"
 
 	"github.com/spf13/cast"
@@ -506,7 +505,7 @@ func (c *collector) applyThemeConfig(tc *moduleAdapter) error {
 }
 
 func (c *collector) collect() {
-	defer c.logger.PrintTimerIfDelayed(htime.Now(), "hugo: collected modules")
+	defer c.logger.PrintTimerIfDelayed(time.Now(), "hugo: collected modules")
 	d := debounce.New(2 * time.Second)
 	d(func() {
 		c.logger.Println("hugo: downloading modules …")
diff --git a/tpl/partials/partials.go b/tpl/partials/partials.go
index 9ded32a7134..eb4ebfe321a 100644
--- a/tpl/partials/partials.go
+++ b/tpl/partials/partials.go
@@ -25,8 +25,8 @@ import (
 	"reflect"
 	"strings"
 	"sync"
+	"time"
 
-	"github.com/gohugoio/hugo/common/htime"
 	texttemplate "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate"
 
 	"github.com/gohugoio/hugo/helpers"
@@ -222,7 +222,7 @@ func createKey(name string, variants ...any) (partialCacheKey, error) {
 var errUnHashable = errors.New("unhashable")
 
 func (ns *Namespace) getOrCreate(ctx context.Context, key partialCacheKey, context any) (result any, err error) {
-	start := htime.Now()
+	start := time.Now()
 	defer func() {
 		if r := recover(); r != nil {
 			err = r.(error)
diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go
index d352f02e825..c092ff63816 100644
--- a/tpl/tplimpl/template.go
+++ b/tpl/tplimpl/template.go
@@ -27,10 +27,10 @@ import (
 	"sort"
 	"strings"
 	"sync"
+	"time"
 	"unicode"
 	"unicode/utf8"
 
-	"github.com/gohugoio/hugo/common/htime"
 	"github.com/gohugoio/hugo/common/types"
 
 	"github.com/gohugoio/hugo/helpers"
@@ -235,7 +235,7 @@ func (t *templateExec) ExecuteWithContext(ctx context.Context, templ tpl.Templat
 		defer rlocker.RUnlock()
 	}
 	if t.Metrics != nil {
-		defer t.Metrics.MeasureSince(templ.Name(), htime.Now())
+		defer t.Metrics.MeasureSince(templ.Name(), time.Now())
 	}
 
 	if t.templateUsageTracker != nil {


Test patch: