shithub: hugo

Download patch

ref: deff9e154bc0371af56741ddb22cb1f9e392838a
parent: 889aca054a267506a1c7cfaa3992d324764d6358
author: Bjørn Erik Pedersen <[email protected]>
date: Wed Oct 24 07:14:51 EDT 2018

Add some color to the relevant filenames in terminal log

Fixes #5344

--- a/common/herrors/error_locator.go
+++ b/common/herrors/error_locator.go
@@ -18,8 +18,10 @@
 	"fmt"
 	"io"
 	"io/ioutil"
+	"os"
 	"strings"
 
+	"github.com/gohugoio/hugo/common/terminal"
 	"github.com/gohugoio/hugo/helpers"
 
 	"github.com/spf13/afero"
@@ -26,6 +28,12 @@
 )
 
 var fileErrorFormat = "\"%s:%d:%d\": %s"
+
+func init() {
+	if terminal.IsTerminal(os.Stdout) {
+		fileErrorFormat = terminal.Notice("\"%s:%d:%d\"") + ": %s"
+	}
+}
 
 // LineMatcher contains the elements used to match an error to a line
 type LineMatcher struct {
--- a/common/loggers/loggers.go
+++ b/common/loggers/loggers.go
@@ -19,7 +19,10 @@
 	"io/ioutil"
 	"log"
 	"os"
+	"regexp"
 
+	"github.com/gohugoio/hugo/common/terminal"
+
 	jww "github.com/spf13/jwalterweatherman"
 )
 
@@ -70,8 +73,22 @@
 	return newBasicLogger(jww.LevelError)
 }
 
+var ansiColorRe = regexp.MustCompile("(?s)\\033\\[\\d*(;\\d*)*m")
+
+type ansiCleaner struct {
+	w io.Writer
+}
+
+func (a ansiCleaner) Write(p []byte) (n int, err error) {
+	return a.w.Write(ansiColorRe.ReplaceAll(p, []byte("")))
+}
+
 func newLogger(stdoutThreshold, logThreshold jww.Threshold, outHandle, logHandle io.Writer, saveErrors bool) *Logger {
 	errorCounter := &jww.Counter{}
+	if logHandle != ioutil.Discard && terminal.IsTerminal(os.Stdout) {
+		// Remove any Ansi coloring from log output
+		logHandle = ansiCleaner{w: logHandle}
+	}
 	listeners := []jww.LogListener{jww.LogCounter(errorCounter, jww.LevelError)}
 	var errorBuff *bytes.Buffer
 	if saveErrors {
--- /dev/null
+++ b/common/terminal/colors.go
@@ -1,0 +1,53 @@
+// Copyright 2018 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.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Package terminal contains helper for the terminal, such as coloring output.
+package terminal
+
+import (
+	"fmt"
+	"os"
+	"strings"
+
+	isatty "github.com/mattn/go-isatty"
+)
+
+const (
+	noticeColor = "\033[1;36m%s\033[0m"
+)
+
+// IsTerminal return true if the file descriptor is terminal and the TERM
+// environment variable isn't a dumb one.
+func IsTerminal(f *os.File) bool {
+	fd := f.Fd()
+	return os.Getenv("TERM") != "dumb" && (isatty.IsTerminal(fd) || isatty.IsCygwinTerminal(fd))
+}
+
+// Notice colorizes the string in a noticeable color.
+func Notice(s string) string {
+	return colorize(s, noticeColor)
+}
+
+// colorize s in color.
+func colorize(s, color string) string {
+	s = fmt.Sprintf(color, doublePercent(s))
+	return singlePercent(s)
+}
+
+func doublePercent(str string) string {
+	return strings.Replace(str, "%", "%%", -1)
+}
+
+func singlePercent(str string) string {
+	return strings.Replace(str, "%%", "%", -1)
+}
--- a/go.mod
+++ b/go.mod
@@ -29,7 +29,7 @@
 	github.com/kyokomi/emoji v1.5.1
 	github.com/magefile/mage v1.4.0
 	github.com/markbates/inflect v1.0.0
-	github.com/mattn/go-isatty v0.0.4 // indirect
+	github.com/mattn/go-isatty v0.0.4
 	github.com/mattn/go-runewidth v0.0.3 // indirect
 	github.com/miekg/mmark v1.3.6
 	github.com/mitchellh/hashstructure v1.0.0