diff options
author | satotake <doublequotation@gmail.com> | 2022-04-27 02:57:04 +0900 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-05-08 16:56:26 +0200 |
commit | e77ca3c105bd64c5077d823d2127f6f812a4f681 (patch) | |
tree | ebbe9c310bfab1e34f9fd2e36b738fd2a37d6f11 /commands | |
parent | f2946da9e806c2bafbdd26707fe339db79bd980b (diff) |
Add `clock` cli flag
Close #8787
Diffstat (limited to 'commands')
-rw-r--r-- | commands/commandeer.go | 23 | ||||
-rw-r--r-- | commands/commands.go | 7 | ||||
-rw-r--r-- | commands/hugo.go | 10 | ||||
-rw-r--r-- | commands/hugo_test.go | 45 | ||||
-rw-r--r-- | commands/import_jekyll.go | 5 | ||||
-rw-r--r-- | commands/list.go | 8 | ||||
-rw-r--r-- | commands/list_test.go | 4 | ||||
-rw-r--r-- | commands/new_theme.go | 4 | ||||
-rw-r--r-- | commands/server.go | 7 |
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 |