diff --git a/commands/commands.go b/commands/commands.go index b6e8dd469d1..7a9f9fc9ebb 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -299,7 +299,7 @@ func (cc *hugoBuilderCommon) handleFlags(cmd *cobra.Command) { cmd.Flags().Bool("enableGitInfo", false, "add Git revision, date and author info to the pages") cmd.Flags().BoolVar(&cc.gc, "gc", false, "enable to run some cleanup tasks (remove unused cache files) after the build") cmd.Flags().StringVar(&cc.poll, "poll", "", "set this to a poll interval, e.g --poll 700ms, to use a poll based approach to watch for file system changes") - + cmd.Flags().BoolVar(&loggers.PanicOnWarning, "panicOnWarning", false, "panic on first WARNING log") cmd.Flags().Bool("templateMetrics", false, "display metrics about template executions") cmd.Flags().Bool("templateMetricsHints", false, "calculate some improvement hints when combined with --templateMetrics") cmd.Flags().BoolP("forceSyncStatic", "", false, "copy all files when static is changed.") diff --git a/commands/helpers.go b/commands/helpers.go index 1386e425fe6..8bd7b18a3c1 100644 --- a/commands/helpers.go +++ b/commands/helpers.go @@ -68,7 +68,7 @@ func newSystemErrorF(format string, a ...interface{}) commandError { // Catch some of the obvious user errors from Cobra. // We don't want to show the usage message for every error. // The below may be to generic. Time will show. -var userErrorRegexp = regexp.MustCompile("argument|flag|shorthand") +var userErrorRegexp = regexp.MustCompile("unknown flag") func isUserError(err error) bool { if cErr, ok := err.(commandError); ok && cErr.isUserError() { diff --git a/common/loggers/loggers.go b/common/loggers/loggers.go index 4ed1880164e..3beb2595692 100644 --- a/common/loggers/loggers.go +++ b/common/loggers/loggers.go @@ -29,8 +29,11 @@ import ( jww "github.com/spf13/jwalterweatherman" ) -// Counts ERROR logs to the global jww logger. -var GlobalErrorCounter *jww.Counter +var ( + // Counts ERROR logs to the global jww logger. + GlobalErrorCounter *jww.Counter + PanicOnWarning bool +) func init() { GlobalErrorCounter = &jww.Counter{} @@ -130,12 +133,20 @@ func (l *logger) Info() *log.Logger { return l.INFO } +const panicOnWarningMessage = "Warning trapped. Remvove the --panicOnWarning flag to continue." + func (l *logger) Warnf(format string, v ...interface{}) { l.WARN.Printf(format, v...) + if PanicOnWarning { + panic(panicOnWarningMessage) + } } func (l *logger) Warnln(v ...interface{}) { l.WARN.Println(v...) + if PanicOnWarning { + panic(panicOnWarningMessage) + } } func (l *logger) Warn() *log.Logger { diff --git a/helpers/general.go b/helpers/general.go index 74053123fa3..73b7aff6604 100644 --- a/helpers/general.go +++ b/helpers/general.go @@ -331,12 +331,14 @@ func (l *DistinctLogger) Warnf(format string, v ...interface{}) { l.Logger.Warnf(format, v...) }) } + func (l *DistinctLogger) Warnln(v ...interface{}) { logStatement := fmt.Sprint(v...) l.printIfNotPrinted("warnln", logStatement, func() { l.Logger.Warnln(v...) }) } + func (l *DistinctLogger) Errorf(format string, v ...interface{}) { logStatement := fmt.Sprint(v...) l.printIfNotPrinted("errorf", logStatement, func() { @@ -396,7 +398,6 @@ var ( func InitLoggers() { DistinctErrorLog.Reset() DistinctWarnLog.Reset() - } // Deprecated informs about a deprecation, but only once for a given set of arguments' values. @@ -408,7 +409,11 @@ func Deprecated(item, alternative string, err bool) { if err { DistinctErrorLog.Errorf("%s is deprecated and will be removed in Hugo %s. %s", item, hugo.CurrentVersion.Next().ReleaseVersion(), alternative) } else { - DistinctWarnLog.Warnf("%s is deprecated and will be removed in a future release. %s", item, alternative) + var warnPanicMessage string + if !loggers.PanicOnWarning { + warnPanicMessage = "\n\nRe-run Hugo with the flag --panicOnWarning to get a better error message." + } + DistinctWarnLog.Warnf("%s is deprecated and will be removed in a future release. %s%s", item, alternative, warnPanicMessage) } }