Add some color to the relevant filenames in terminal log
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 24 Oct 2018 09:14:51 +0000 (11:14 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 24 Oct 2018 11:02:18 +0000 (13:02 +0200)
Fixes #5344

common/herrors/error_locator.go
common/loggers/loggers.go
common/terminal/colors.go [new file with mode: 0644]
go.mod

index 3f1aae689740b2d965501adeb419eb2b346ff820..cb59b65a3b83b32e003e0d9b6b33b2f88201f8fa 100644 (file)
@@ -18,8 +18,10 @@ import (
        "fmt"
        "io"
        "io/ioutil"
+       "os"
        "strings"
 
+       "github.com/gohugoio/hugo/common/terminal"
        "github.com/gohugoio/hugo/helpers"
 
        "github.com/spf13/afero"
@@ -27,6 +29,12 @@ import (
 
 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 {
        FileError  FileError
index a26cbd8ca9c9e315a66c74e9dfd09c797c559713..0bc76a0f32c6113665d5157570f2e06b4155430f 100644 (file)
@@ -19,6 +19,9 @@ import (
        "io/ioutil"
        "log"
        "os"
+       "regexp"
+
+       "github.com/gohugoio/hugo/common/terminal"
 
        jww "github.com/spf13/jwalterweatherman"
 )
@@ -70,8 +73,22 @@ func NewErrorLogger() *Logger {
        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 {
diff --git a/common/terminal/colors.go b/common/terminal/colors.go
new file mode 100644 (file)
index 0000000..691173e
--- /dev/null
@@ -0,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)
+}
diff --git a/go.mod b/go.mod
index 8060a887633a9c8cba78f19d5b20f7d637200e57..456ad2540ae2859806bc2a7c644ce674176b326e 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -29,7 +29,7 @@ require (
        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