Also include the time to collect modules etc. in the "Total in ..." time reported for the `hugo` command.
Fixes #6519
rebuildDebouncer = debounce.New(4 * time.Second)
}
+ out := ioutil.Discard
+ if !h.quiet {
+ out = os.Stdout
+ }
+
c := &commandeer{
h: h,
ftch: f,
debounce: rebuildDebouncer,
fullRebuildSem: semaphore.NewWeighted(1),
// This will be replaced later, but we need something to log to before the configuration is read.
- logger: loggers.NewLogger(jww.LevelError, jww.LevelError, os.Stdout, ioutil.Discard, running),
+ logger: loggers.NewLogger(jww.LevelError, jww.LevelError, out, ioutil.Discard, running),
}
return c, c.loadConfig(mustHaveConfigFile, running)
config, configFiles, err := hugolib.LoadConfig(
hugolib.ConfigSourceDescriptor{
Fs: sourceFs,
+ Logger: c.logger,
Path: configPath,
WorkingDir: dir,
Filename: c.h.cfgFile,
package commands
import (
+ "fmt"
"os"
+ "time"
"github.com/gohugoio/hugo/hugolib/paths"
Complete documentation is available at http://gohugo.io/.`,
RunE: func(cmd *cobra.Command, args []string) error {
+ defer cc.timeTrack(time.Now(), "Total")
cfgInit := func(c *commandeer) error {
if cc.buildWatch {
c.Set("disableLiveReload", true)
logFile string
}
+func (cc *hugoBuilderCommon) timeTrack(start time.Time, name string) {
+ if cc.quiet {
+ return
+ }
+ elapsed := time.Since(start)
+ fmt.Printf("%s in %v ms\n", name, int(1000*elapsed.Seconds()))
+}
+
func (cc *hugoBuilderCommon) getConfigDir(baseDir string) string {
if cc.cfgDir != "" {
return paths.AbsPathify(baseDir, cc.cfgDir)
logHandle = ioutil.Discard
logThreshold = jww.LevelWarn
logFile = cfg.GetString("logFile")
- outHandle = os.Stdout
+ outHandle = ioutil.Discard
stdoutThreshold = jww.LevelWarn
)
+ if !c.h.quiet {
+ outHandle = os.Stdout
+ }
+
if c.h.verboseLog || c.h.logging || (c.h.logFile != "") {
var err error
if logFile != "" {
}
func (c *commandeer) build() error {
- defer c.timeTrack(time.Now(), "Total")
-
stopProfiling, err := c.initProfiling()
if err != nil {
return err
}
func (c *commandeer) serverBuild() error {
- defer c.timeTrack(time.Now(), "Total")
+ defer c.timeTrack(time.Now(), "Built")
stopProfiling, err := c.initProfiling()
if err != nil {
}
func (c *commandeer) timeTrack(start time.Time, name string) {
- if c.h.quiet {
- return
- }
elapsed := time.Since(start)
c.logger.FEEDBACK.Printf("%s in %v ms", name, int(1000*elapsed.Seconds()))
}
time.Sleep(2 * time.Second)
}()
- defer c.timeTrack(time.Now(), "Total")
+ defer c.timeTrack(time.Now(), "Rebuilt")
c.commandeerHugoState = newCommandeerHugoState()
err := c.loadConfig(true, true)
"os"
"regexp"
"runtime"
+ "time"
"github.com/gohugoio/hugo/common/terminal"
// Logger wraps a *loggers.Logger and some other related logging state.
type Logger struct {
*jww.Notepad
+
+ // The writer that represents stdout.
+ // Will be ioutil.Discard when in quiet mode.
+ Out io.Writer
+
ErrorCounter *jww.Counter
WarnCounter *jww.Counter
errors *bytes.Buffer
}
+// PrintTimerIfDelayed prints a time statement to the FEEDBACK logger
+// if considerable time is spent.
+func (l *Logger) PrintTimerIfDelayed(start time.Time, name string) {
+ elapsed := time.Since(start)
+ milli := int(1000 * elapsed.Seconds())
+ if milli < 500 {
+ return
+ }
+ l.FEEDBACK.Printf("%s in %v ms", name, milli)
+}
+
+func (l *Logger) PrintTimer(start time.Time, name string) {
+ elapsed := time.Since(start)
+ milli := int(1000 * elapsed.Seconds())
+ l.FEEDBACK.Printf("%s in %v ms", name, milli)
+}
+
func (l *Logger) Errors() string {
if l.errors == nil {
return ""
return &Logger{
Notepad: jww.NewNotepad(stdoutThreshold, logThreshold, outHandle, logHandle, "", log.Ldate|log.Ltime, listeners...),
+ Out: outHandle,
ErrorCounter: errorCounter,
WarnCounter: warnCounter,
errors: errorBuff,
// Get runs "go get" with the supplied arguments.
func (c *Client) Get(args ...string) error {
- if err := c.runGo(context.Background(), os.Stdout, append([]string{"get"}, args...)...); err != nil {
+ if err := c.runGo(context.Background(), c.logger.Out, append([]string{"get"}, args...)...); err != nil {
errors.Wrapf(err, "failed to get %q", args)
}
return nil
// If path is empty, Go will try to guess.
// If this succeeds, this project will be marked as Go Module.
func (c *Client) Init(path string) error {
- err := c.runGo(context.Background(), os.Stdout, "mod", "init", path)
+ err := c.runGo(context.Background(), c.logger.Out, "mod", "init", path)
if err != nil {
return errors.Wrap(err, "failed to init modules")
}
return nil
}
+ //defer c.logger.PrintTimer(time.Now(), fmt.Sprint(args))
+
stderr := new(bytes.Buffer)
cmd := exec.CommandContext(ctx, "go", args...)
"os"
"path/filepath"
"strings"
+ "time"
"github.com/gohugoio/hugo/common/loggers"
}
func (c *collector) collect() {
-
+ defer c.logger.PrintTimerIfDelayed(time.Now(), "hugo: collected modules")
if err := c.initModules(); err != nil {
c.err = err
return