summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml4
-rw-r--r--commands/commandeer.go6
-rw-r--r--commands/commands.go10
-rw-r--r--commands/convert.go10
-rw-r--r--commands/hugo.go50
-rw-r--r--commands/server.go6
-rw-r--r--commands/static_syncer.go6
-rw-r--r--common/constants/constants.go4
-rw-r--r--common/loggers/ignorableLogger.go20
-rw-r--r--common/loggers/loggers.go139
-rw-r--r--common/loggers/loggers_test.go8
-rw-r--r--deps/deps.go14
-rw-r--r--helpers/content.go2
-rw-r--r--helpers/pathspec.go4
-rw-r--r--hugofs/nosymlink_fs.go4
-rw-r--r--hugofs/nosymlink_test.go4
-rw-r--r--hugofs/walk.go10
-rw-r--r--hugolib/alias.go10
-rw-r--r--hugolib/config.go2
-rw-r--r--hugolib/content_map_page.go2
-rw-r--r--hugolib/filesystems/basefs.go6
-rw-r--r--hugolib/hugo_modules_test.go2
-rw-r--r--hugolib/hugo_sites.go16
-rw-r--r--hugolib/hugo_sites_build.go7
-rw-r--r--hugolib/page.go4
-rw-r--r--hugolib/page__menus.go2
-rw-r--r--hugolib/page__meta.go8
-rw-r--r--hugolib/page__per_output.go4
-rw-r--r--hugolib/pages_capture.go6
-rw-r--r--hugolib/shortcode.go4
-rw-r--r--hugolib/site.go26
-rw-r--r--hugolib/site_render.go8
-rw-r--r--hugolib/testhelpers_test.go4
-rw-r--r--langs/i18n/i18n.go10
-rw-r--r--markup/asciidocext/convert.go18
-rw-r--r--markup/converter/converter.go2
-rw-r--r--markup/internal/external.go4
-rw-r--r--markup/org/convert.go6
-rw-r--r--markup/pandoc/convert.go2
-rw-r--r--markup/rst/convert.go4
-rw-r--r--modules/client.go12
-rw-r--r--modules/collect.go10
-rw-r--r--resources/page/pagemeta/page_frontmatter.go6
-rw-r--r--resources/resource_spec.go4
-rw-r--r--resources/resource_transformers/babel/babel.go4
-rw-r--r--resources/resource_transformers/postcss/postcss.go10
-rw-r--r--resources/transform.go4
-rw-r--r--tpl/data/data.go7
-rw-r--r--tpl/data/data_test.go8
-rw-r--r--tpl/data/resources.go6
-rw-r--r--tpl/data/resources_test.go6
-rw-r--r--tpl/fmt/fmt.go4
52 files changed, 318 insertions, 221 deletions
diff --git a/.travis.yml b/.travis.yml
index 5b8a1fb2d..9ff6029b1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -72,6 +72,6 @@ script:
HUGO_TIMEOUT=30000 mage -v check;
fi
- mage -v hugo
- - ./hugo -s docs/
- - ./hugo --renderToMemory -s docs/
+ - HUGO_IGNOREERRORS=error-remote-getjson ./hugo -s docs/
+ - HUGO_IGNOREERRORS=error-remote-getjson ./hugo --renderToMemory -s docs/
- df -h
diff --git a/commands/commandeer.go b/commands/commandeer.go
index 52a47484f..e0eae4a66 100644
--- a/commands/commandeer.go
+++ b/commands/commandeer.go
@@ -60,7 +60,7 @@ type commandeerHugoState struct {
type commandeer struct {
*commandeerHugoState
- logger *loggers.Logger
+ logger loggers.Logger
serverConfig *config.Server
// Currently only set when in "fast render mode". But it seems to
@@ -112,7 +112,7 @@ func (c *commandeerHugoState) hugo() *hugolib.HugoSites {
}
func (c *commandeer) errCount() int {
- return int(c.logger.ErrorCounter.Count())
+ return int(c.logger.LogCounters().ErrorCounter.Count())
}
func (c *commandeer) getErrorWithContext() interface{} {
@@ -415,7 +415,7 @@ func (c *commandeer) loadConfig(mustHaveConfigFile, running bool) error {
}
config.Set("cacheDir", cacheDir)
- cfg.Logger.INFO.Println("Using config file:", config.ConfigFileUsed())
+ cfg.Logger.Infoln("Using config file:", config.ConfigFileUsed())
return nil
diff --git a/commands/commands.go b/commands/commands.go
index ddacc7cf3..ce5f0ff7d 100644
--- a/commands/commands.go
+++ b/commands/commands.go
@@ -322,16 +322,12 @@ func (cc *hugoBuilderCommon) handleFlags(cmd *cobra.Command) {
_ = cmd.Flags().SetAnnotation("theme", cobra.BashCompSubdirsInDir, []string{"themes"})
}
-func checkErr(logger *loggers.Logger, err error, s ...string) {
+func checkErr(logger loggers.Logger, err error, s ...string) {
if err == nil {
return
}
- if len(s) == 0 {
- logger.CRITICAL.Println(err)
- return
- }
for _, message := range s {
- logger.ERROR.Println(message)
+ logger.Errorln(message)
}
- logger.ERROR.Println(err)
+ logger.Errorln(err)
}
diff --git a/commands/convert.go b/commands/convert.go
index fe64405e9..d8976f7ea 100644
--- a/commands/convert.go
+++ b/commands/convert.go
@@ -123,7 +123,7 @@ func (cc *convertCmd) convertContents(format metadecoders.Format) error {
site := h.Sites[0]
- site.Log.FEEDBACK.Println("processing", len(site.AllPages()), "content files")
+ site.Log.Println("processing", len(site.AllPages()), "content files")
for _, p := range site.AllPages() {
if err := cc.convertAndSavePage(p, site, format); err != nil {
return err
@@ -147,19 +147,19 @@ func (cc *convertCmd) convertAndSavePage(p page.Page, site *hugolib.Site, target
errMsg := fmt.Errorf("Error processing file %q", p.Path())
- site.Log.INFO.Println("Attempting to convert", p.File().Filename())
+ site.Log.Infoln("Attempting to convert", p.File().Filename())
f := p.File()
file, err := f.FileInfo().Meta().Open()
if err != nil {
- site.Log.ERROR.Println(errMsg)
+ site.Log.Errorln(errMsg)
file.Close()
return nil
}
pf, err := pageparser.ParseFrontMatterAndContent(file)
if err != nil {
- site.Log.ERROR.Println(errMsg)
+ site.Log.Errorln(errMsg)
file.Close()
return err
}
@@ -179,7 +179,7 @@ func (cc *convertCmd) convertAndSavePage(p page.Page, site *hugolib.Site, target
var newContent bytes.Buffer
err = parser.InterfaceToFrontMatter(pf.FrontMatter, targetFormat, &newContent)
if err != nil {
- site.Log.ERROR.Println(errMsg)
+ site.Log.Errorln(errMsg)
return err
}
diff --git a/commands/hugo.go b/commands/hugo.go
index 7eaaedbc9..058f1ec7c 100644
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -130,7 +130,7 @@ func initializeConfig(mustHaveConfigFile, running bool,
}
-func (c *commandeer) createLogger(cfg config.Provider, running bool) (*loggers.Logger, error) {
+func (c *commandeer) createLogger(cfg config.Provider, running bool) (loggers.Logger, error) {
var (
logHandle = ioutil.Discard
logThreshold = jww.LevelWarn
@@ -374,12 +374,12 @@ func (c *commandeer) initMemProfile() {
f, err := os.Create(c.h.memprofile)
if err != nil {
- c.logger.ERROR.Println("could not create memory profile: ", err)
+ c.logger.Errorf("could not create memory profile: ", err)
}
defer f.Close()
runtime.GC() // get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
- c.logger.ERROR.Println("could not write memory profile: ", err)
+ c.logger.Errorf("could not write memory profile: ", err)
}
}
@@ -518,7 +518,7 @@ func (c *commandeer) build() error {
if createCounter, ok := c.destinationFs.(hugofs.DuplicatesReporter); ok {
dupes := createCounter.ReportDuplicates()
if dupes != "" {
- c.logger.WARN.Println("Duplicate target paths:", dupes)
+ c.logger.Warnln("Duplicate target paths:", dupes)
}
}
}
@@ -532,8 +532,8 @@ func (c *commandeer) build() error {
baseWatchDir := c.Cfg.GetString("workingDir")
rootWatchDirs := getRootWatchDirsStr(baseWatchDir, watchDirs)
- c.logger.FEEDBACK.Printf("Watching for changes in %s%s{%s}\n", baseWatchDir, helpers.FilePathSeparator, rootWatchDirs)
- c.logger.FEEDBACK.Println("Press Ctrl+C to stop")
+ c.logger.Printf("Watching for changes in %s%s{%s}\n", baseWatchDir, helpers.FilePathSeparator, rootWatchDirs)
+ c.logger.Println("Press Ctrl+C to stop")
watcher, err := c.newWatcher(watchDirs...)
checkErr(c.Logger, err)
defer watcher.Close()
@@ -590,7 +590,7 @@ func (c *commandeer) doWithPublishDirs(f func(sourceFs *filesystems.SourceFilesy
staticFilesystems := c.hugo().BaseFs.SourceFilesystems.Static
if len(staticFilesystems) == 0 {
- c.logger.INFO.Println("No static directories found to sync")
+ c.logger.Infoln("No static directories found to sync")
return langCount, nil
}
@@ -662,13 +662,13 @@ func (c *commandeer) copyStaticTo(sourceFs *filesystems.SourceFilesystem) (uint6
syncer.Delete = c.Cfg.GetBool("cleanDestinationDir")
if syncer.Delete {
- c.logger.INFO.Println("removing all files from destination that don't exist in static dirs")
+ c.logger.Infoln("removing all files from destination that don't exist in static dirs")
syncer.DeleteFilter = func(f os.FileInfo) bool {
return f.IsDir() && strings.HasPrefix(f.Name(), ".")
}
}
- c.logger.INFO.Println("syncing static files to", publishDir)
+ c.logger.Infoln("syncing static files to", publishDir)
// because we are using a baseFs (to get the union right).
// set sync src to root
@@ -689,7 +689,7 @@ func (c *commandeer) firstPathSpec() *helpers.PathSpec {
func (c *commandeer) timeTrack(start time.Time, name string) {
elapsed := time.Since(start)
- c.logger.FEEDBACK.Printf("%s in %v ms", name, int(1000*elapsed.Seconds()))
+ c.logger.Printf("%s in %v ms", name, int(1000*elapsed.Seconds()))
}
// getDirList provides NewWatcher() with a list of directories to watch for changes.
@@ -698,7 +698,7 @@ func (c *commandeer) getDirList() ([]string, error) {
walkFn := func(path string, fi hugofs.FileMetaInfo, err error) error {
if err != nil {
- c.logger.ERROR.Println("walker: ", err)
+ c.logger.Errorln("walker: ", err)
return nil
}
@@ -724,7 +724,7 @@ func (c *commandeer) getDirList() ([]string, error) {
w := hugofs.NewWalkway(hugofs.WalkwayConfig{Logger: c.logger, Info: fi, WalkFn: walkFn})
if err := w.Walk(); err != nil {
- c.logger.ERROR.Println("walker: ", err)
+ c.logger.Errorln("walker: ", err)
}
}
@@ -740,8 +740,8 @@ func (c *commandeer) buildSites() (err error) {
func (c *commandeer) handleBuildErr(err error, msg string) {
c.buildErr = err
- c.logger.ERROR.Print(msg + ":\n\n")
- c.logger.ERROR.Println(helpers.FirstUpper(err.Error()))
+ c.logger.Errorln(msg + ":\n")
+ c.logger.Errorln(helpers.FirstUpper(err.Error()))
if !c.h.quiet && c.h.verbose {
herrors.PrintStackTraceFromErr(err)
}
@@ -822,13 +822,13 @@ func (c *commandeer) fullRebuild(changeType string) {
if !c.paused {
_, err := c.copyStatic()
if err != nil {
- c.logger.ERROR.Println(err)
+ c.logger.Errorln(err)
return
}
err = c.buildSites()
if err != nil {
- c.logger.ERROR.Println(err)
+ c.logger.Errorln(err)
} else if !c.h.buildWatch && !c.Cfg.GetBool("disableLiveReload") {
livereload.ForceRefresh()
}
@@ -862,7 +862,7 @@ func (c *commandeer) newWatcher(dirList ...string) (*watcher.Batcher, error) {
// Identifies changes to config (config.toml) files.
configSet := make(map[string]bool)
- c.logger.FEEDBACK.Println("Watching for config changes in", strings.Join(c.configFiles, ", "))
+ c.logger.Println("Watching for config changes in", strings.Join(c.configFiles, ", "))
for _, configFile := range c.configFiles {
watcher.Add(configFile)
configSet[configFile] = true
@@ -879,7 +879,7 @@ func (c *commandeer) newWatcher(dirList ...string) (*watcher.Batcher, error) {
}
case err := <-watcher.Errors:
if err != nil {
- c.logger.ERROR.Println("Error while watching:", err)
+ c.logger.Errorln("Error while watching:", err)
}
}
}
@@ -895,9 +895,9 @@ func (c *commandeer) printChangeDetected(typ string) {
}
msg += " detected, rebuilding site."
- c.logger.FEEDBACK.Println(msg)
+ c.logger.Println(msg)
const layout = "2006-01-02 15:04:05.000 -0700"
- c.logger.FEEDBACK.Println(time.Now().Format(layout))
+ c.logger.Println(time.Now().Format(layout))
}
const (
@@ -979,7 +979,7 @@ func (c *commandeer) handleEvents(watcher *watcher.Batcher,
return
}
- c.logger.INFO.Println("Received System Events:", evs)
+ c.logger.Infoln("Received System Events:", evs)
staticEvents := []fsnotify.Event{}
dynamicEvents := []fsnotify.Event{}
@@ -1059,7 +1059,7 @@ func (c *commandeer) handleEvents(watcher *watcher.Batcher,
walkAdder := func(path string, f hugofs.FileMetaInfo, err error) error {
if f.IsDir() {
- c.logger.FEEDBACK.Println("adding created directory to watchlist", path)
+ c.logger.Println("adding created directory to watchlist", path)
if err := watcher.Add(path); err != nil {
return err
}
@@ -1091,15 +1091,15 @@ func (c *commandeer) handleEvents(watcher *watcher.Batcher,
c.printChangeDetected("Static files")
if c.Cfg.GetBool("forceSyncStatic") {
- c.logger.FEEDBACK.Printf("Syncing all static files\n")
+ c.logger.Printf("Syncing all static files\n")
_, err := c.copyStatic()
if err != nil {
- c.logger.ERROR.Println("Error copying static files to publish dir:", err)
+ c.logger.Errorln("Error copying static files to publish dir:", err)
return
}
} else {
if err := staticSyncer.syncsStaticEvents(staticEvents); err != nil {
- c.logger.ERROR.Println("Error syncing static files to publish dir:", err)
+ c.logger.Errorln("Error syncing static files to publish dir:", err)
return
}
}
diff --git a/commands/server.go b/commands/server.go
index 7d604b97d..b6a8d282c 100644
--- a/commands/server.go
+++ b/commands/server.go
@@ -185,7 +185,7 @@ func (sc *serverCmd) server(cmd *cobra.Command, args []string) error {
// port set explicitly by user -- he/she probably meant it!
err = newSystemErrorF("Server startup failed: %s", err)
}
- c.logger.FEEDBACK.Println("port", sc.serverPort, "already in use, attempting to use an available port")
+ c.logger.Println("port", sc.serverPort, "already in use, attempting to use an available port")
sp, err := helpers.FindAvailablePort()
if err != nil {
err = newSystemError("Unable to find alternative port to use:", err)
@@ -350,7 +350,7 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, erro
w.WriteHeader(500)
r, err := f.errorTemplate(err)
if err != nil {
- f.c.logger.ERROR.Println(err)
+ f.c.logger.Errorln(err)
}
port = 1313
@@ -508,7 +508,7 @@ func (c *commandeer) serve(s *serverCmd) error {
go func() {
err = http.ListenAndServe(endpoint, mu)
if err != nil {
- c.logger.ERROR.Printf("Error: %s\n", err.Error())
+ c.logger.Errorf("Error: %s\n", err.Error())
os.Exit(1)
}
}()
diff --git a/commands/static_syncer.go b/commands/static_syncer.go
index 62ef28b2c..17fae7d13 100644
--- a/commands/static_syncer.go
+++ b/commands/static_syncer.go
@@ -107,10 +107,10 @@ func (s *staticSyncer) syncsStaticEvents(staticEvents []fsnotify.Event) error {
logger.Println("Syncing", relPath, "to", publishDir)
if err := syncer.Sync(filepath.Join(publishDir, relPath), relPath); err != nil {
- c.logger.ERROR.Println(err)
+ c.logger.Errorln(err)
}
} else {
- c.logger.ERROR.Println(err)
+ c.logger.Errorln(err)
}
continue
@@ -119,7 +119,7 @@ func (s *staticSyncer) syncsStaticEvents(staticEvents []fsnotify.Event) error {
// For all other event operations Hugo will sync static.
logger.Println("Syncing", relPath, "to", publishDir)
if err := syncer.Sync(filepath.Join(publishDir, relPath), relPath); err != nil {
- c.logger.ERROR.Println(err)
+ c.logger.Errorln(err)
}
}
diff --git a/common/constants/constants.go b/common/constants/constants.go
index 25bd7c758..e416d4ad3 100644
--- a/common/constants/constants.go
+++ b/common/constants/constants.go
@@ -18,4 +18,8 @@ package constants
const (
ErrIDAmbigousDisableKindTaxonomy = "error-disable-taxonomy"
ErrIDAmbigousOutputKindTaxonomy = "error-output-taxonomy"
+
+ // IDs for remote errors in tpl/data.
+ ErrRemoteGetJSON = "error-remote-getjson"
+ ErrRemoteGetCSV = "error-remote-getcsv"
)
diff --git a/common/loggers/ignorableLogger.go b/common/loggers/ignorableLogger.go
index e12e41d68..1bd4d99b8 100644
--- a/common/loggers/ignorableLogger.go
+++ b/common/loggers/ignorableLogger.go
@@ -19,25 +19,31 @@ import (
)
// IgnorableLogger is a logger that ignores certain log statements.
-type IgnorableLogger struct {
- logger *Logger
+type IgnorableLogger interface {
+ Logger
+ Errorsf(statementID, format string, v ...interface{})
+}
+
+type ignorableLogger struct {
+ Logger
statements map[string]bool
}
// NewIgnorableLogger wraps the given logger and ignores the log statement IDs given.
-func NewIgnorableLogger(logger *Logger, statements ...string) IgnorableLogger {
+func NewIgnorableLogger(logger Logger, statements ...string) IgnorableLogger {
statementsSet := make(map[string]bool)
for _, s := range statements {
statementsSet[strings.ToLower(s)] = true
}
- return IgnorableLogger{
- logger: logger,
+ return ignorableLogger{
+ Logger: logger,
statements: statementsSet,
}
}
-func (l IgnorableLogger) Errorf(statementID, format string, v ...interface{}) {
+// Errorsf logs statementID as an ERROR if not configured as ignoreable.
+func (l ignorableLogger) Errorsf(statementID, format string, v ...interface{}) {
if l.statements[statementID] {
// Ignore.
return
@@ -48,5 +54,5 @@ ignoreErrors = [%q]`, statementID)
format += ignoreMsg
- l.logger.ERROR.Printf(format, v...)
+ l.Errorf(format, v...)
}
diff --git a/common/loggers/loggers.go b/common/loggers/loggers.go
index d406e5f20..5c04b9eab 100644
--- a/common/loggers/loggers.go
+++ b/common/loggers/loggers.go
@@ -1,4 +1,4 @@
-// Copyright 2018 The Hugo Authors. All rights reserved.
+// Copyright 2020 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -56,39 +56,122 @@ func (w prefixWriter) Write(p []byte) (n int, err error) {
return len(p), nil
}
-// Logger wraps a *loggers.Logger and some other related logging state.
-type Logger struct {
+type Logger interface {
+ Printf(format string, v ...interface{})
+ Println(v ...interface{})
+ PrintTimerIfDelayed(start time.Time, name string)
+ Debug() *log.Logger
+ Info() *log.Logger
+ Infof(format string, v ...interface{})
+ Infoln(v ...interface{})
+ Warn() *log.Logger
+ Warnf(format string, v ...interface{})
+ Warnln(v ...interface{})
+ Error() *log.Logger
+ Errorf(format string, v ...interface{})
+ Errorln(v ...interface{})
+ Errors() string
+
+ Out() io.Writer
+
+ Reset()
+
+ // Used in tests.
+ LogCounters() *LogCounters
+}
+
+type LogCounters struct {
+ ErrorCounter *jww.Counter
+ WarnCounter *jww.Counter
+}
+
+type logger struct {
*jww.Notepad
// The writer that represents stdout.
// Will be ioutil.Discard when in quiet mode.
- Out io.Writer
+ out io.Writer
- ErrorCounter *jww.Counter
- WarnCounter *jww.Counter
+ logCounters *LogCounters
// This is only set in server mode.
errors *bytes.Buffer
}
+func (l *logger) Printf(format string, v ...interface{}) {
+ l.FEEDBACK.Printf(format, v...)
+}
+
+func (l *logger) Println(v ...interface{}) {
+ l.FEEDBACK.Println(v...)
+}
+
+func (l *logger) Debug() *log.Logger {</