summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorsatotake <doublequotation@gmail.com>2022-04-27 02:57:04 +0900
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-05-08 16:56:26 +0200
commite77ca3c105bd64c5077d823d2127f6f812a4f681 (patch)
treeebbe9c310bfab1e34f9fd2e36b738fd2a37d6f11 /commands
parentf2946da9e806c2bafbdd26707fe339db79bd980b (diff)
Add `clock` cli flag
Close #8787
Diffstat (limited to 'commands')
-rw-r--r--commands/commandeer.go23
-rw-r--r--commands/commands.go7
-rw-r--r--commands/hugo.go10
-rw-r--r--commands/hugo_test.go45
-rw-r--r--commands/import_jekyll.go5
-rw-r--r--commands/list.go8
-rw-r--r--commands/list_test.go4
-rw-r--r--commands/new_theme.go4
-rw-r--r--commands/server.go7
9 files changed, 95 insertions, 18 deletions
diff --git a/commands/commandeer.go b/commands/commandeer.go
index 5b192c172..20090cccd 100644
--- a/commands/commandeer.go
+++ b/commands/commandeer.go
@@ -15,6 +15,7 @@ package commands
import (
"errors"
+ "fmt"
"io/ioutil"
"net"
"os"
@@ -28,9 +29,11 @@ import (
"golang.org/x/sync/semaphore"
"github.com/gohugoio/hugo/common/herrors"
+ "github.com/gohugoio/hugo/common/htime"
"github.com/gohugoio/hugo/common/hugo"
"github.com/gohugoio/hugo/common/paths"
+ "github.com/spf13/cast"
jww "github.com/spf13/jwalterweatherman"
"github.com/gohugoio/hugo/common/loggers"
@@ -41,6 +44,7 @@ import (
"github.com/gohugoio/hugo/hugolib"
"github.com/spf13/afero"
+ "github.com/bep/clock"
"github.com/bep/debounce"
"github.com/bep/overlayfs"
"github.com/gohugoio/hugo/common/types"
@@ -164,6 +168,20 @@ func (c *commandeer) initFs(fs *hugofs.Fs) error {
return nil
}
+func (c *commandeer) initClock() error {
+ bt := c.Cfg.GetString("clock")
+ if bt == "" {
+ return nil
+ }
+
+ t, err := cast.StringToDateInDefaultLocation(bt, nil)
+ if err != nil {
+ return fmt.Errorf(`failed to parse "clock" flag: %s`, err)
+ }
+ htime.Clock = clock.Start(t)
+ return nil
+}
+
func newCommandeer(mustHaveConfigFile, failOnInitErr, running bool, h *hugoBuilderCommon, f flagsToConfigHandler, cfgInit func(c *commandeer) error, subCmdVs ...*cobra.Command) (*commandeer, error) {
var rebuildDebouncer func(f func())
if running {
@@ -341,6 +359,11 @@ func (c *commandeer) loadConfig() error {
c.configFiles = configFiles
+ err = c.initClock()
+ if err != nil {
+ return err
+ }
+
if l, ok := c.Cfg.Get("languagesSorted").(langs.Languages); ok {
c.languagesConfigured = true
c.languages = l
diff --git a/commands/commands.go b/commands/commands.go
index 99b0866e5..97e6d2113 100644
--- a/commands/commands.go
+++ b/commands/commands.go
@@ -18,6 +18,7 @@ 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"
@@ -151,7 +152,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(time.Now(), "Total")
+ defer cc.timeTrack(htime.Now(), "Total")
cfgInit := func(c *commandeer) error {
if cc.buildWatch {
c.Set("disableLiveReload", true)
@@ -210,6 +211,7 @@ type hugoBuilderCommon struct {
buildWatch bool
poll string
+ clock string
gc bool
@@ -236,7 +238,7 @@ func (cc *hugoBuilderCommon) timeTrack(start time.Time, name string) {
if cc.quiet {
return
}
- elapsed := time.Since(start)
+ elapsed := htime.Since(start)
fmt.Printf("%s in %v ms\n", name, int(1000*elapsed.Seconds()))
}
@@ -279,6 +281,7 @@ func (cc *hugoBuilderCommon) handleCommonBuilderFlags(cmd *cobra.Command) {
cmd.PersistentFlags().StringVarP(&cc.environment, "environment", "e", "", "build environment")
cmd.PersistentFlags().StringP("themesDir", "", "", "filesystem path to themes directory")
cmd.PersistentFlags().StringP("ignoreVendorPaths", "", "", "ignores any _vendor for module paths matching the given Glob pattern")
+ cmd.PersistentFlags().StringVar(&cc.clock, "clock", "", "set clock inside hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00")
}
func (cc *hugoBuilderCommon) handleFlags(cmd *cobra.Command) {
diff --git a/commands/hugo.go b/commands/hugo.go
index 6bd0605db..43ec7e5c7 100644
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -33,6 +33,7 @@ import (
"github.com/gohugoio/hugo/hugofs/files"
"github.com/gohugoio/hugo/tpl"
+ "github.com/gohugoio/hugo/common/htime"
"github.com/gohugoio/hugo/common/types"
"github.com/gohugoio/hugo/hugofs"
@@ -187,6 +188,7 @@ func initializeFlags(cmd *cobra.Command, cfg config.Provider) {
"buildDrafts",
"buildFuture",
"buildExpired",
+ "clock",
"uglyURLs",
"canonifyURLs",
"enableRobotsTXT",
@@ -679,7 +681,7 @@ func (c *commandeer) firstPathSpec() *helpers.PathSpec {
}
func (c *commandeer) timeTrack(start time.Time, name string) {
- elapsed := time.Since(start)
+ elapsed := htime.Since(start)
c.logger.Printf("%s in %v ms", name, int(1000*elapsed.Seconds()))
}
@@ -790,7 +792,7 @@ func (c *commandeer) fullRebuild(changeType string) {
time.Sleep(2 * time.Second)
}()
- defer c.timeTrack(time.Now(), "Rebuilt")
+ defer c.timeTrack(htime.Now(), "Rebuilt")
c.commandeerHugoState = newCommandeerHugoState()
err := c.loadConfig()
@@ -900,7 +902,7 @@ func (c *commandeer) printChangeDetected(typ string) {
c.logger.Println(msg)
const layout = "2006-01-02 15:04:05.000 -0700"
- c.logger.Println(time.Now().Format(layout))
+ c.logger.Println(htime.Now().Format(layout))
}
const (
@@ -1135,7 +1137,7 @@ func (c *commandeer) handleEvents(watcher *watcher.Batcher,
c.changeDetector.PrepareNew()
func() {
- defer c.timeTrack(time.Now(), "Total")
+ defer c.timeTrack(htime.Now(), "Total")
if err := c.rebuildSites(dynamicEvents); err != nil {
c.handleBuildErr(err, "Rebuild failed")
}
diff --git a/commands/hugo_test.go b/commands/hugo_test.go
index bdad25cfc..61160b7dd 100644
--- a/commands/hugo_test.go
+++ b/commands/hugo_test.go
@@ -29,7 +29,6 @@ import (
// Issue #5662
func TestHugoWithContentDirOverride(t *testing.T) {
- t.Parallel()
c := qt.New(t)
files := `
@@ -51,7 +50,6 @@ Page: {{ .Title }}|
// Issue #9794
func TestHugoStaticFilesMultipleStaticAndManyFolders(t *testing.T) {
- t.Parallel()
c := qt.New(t)
files := `
@@ -95,6 +93,36 @@ Home.
}
+// Issue #8787
+func TestHugoListCommandsWithClockFlag(t *testing.T) {
+ c := qt.New(t)
+
+ files := `
+-- config.toml --
+baseURL = "https://example.org"
+title = "Hugo Commands"
+-- content/past.md --
+---
+title: "Past"
+date: 2000-11-06
+---
+-- content/future.md --
+---
+title: "Future"
+date: 2200-11-06
+---
+-- layouts/_default/single.html --
+Page: {{ .Title }}|
+
+`
+ s := newTestHugoCmdBuilder(c, files, []string{"list", "future"}).Build()
+ p := filepath.Join("content", "future.md")
+ s.AssertStdout(p + ",2200-11-06T00:00:00Z")
+
+ s = newTestHugoCmdBuilder(c, files, []string{"list", "future", "--clock", "2300-11-06"}).Build()
+ s.AssertStdout("")
+}
+
type testHugoCmdBuilder struct {
*qt.C
@@ -102,6 +130,7 @@ type testHugoCmdBuilder struct {
dir string
files string
args []string
+ out string
}
func newTestHugoCmdBuilder(c *qt.C, files string, args []string) *testHugoCmdBuilder {
@@ -127,8 +156,12 @@ func (s *testHugoCmdBuilder) Build() *testHugoCmdBuilder {
args := append(s.args, "-s="+s.dir, "--quiet")
cmd.SetArgs(args)
- _, err := cmd.ExecuteC()
+ out, err := captureStdout(func() error {
+ _, err := cmd.ExecuteC()
+ return err
+ })
s.Assert(err, qt.IsNil)
+ s.out = out
return s
}
@@ -149,3 +182,9 @@ func (s *testHugoCmdBuilder) AssertFileContent(filename string, matches ...strin
}
}
}
+
+func (s *testHugoCmdBuilder) AssertStdout(match string) {
+ s.Helper()
+ content := strings.TrimSpace(s.out)
+ s.Assert(content, qt.Contains, strings.TrimSpace(match))
+}
diff --git a/commands/import_jekyll.go b/commands/import_jekyll.go
index 4f17b2e39..232df519c 100644
--- a/commands/import_jekyll.go
+++ b/commands/import_jekyll.go
@@ -28,6 +28,7 @@ import (
"github.com/gohugoio/hugo/parser/pageparser"
+ "github.com/gohugoio/hugo/common/htime"
"github.com/gohugoio/hugo/common/hugio"
"github.com/gohugoio/hugo/parser/metadecoders"
@@ -362,12 +363,12 @@ func parseJekyllFilename(filename string) (time.Time, string, error) {
re := regexp.MustCompile(`(\d+-\d+-\d+)-(.+)\..*`)
r := re.FindAllStringSubmatch(filename, -1)
if len(r) == 0 {
- return time.Now(), "", errors.New("filename not match")
+ return htime.Now(), "", errors.New("filename not match")
}
postDate, err := time.Parse("2006-1-2", r[0][1])
if err != nil {
- return time.Now(), "", err
+ return htime.Now(), "", err
}
postName := r[0][2]
diff --git a/commands/list.go b/commands/list.go
index f4321d031..4b62c91c5 100644
--- a/commands/list.go
+++ b/commands/list.go
@@ -99,6 +99,10 @@ List requires a subcommand, e.g. ` + "`hugo list drafts`.",
return newSystemError("Error building sites", err)
}
+ if err != nil {
+ return newSystemError("Error building sites", err)
+ }
+
writer := csv.NewWriter(os.Stdout)
defer writer.Flush()
@@ -127,6 +131,10 @@ List requires a subcommand, e.g. ` + "`hugo list drafts`.",
return newSystemError("Error building sites", err)
}
+ if err != nil {
+ return newSystemError("Error building sites", err)
+ }
+
writer := csv.NewWriter(os.Stdout)
defer writer.Flush()
diff --git a/commands/list_test.go b/commands/list_test.go
index 56a3ee9b9..8b2535571 100644
--- a/commands/list_test.go
+++ b/commands/list_test.go
@@ -34,9 +34,9 @@ func TestListAll(t *testing.T) {
hugoCmd := newCommandsBuilder().addAll().build()
cmd := hugoCmd.getCommand()
- defer func() {
+ t.Cleanup(func() {
os.RemoveAll(dir)
- }()
+ })
cmd.SetArgs([]string{"-s=" + dir, "list", "all"})
diff --git a/commands/new_theme.go b/commands/new_theme.go
index 9b1a4786c..4e2357b55 100644
--- a/commands/new_theme.go
+++ b/commands/new_theme.go
@@ -18,8 +18,8 @@ import (
"errors"
"path/filepath"
"strings"
- "time"
+ "github.com/gohugoio/hugo/common/htime"
"github.com/gohugoio/hugo/helpers"
"github.com/gohugoio/hugo/hugofs"
"github.com/spf13/cobra"
@@ -113,7 +113,7 @@ func (n *newThemeCmd) newTheme(cmd *cobra.Command, args []string) error {
by := []byte(`The MIT License (MIT)
-Copyright (c) ` + time.Now().Format("2006") + ` YOUR_NAME_HERE
+Copyright (c) ` + htime.Now().Format("2006") + ` YOUR_NAME_HERE
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
diff --git a/commands/server.go b/commands/server.go
index 985775336..73e5cf073 100644
--- a/commands/server.go
+++ b/commands/server.go
@@ -33,6 +33,7 @@ import (
"syscall"
"time"
+ "github.com/gohugoio/hugo/common/htime"
"github.com/gohugoio/hugo/common/paths"
"golang.org/x/sync/errgroup"
@@ -255,7 +256,7 @@ func (sc *serverCmd) server(cmd *cobra.Command, args []string) error {
}
err = func() error {
- defer c.timeTrack(time.Now(), "Built")
+ defer c.timeTrack(htime.Now(), "Built")
err := c.serverBuild()
if err != nil {
cmd.PrintErrln("Error:", err.Error())
@@ -668,13 +669,13 @@ func memStats() error {
go func() {
var stats runtime.MemStats
- start := time.Now().UnixNano()
+ start := htime.Now().UnixNano()
for {
runtime.ReadMemStats(&stats)
if fileMemStats != nil {
fileMemStats.WriteString(fmt.Sprintf("%d\t%d\t%d\t%d\t%d\n",
- (time.Now().UnixNano()-start)/1000000, stats.HeapSys, stats.HeapAlloc, stats.HeapIdle, stats.HeapReleased))
+ (htime.Now().UnixNano()-start)/1000000, stats.HeapSys, stats.HeapAlloc, stats.HeapIdle, stats.HeapReleased))
time.Sleep(interval)
} else {
break