all: Apply staticcheck recommendations - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit b5f39d23b86f9cb83c51da9fe4abb4c19c01c3b7
 (DIR) parent 3011f36c27ecde309325e6c75ca377f4f87fa97a
 (HTM) Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Sun, 24 Mar 2019 10:11:16 +0100
       
       all: Apply staticcheck recommendations
       
       Diffstat:
         M cache/filecache/filecache.go        |       2 +-
         M common/math/math.go                 |      14 +++++++-------
         M create/content.go                   |       3 +++
         M helpers/content.go                  |       8 +++-----
         M helpers/emoji_test.go               |       2 +-
         M helpers/general.go                  |       6 ++----
         M helpers/path.go                     |      17 ++++++-----------
         M helpers/path_test.go                |      17 ++++++-----------
         M helpers/pygments.go                 |       8 +++-----
         M helpers/url.go                      |       2 +-
         M hugofs/language_composite_fs_test.… |       1 +
         M hugolib/filesystems/basefs.go       |      20 --------------------
         M hugolib/page.go                     |      21 ---------------------
         M hugolib/paths/baseURL.go            |       2 +-
         M hugolib/site.go                     |       3 ---
         M hugolib/site_test.go                |       4 ----
         M hugolib/testhelpers_test.go         |      24 ++++++++++++++++--------
         M minifiers/minifiers.go              |       2 +-
         M parser/frontmatter.go               |       4 ++--
         M parser/pageparser/pagelexer.go      |      15 ---------------
         M releaser/releaser.go                |       2 +-
         M resources/image_test.go             |       8 ++++----
         M source/fileInfo.go                  |      25 -------------------------
         M source/filesystem_test.go           |       8 --------
         D source/filesystem_unix_test.go      |      28 ----------------------------
         D source/filesystem_windows_test.go   |      28 ----------------------------
         M source/sourceSpec.go                |       4 ++++
         M tpl/collections/reflect_helpers.go  |       2 +-
         M tpl/data/data.go                    |      14 +++++++-------
         M tpl/data/resources.go               |      10 +++++-----
         M tpl/data/resources_test.go          |      10 +++++-----
         M tpl/math/math.go                    |       4 ++--
         M tpl/os/os.go                        |       4 ++--
         M tpl/partials/partials.go            |       2 +-
         M tpl/template.go                     |       4 ++--
         M tpl/tplimpl/embedded/generate/gene… |       3 +++
         M tpl/transform/remarshal.go          |       3 +++
         M transform/chain_test.go             |       4 ++--
         M transform/livereloadinject/liverel… |       4 ++--
         M transform/urlreplacers/absurlrepla… |       7 -------
         M transform/urlreplacers/absurlrepla… |       1 -
       
       41 files changed, 98 insertions(+), 252 deletions(-)
       ---
 (DIR) diff --git a/cache/filecache/filecache.go b/cache/filecache/filecache.go
       @@ -274,7 +274,7 @@ func (c *Cache) isExpired(modTime time.Time) bool {
                if c.maxAge < 0 {
                        return false
                }
       -        return c.maxAge == 0 || time.Now().Sub(modTime) > c.maxAge
       +        return c.maxAge == 0 || time.Since(modTime) > c.maxAge
        }
        
        // For testing
 (DIR) diff --git a/common/math/math.go b/common/math/math.go
       @@ -46,7 +46,7 @@ func DoArithmetic(a, b interface{}, op rune) (interface{}, error) {
                                        bu = 0
                                }
                        default:
       -                        return nil, errors.New("Can't apply the operator to the values")
       +                        return nil, errors.New("can't apply the operator to the values")
                        }
                case reflect.Float32, reflect.Float64:
                        af = av.Float()
       @@ -58,7 +58,7 @@ func DoArithmetic(a, b interface{}, op rune) (interface{}, error) {
                        case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
                                bf = float64(bv.Uint()) // may overflow
                        default:
       -                        return nil, errors.New("Can't apply the operator to the values")
       +                        return nil, errors.New("can't apply the operator to the values")
                        }
                case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
                        au = av.Uint()
       @@ -79,7 +79,7 @@ func DoArithmetic(a, b interface{}, op rune) (interface{}, error) {
                        case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
                                bu = bv.Uint()
                        default:
       -                        return nil, errors.New("Can't apply the operator to the values")
       +                        return nil, errors.New("can't apply the operator to the values")
                        }
                case reflect.String:
                        as := av.String()
       @@ -87,9 +87,9 @@ func DoArithmetic(a, b interface{}, op rune) (interface{}, error) {
                                bs := bv.String()
                                return as + bs, nil
                        }
       -                return nil, errors.New("Can't apply the operator to the values")
       +                return nil, errors.New("can't apply the operator to the values")
                default:
       -                return nil, errors.New("Can't apply the operator to the values")
       +                return nil, errors.New("can't apply the operator to the values")
                }
        
                switch op {
       @@ -128,8 +128,8 @@ func DoArithmetic(a, b interface{}, op rune) (interface{}, error) {
                        } else if bu != 0 {
                                return au / bu, nil
                        }
       -                return nil, errors.New("Can't divide the value by 0")
       +                return nil, errors.New("can't divide the value by 0")
                default:
       -                return nil, errors.New("There is no such an operation")
       +                return nil, errors.New("there is no such an operation")
                }
        }
 (DIR) diff --git a/create/content.go b/create/content.go
       @@ -142,6 +142,9 @@ func newContentFromDir(
                        }
        
                        out, err := targetFs.Create(targetFilename)
       +                if err != nil {
       +                        return err
       +                }
        
                        _, err = io.Copy(out, in)
                        if err != nil {
 (DIR) diff --git a/helpers/content.go b/helpers/content.go
       @@ -147,10 +147,8 @@ func newBlackfriday(config map[string]interface{}) *BlackFriday {
                        siteConfig[k] = v
                }
        
       -        if config != nil {
       -                for k, v := range config {
       -                        siteConfig[k] = v
       -                }
       +        for k, v := range config {
       +                siteConfig[k] = v
                }
        
                combinedConfig := &BlackFriday{}
       @@ -755,7 +753,7 @@ func externallyRenderContent(ctx *RenderingContext, path string, args []string) 
                err := cmd.Run()
                // Most external helpers exit w/ non-zero exit code only if severe, i.e.
                // halting errors occurred. -> log stderr output regardless of state of err
       -        for _, item := range strings.Split(string(cmderr.Bytes()), "\n") {
       +        for _, item := range strings.Split(cmderr.String(), "\n") {
                        item := strings.TrimSpace(item)
                        if item != "" {
                                jww.ERROR.Printf("%s: %s", ctx.DocumentName, item)
 (DIR) diff --git a/helpers/emoji_test.go b/helpers/emoji_test.go
       @@ -80,7 +80,7 @@ func BenchmarkEmojiKyokomiFprint(b *testing.B) {
                        defer bufferpool.PutBuffer(buff)
                        emoji.Fprint(buff, string(in))
        
       -                bc := make([]byte, buff.Len(), buff.Len())
       +                bc := make([]byte, buff.Len())
                        copy(bc, buff.Bytes())
                        return bc
                }
 (DIR) diff --git a/helpers/general.go b/helpers/general.go
       @@ -57,7 +57,7 @@ func FindAvailablePort() (*net.TCPAddr, error) {
                        if a, ok := addr.(*net.TCPAddr); ok {
                                return a, nil
                        }
       -                return nil, fmt.Errorf("Unable to obtain a valid tcp port. %v", addr)
       +                return nil, fmt.Errorf("unable to obtain a valid tcp port: %v", addr)
                }
                return nil, err
        }
       @@ -128,7 +128,7 @@ func ReaderToBytes(lines io.Reader) []byte {
        
                b.ReadFrom(lines)
        
       -        bc := make([]byte, b.Len(), b.Len())
       +        bc := make([]byte, b.Len())
                copy(bc, b.Bytes())
                return bc
        }
       @@ -417,10 +417,8 @@ func NormalizeHugoFlags(f *pflag.FlagSet, name string) pflag.NormalizedName {
                switch name {
                case "baseUrl":
                        name = "baseURL"
       -                break
                case "uglyUrls":
                        name = "uglyURLs"
       -                break
                }
                return pflag.NormalizedName(name)
        }
 (DIR) diff --git a/helpers/path.go b/helpers/path.go
       @@ -29,6 +29,7 @@ import (
                "github.com/gohugoio/hugo/common/hugio"
                _errors "github.com/pkg/errors"
                "github.com/spf13/afero"
       +        "golang.org/x/text/runes"
                "golang.org/x/text/transform"
                "golang.org/x/text/unicode/norm"
        )
       @@ -155,7 +156,7 @@ func (p *PathSpec) UnicodeSanitize(s string) string {
        
                if p.RemovePathAccents {
                        // remove accents - see https://blog.golang.org/normalization
       -                t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
       +                t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
                        result, _, _ = transform.String(t, string(target))
                } else {
                        result = string(target)
       @@ -164,10 +165,6 @@ func (p *PathSpec) UnicodeSanitize(s string) string {
                return result
        }
        
       -func isMn(r rune) bool {
       -        return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks
       -}
       -
        // ReplaceExtension takes a path and an extension, strips the old extension
        // and returns the path with the new extension.
        func ReplaceExtension(path string, newExt string) string {
       @@ -208,7 +205,7 @@ func makePathRelative(inPath string, possibleDirectories ...string) (string, err
                                return strings.TrimPrefix(inPath, currentPath), nil
                        }
                }
       -        return inPath, errors.New("Can't extract relative path, unknown prefix")
       +        return inPath, errors.New("can't extract relative path, unknown prefix")
        }
        
        // Should be good enough for Hugo.
       @@ -403,15 +400,13 @@ func ExtractRootPaths(paths []string) []string {
        
        }
        
       -var numInPathRe = regexp.MustCompile("\\.(\\d+)\\.")
       -
        // FindCWD returns the current working directory from where the Hugo
        // executable is run.
        func FindCWD() (string, error) {
                serverFile, err := filepath.Abs(os.Args[0])
        
                if err != nil {
       -                return "", fmt.Errorf("Can't get absolute path for executable: %v", err)
       +                return "", fmt.Errorf("can't get absolute path for executable: %v", err)
                }
        
                path := filepath.Dir(serverFile)
       @@ -437,7 +432,7 @@ func SymbolicWalk(fs afero.Fs, root string, walker filepath.WalkFunc) error {
        
                // Sanity check
                if root != "" && len(root) < 4 {
       -                return errors.New("Path is too short")
       +                return errors.New("path is too short")
                }
        
                // Handle the root first
       @@ -448,7 +443,7 @@ func SymbolicWalk(fs afero.Fs, root string, walker filepath.WalkFunc) error {
                }
        
                if !fileInfo.IsDir() {
       -                return fmt.Errorf("Cannot walk regular file %s", root)
       +                return fmt.Errorf("cannot walk regular file %s", root)
                }
        
                if err := walker(realPath, fileInfo, err); err != nil && err != filepath.SkipDir {
 (DIR) diff --git a/helpers/path_test.go b/helpers/path_test.go
       @@ -171,7 +171,7 @@ func TestGetRealPath(t *testing.T) {
                        t.Skip("Skip TestGetRealPath as os.Symlink needs administrator rights on Windows")
                }
        
       -        d1, err := ioutil.TempDir("", "d1")
       +        d1, _ := ioutil.TempDir("", "d1")
                defer os.Remove(d1)
                fs := afero.NewOsFs()
        
       @@ -418,6 +418,7 @@ func createNonZeroSizedFileInTempDir() (*os.File, error) {
                f, err := createZeroSizedFileInTempDir()
                if err != nil {
                        // no file ??
       +                return nil, err
                }
                byteString := []byte("byteString")
                err = ioutil.WriteFile(f.Name(), byteString, 0644)
       @@ -430,10 +431,7 @@ func createNonZeroSizedFileInTempDir() (*os.File, error) {
        }
        
        func deleteFileInTempDir(f *os.File) {
       -        err := os.Remove(f.Name())
       -        if err != nil {
       -                // now what?
       -        }
       +        _ = os.Remove(f.Name())
        }
        
        func createEmptyTempDir() (string, error) {
       @@ -449,7 +447,7 @@ func createEmptyTempDir() (string, error) {
        func createTempDirWithZeroLengthFiles() (string, error) {
                d, dirErr := createEmptyTempDir()
                if dirErr != nil {
       -                //now what?
       +                return "", dirErr
                }
                filePrefix := "_path_test_"
                _, fileErr := ioutil.TempFile(d, filePrefix) // dir is os.TempDir()
       @@ -467,7 +465,7 @@ func createTempDirWithZeroLengthFiles() (string, error) {
        func createTempDirWithNonZeroLengthFiles() (string, error) {
                d, dirErr := createEmptyTempDir()
                if dirErr != nil {
       -                //now what?
       +                return "", dirErr
                }
                filePrefix := "_path_test_"
                f, fileErr := ioutil.TempFile(d, filePrefix) // dir is os.TempDir()
       @@ -494,10 +492,7 @@ func createTempDirWithNonZeroLengthFiles() (string, error) {
        }
        
        func deleteTempDir(d string) {
       -        err := os.RemoveAll(d)
       -        if err != nil {
       -                // now what?
       -        }
       +        _ = os.RemoveAll(d)
        }
        
        func TestExists(t *testing.T) {
 (DIR) diff --git a/helpers/pygments.go b/helpers/pygments.go
       @@ -153,7 +153,7 @@ func (h highlighters) pygmentsHighlight(code, lang, optsStr string) (string, err
                        return code, err
                }
        
       -        str := string(normalizeExternalHelperLineFeeds([]byte(out.String())))
       +        str := string(normalizeExternalHelperLineFeeds(out.Bytes()))
        
                str = h.injectCodeTag(str, lang)
        
       @@ -235,10 +235,8 @@ func parseOptions(defaults map[string]string, in string) (map[string]string, err
                in = strings.Trim(in, " ")
                opts := make(map[string]string)
        
       -        if defaults != nil {
       -                for k, v := range defaults {
       -                        opts[k] = v
       -                }
       +        for k, v := range defaults {
       +                opts[k] = v
                }
        
                if in == "" {
 (DIR) diff --git a/helpers/url.go b/helpers/url.go
       @@ -142,7 +142,7 @@ func MakePermalink(host, plink string) *url.URL {
                }
        
                if p.Host != "" {
       -                panic(fmt.Errorf("Can't make permalink from absolute link %q", plink))
       +                panic(fmt.Errorf("can't make permalink from absolute link %q", plink))
                }
        
                base.Path = path.Join(base.Path, p.Path)
 (DIR) diff --git a/hugofs/language_composite_fs_test.go b/hugofs/language_composite_fs_test.go
       @@ -70,6 +70,7 @@ func TestCompositeLanguagFsTest(t *testing.T) {
                assert.NoError(err)
                defer f.Close()
                files, err := f.Readdir(-1)
       +        assert.NoError(err)
                assert.Equal(4, len(files))
                expected := map[string]bool{
                        filepath.FromSlash("/content/en/f1.txt"):    true,
 (DIR) diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go
       @@ -17,7 +17,6 @@ package filesystems
        
        import (
                "errors"
       -        "io"
                "os"
                "path/filepath"
                "strings"
       @@ -759,22 +758,3 @@ func removeDuplicatesKeepRight(in []string) []string {
        
                return out
        }
       -
       -func printFs(fs afero.Fs, path string, w io.Writer) {
       -        if fs == nil {
       -                return
       -        }
       -        afero.Walk(fs, path, func(path string, info os.FileInfo, err error) error {
       -                if info != nil && !info.IsDir() {
       -                        s := path
       -                        if lang, ok := info.(hugofs.LanguageAnnouncer); ok {
       -                                s = s + "\tLANG: " + lang.Lang()
       -                        }
       -                        if fp, ok := info.(hugofs.FilePather); ok {
       -                                s = s + "\tRF: " + fp.Filename() + "\tBP: " + fp.BaseDir()
       -                        }
       -                        fmt.Fprintln(w, "    ", s)
       -                }
       -                return nil
       -        })
       -}
 (DIR) diff --git a/hugolib/page.go b/hugolib/page.go
       @@ -20,12 +20,10 @@ import (
                "os"
                "path"
                "path/filepath"
       -        "runtime"
                "sort"
                "strings"
        
                "github.com/bep/gitmap"
       -        "github.com/spf13/cast"
        
                "github.com/gohugoio/hugo/helpers"
        
       @@ -831,19 +829,6 @@ func (ps pageStatePages) findPagePosByFilnamePrefix(prefix string) int {
                return currPos
        }
        
       -func content(c resource.ContentProvider) string {
       -        cc, err := c.Content()
       -        if err != nil {
       -                panic(err)
       -        }
       -
       -        ccs, err := cast.ToStringE(cc)
       -        if err != nil {
       -                panic(err)
       -        }
       -        return ccs
       -}
       -
        func (s *Site) sectionsFromFile(fi source.File) []string {
                dirname := fi.Dir()
                dirname = strings.Trim(dirname, helpers.FilePathSeparator)
       @@ -861,9 +846,3 @@ func (s *Site) sectionsFromFile(fi source.File) []string {
        
                return parts
        }
       -
       -func printStackTrace(length int) string {
       -        trace := make([]byte, length)
       -        runtime.Stack(trace, true)
       -        return string(trace)
       -}
 (DIR) diff --git a/hugolib/paths/baseURL.go b/hugolib/paths/baseURL.go
       @@ -62,7 +62,7 @@ func (b BaseURL) WithProtocol(protocol string) (string, error) {
                if isFullProtocol && u.Opaque != "" {
                        u.Opaque = "//" + u.Opaque
                } else if isOpaqueProtocol && u.Opaque == "" {
       -                return "", fmt.Errorf("Cannot determine BaseURL for protocol %q", protocol)
       +                return "", fmt.Errorf("cannot determine BaseURL for protocol %q", protocol)
                }
        
                return u.String(), nil
 (DIR) diff --git a/hugolib/site.go b/hugolib/site.go
       @@ -67,9 +67,6 @@ import (
                "github.com/spf13/viper"
        )
        
       -// used to indicate if run as a test.
       -var testMode bool
       -
        // Site contains all the information relevant for constructing a static
        // site.  The basic flow of information is as follows:
        //
 (DIR) diff --git a/hugolib/site_test.go b/hugolib/site_test.go
       @@ -35,10 +35,6 @@ const (
                templateWithURLAbs  = "<a href=\"/foobar.jpg\">Going</a>"
        )
        
       -func init() {
       -        testMode = true
       -}
       -
        func TestRenderWithInvalidTemplate(t *testing.T) {
                t.Parallel()
                cfg, fs := newTestCfg()
 (DIR) diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go
       @@ -20,6 +20,7 @@ import (
                "github.com/gohugoio/hugo/resources/page"
                "github.com/sanity-io/litter"
                "github.com/spf13/afero"
       +        "github.com/spf13/cast"
        
                "github.com/gohugoio/hugo/helpers"
                "github.com/gohugoio/hugo/tpl"
       @@ -27,6 +28,8 @@ import (
        
                "os"
        
       +        "github.com/gohugoio/hugo/resources/resource"
       +
                "github.com/gohugoio/hugo/common/loggers"
                "github.com/gohugoio/hugo/hugofs"
                "github.com/stretchr/testify/assert"
       @@ -672,6 +675,19 @@ func getPage(in page.Page, ref string) page.Page {
                return p
        }
        
       +func content(c resource.ContentProvider) string {
       +        cc, err := c.Content()
       +        if err != nil {
       +                panic(err)
       +        }
       +
       +        ccs, err := cast.ToStringE(cc)
       +        if err != nil {
       +                panic(err)
       +        }
       +        return ccs
       +}
       +
        func dumpPages(pages ...page.Page) {
                fmt.Println("---------")
                for i, p := range pages {
       @@ -726,11 +742,3 @@ func parallel(t *testing.T) {
                        t.Parallel()
                }
        }
       -
       -// Useful to debug nilpointers/panics in templates.
       -// Put "defer recoverStack()" in top of the failing function.
       -func recoverStack() {
       -        if r := recover(); r != nil {
       -                fmt.Println(printStackTrace(1000))
       -        }
       -}
 (DIR) diff --git a/minifiers/minifiers.go b/minifiers/minifiers.go
       @@ -80,7 +80,7 @@ func New(mediaTypes media.Types, outputFormats output.Formats) Client {
                addMinifier(m, mediaTypes, "css", cssMin)
                addMinifierFunc(m, mediaTypes, "js", js.Minify)
                m.AddFuncRegexp(regexp.MustCompile("^(application|text)/(x-)?(java|ecma)script$"), js.Minify)
       -        m.AddFuncRegexp(regexp.MustCompile("^(application|text)/(x-|ld\\+)?json$"), json.Minify)
       +        m.AddFuncRegexp(regexp.MustCompile(`^(application|text)/(x-|ld\+)?json$`), json.Minify)
                addMinifierFunc(m, mediaTypes, "json", json.Minify)
                addMinifierFunc(m, mediaTypes, "svg", svg.Minify)
                addMinifierFunc(m, mediaTypes, "xml", xml.Minify)
 (DIR) diff --git a/parser/frontmatter.go b/parser/frontmatter.go
       @@ -22,7 +22,7 @@ import (
        
                "github.com/BurntSushi/toml"
        
       -        "gopkg.in/yaml.v2"
       +        yaml "gopkg.in/yaml.v2"
        )
        
        const (
       @@ -62,7 +62,7 @@ func InterfaceToConfig(in interface{}, format metadecoders.Format, w io.Writer) 
                        return err
        
                default:
       -                return errors.New("Unsupported Format provided")
       +                return errors.New("unsupported Format provided")
                }
        }
        
 (DIR) diff --git a/parser/pageparser/pagelexer.go b/parser/pageparser/pagelexer.go
       @@ -442,13 +442,6 @@ func lexMainSection(l *pageLexer) stateFunc {
        
        }
        
       -func (l *pageLexer) posFirstNonWhiteSpace() int {
       -        f := func(c rune) bool {
       -                return !unicode.IsSpace(c)
       -        }
       -        return bytes.IndexFunc(l.input[l.pos:], f)
       -}
       -
        func lexDone(l *pageLexer) stateFunc {
        
                // Done!
       @@ -477,14 +470,6 @@ func (l *pageLexer) hasPrefix(prefix []byte) bool {
                return bytes.HasPrefix(l.input[l.pos:], prefix)
        }
        
       -func (l *pageLexer) hasPrefixByte(prefix byte) bool {
       -        b := l.input[l.pos:]
       -        if len(b) == 0 {
       -                return false
       -        }
       -        return b[0] == prefix
       -}
       -
        // helper functions
        
        // returns the min index >= 0
 (DIR) diff --git a/releaser/releaser.go b/releaser/releaser.go
       @@ -102,7 +102,7 @@ func (r *ReleaseHandler) Run() error {
                }
        
                if exists {
       -                return fmt.Errorf("Tag %q already exists", tag)
       +                return fmt.Errorf("tag %q already exists", tag)
                }
        
                var changeLogFromTag string
 (DIR) diff --git a/resources/image_test.go b/resources/image_test.go
       @@ -171,21 +171,21 @@ func TestImageTransformConcurrent(t *testing.T) {
                                        for k := 0; k < 2; k++ {
                                                r1, err := img.Resize(fmt.Sprintf("%dx", id-k))
                                                if err != nil {
       -                                                t.Fatal(err)
       +                                                t.Error(err)
                                                }
        
                                                if r1.Width() != id-k {
       -                                                t.Fatalf("Width: %d:%d", r1.Width(), j)
       +                                                t.Errorf("Width: %d:%d", r1.Width(), j)
                                                }
        
                                                r2, err := r1.Resize(fmt.Sprintf("%dx", id-k-1))
                                                if err != nil {
       -                                                t.Fatal(err)
       +                                                t.Error(err)
                                                }
        
                                                _, err = r2.decodeSource()
                                                if err != nil {
       -                                                t.Fatal("Err decode:", err)
       +                                                t.Error("Err decode:", err)
                                                }
        
                                                img = r1
 (DIR) diff --git a/source/fileInfo.go b/source/fileInfo.go
       @@ -14,8 +14,6 @@
        package source
        
        import (
       -        "fmt"
       -        "io"
                "os"
                "path/filepath"
                "strings"
       @@ -23,8 +21,6 @@ import (
        
                "github.com/gohugoio/hugo/common/hugio"
        
       -        "github.com/spf13/afero"
       -
                "github.com/gohugoio/hugo/hugofs"
        
                "github.com/gohugoio/hugo/helpers"
       @@ -286,24 +282,3 @@ func (sp *SourceSpec) NewFileInfo(baseDir, filename string, isLeafBundle bool, f
                return f
        
        }
       -
       -func printFs(fs afero.Fs, path string, w io.Writer) {
       -        if fs == nil {
       -                return
       -        }
       -        afero.Walk(fs, path, func(path string, info os.FileInfo, err error) error {
       -
       -                if info != nil && !info.IsDir() {
       -
       -                        s := path
       -                        if lang, ok := info.(hugofs.LanguageAnnouncer); ok {
       -                                s = s + "\t" + lang.Lang()
       -                        }
       -                        if fp, ok := info.(hugofs.FilePather); ok {
       -                                s = s + "\t" + fp.Filename()
       -                        }
       -                        fmt.Fprintln(w, "    ", s)
       -                }
       -                return nil
       -        })
       -}
 (DIR) diff --git a/source/filesystem_test.go b/source/filesystem_test.go
       @@ -32,14 +32,6 @@ func TestEmptySourceFilesystem(t *testing.T) {
                }
        }
        
       -type TestPath struct {
       -        filename string
       -        logical  string
       -        content  string
       -        section  string
       -        dir      string
       -}
       -
        func TestUnicodeNorm(t *testing.T) {
                if runtime.GOOS != "darwin" {
                        // Normalization code is only for Mac OS, since it is not necessary for other OSes.
 (DIR) diff --git a/source/filesystem_unix_test.go b/source/filesystem_unix_test.go
       @@ -1,28 +0,0 @@
       -// Copyright 2015 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.
       -
       -// +build linux darwin !windows
       -
       -package source
       -
       -//
       -// NOTE, any changes here need to be reflected in filesystem_windows_test.go
       -//
       -var platformBase = "/base/"
       -var platformPaths = []TestPath{
       -        {"foobar", "foobar", "aaa", "", ""},
       -        {"b/1file", "1file", "aaa", "b", "b/"},
       -        {"c/d/2file", "2file", "aaa", "c", "c/d/"},
       -        {"/base/e/f/3file", "3file", "aaa", "e", "e/f/"},
       -        {"section/foo.rss", "foo.rss", "aaa", "section", "section/"},
       -}
 (DIR) diff --git a/source/filesystem_windows_test.go b/source/filesystem_windows_test.go
       @@ -1,28 +0,0 @@
       -// Copyright 2015 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 source
       -
       -//
       -// NOTE, any changes here need to be reflected in filesystem_linux_test.go
       -//
       -
       -// Note the case of the volume drive.  It must be the same in all examples.
       -var platformBase = "C:\\foo\\"
       -var platformPaths = []TestPath{
       -        {"foobar", "foobar", "aaa", "", ""},
       -        {"b\\1file", "1file", "aaa", "b", "b\\"},
       -        {"c\\d\\2file", "2file", "aaa", "c", "c\\d\\"},
       -        {"C:\\foo\\e\\f\\3file", "3file", "aaa", "e", "e\\f\\"}, // note volume case is equal to platformBase
       -        {"section\\foo.rss", "foo.rss", "aaa", "section", "section\\"},
       -}
 (DIR) diff --git a/source/sourceSpec.go b/source/sourceSpec.go
       @@ -124,6 +124,10 @@ func (s *SourceSpec) IsRegularSourceFile(filename string) (bool, error) {
        
                if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
                        link, err := filepath.EvalSymlinks(filename)
       +                if err != nil {
       +                        return false, err
       +                }
       +
                        fi, err = helpers.LstatIfPossible(s.SourceFs, link)
                        if err != nil {
                                return false, err
 (DIR) diff --git a/tpl/collections/reflect_helpers.go b/tpl/collections/reflect_helpers.go
       @@ -38,7 +38,7 @@ func numberToFloat(v reflect.Value) (float64, error) {
                case kind == reflect.Interface:
                        return numberToFloat(v.Elem())
                default:
       -                return 0, fmt.Errorf("Invalid kind %s in numberToFloat", kind)
       +                return 0, fmt.Errorf("invalid kind %s in numberToFloat", kind)
                }
        }
        
 (DIR) diff --git a/tpl/data/data.go b/tpl/data/data.go
       @@ -58,18 +58,18 @@ func (ns *Namespace) GetCSV(sep string, urlParts ...string) (d [][]string, err e
                url := strings.Join(urlParts, "")
                cache := ns.cacheGetCSV
        
       -        unmarshal := func(b []byte) (error, bool) {
       +        unmarshal := func(b []byte) (bool, error) {
                        if !bytes.Contains(b, []byte(sep)) {
       -                        return _errors.Errorf("cannot find separator %s in CSV for %s", sep, url), false
       +                        return false, _errors.Errorf("cannot find separator %s in CSV for %s", sep, url)
                        }
        
                        if d, err = parseCSV(b, sep); err != nil {
                                err = _errors.Wrapf(err, "failed to parse CSV file %s", url)
        
       -                        return err, true
       +                        return true, err
                        }
        
       -                return nil, false
       +                return false, nil
                }
        
                var req *http.Request
       @@ -103,12 +103,12 @@ func (ns *Namespace) GetJSON(urlParts ...string) (interface{}, error) {
                        return nil, _errors.Wrapf(err, "Failed to create request for getJSON resource %s", url)
                }
        
       -        unmarshal := func(b []byte) (error, bool) {
       +        unmarshal := func(b []byte) (bool, error) {
                        err := json.Unmarshal(b, &v)
                        if err != nil {
       -                        return err, true
       +                        return true, err
                        }
       -                return nil, false
       +                return false, nil
                }
        
                req.Header.Add("Accept", "application/json")
 (DIR) diff --git a/tpl/data/resources.go b/tpl/data/resources.go
       @@ -34,7 +34,7 @@ var (
        )
        
        // getRemote loads the content of a remote file. This method is thread safe.
       -func (ns *Namespace) getRemote(cache *filecache.Cache, unmarshal func([]byte) (error, bool), req *http.Request) error {
       +func (ns *Namespace) getRemote(cache *filecache.Cache, unmarshal func([]byte) (bool, error), req *http.Request) error {
                url := req.URL.String()
                id := helpers.MD5String(url)
                var handled bool
       @@ -63,7 +63,7 @@ func (ns *Namespace) getRemote(cache *filecache.Cache, unmarshal func([]byte) (e
                                }
                                res.Body.Close()
        
       -                        err, retry = unmarshal(b)
       +                        retry, err = unmarshal(b)
        
                                if err == nil {
                                        // Return it so it can be cached.
       @@ -85,7 +85,7 @@ func (ns *Namespace) getRemote(cache *filecache.Cache, unmarshal func([]byte) (e
        
                if !handled {
                        // This is cached content and should be correct.
       -                err, _ = unmarshal(b)
       +                _, err = unmarshal(b)
                }
        
                return err
       @@ -104,14 +104,14 @@ func getLocal(url string, fs afero.Fs, cfg config.Provider) ([]byte, error) {
        
        // getResource loads the content of a local or remote file and returns its content and the
        // cache ID used, if relevant.
       -func (ns *Namespace) getResource(cache *filecache.Cache, unmarshal func(b []byte) (error, bool), req *http.Request) error {
       +func (ns *Namespace) getResource(cache *filecache.Cache, unmarshal func(b []byte) (bool, error), req *http.Request) error {
                switch req.URL.Scheme {
                case "":
                        b, err := getLocal(req.URL.String(), ns.deps.Fs.Source, ns.deps.Cfg)
                        if err != nil {
                                return err
                        }
       -                err, _ = unmarshal(b)
       +                _, err = unmarshal(b)
                        return err
                default:
                        return ns.getRemote(cache, unmarshal, req)
 (DIR) diff --git a/tpl/data/resources_test.go b/tpl/data/resources_test.go
       @@ -114,9 +114,9 @@ func TestScpGetRemote(t *testing.T) {
                        ns.client = cl
        
                        var c []byte
       -                f := func(b []byte) (error, bool) {
       +                f := func(b []byte) (bool, error) {
                                c = b
       -                        return nil, false
       +                        return false, nil
                        }
        
                        err = ns.getRemote(cache, f, req)
       @@ -158,15 +158,15 @@ func TestScpGetRemoteParallel(t *testing.T) {
                                        defer wg.Done()
                                        for j := 0; j < 10; j++ {
                                                var c []byte
       -                                        f := func(b []byte) (error, bool) {
       +                                        f := func(b []byte) (bool, error) {
                                                        c = b
       -                                                return nil, false
       +                                                return false, nil
                                                }
                                                err := ns.getRemote(ns.cacheGetJSON, f, req)
        
                                                assert.NoError(t, err)
                                                if string(content) != string(c) {
       -                                                t.Fatalf("expected\n%q\ngot\n%q", content, c)
       +                                                t.Errorf("expected\n%q\ngot\n%q", content, c)
                                                }
        
                                                time.Sleep(23 * time.Millisecond)
 (DIR) diff --git a/tpl/math/math.go b/tpl/math/math.go
       @@ -78,11 +78,11 @@ func (ns *Namespace) Mod(a, b interface{}) (int64, error) {
                bi, errb := cast.ToInt64E(b)
        
                if erra != nil || errb != nil {
       -                return 0, errors.New("Modulo operator can't be used with non integer value")
       +                return 0, errors.New("modulo operator can't be used with non integer value")
                }
        
                if bi == 0 {
       -                return 0, errors.New("The number can't be divided by zero at modulo operation")
       +                return 0, errors.New("the number can't be divided by zero at modulo operation")
                }
        
                return ai % bi, nil
 (DIR) diff --git a/tpl/os/os.go b/tpl/os/os.go
       @@ -73,7 +73,7 @@ func readFile(fs afero.Fs, filename string) (string, error) {
        
                if info, err := fs.Stat(filename); err == nil {
                        if info.Size() > 1000000 {
       -                        return "", fmt.Errorf("File %q is too big", filename)
       +                        return "", fmt.Errorf("file %q is too big", filename)
                        }
                } else {
                        return "", err
       @@ -108,7 +108,7 @@ func (ns *Namespace) ReadDir(i interface{}) ([]_os.FileInfo, error) {
        
                list, err := afero.ReadDir(ns.deps.Fs.WorkingDir, path)
                if err != nil {
       -                return nil, fmt.Errorf("Failed to read Directory %s with error message %s", path, err)
       +                return nil, fmt.Errorf("failed to read directory %q: %s", path, err)
                }
        
                return list, nil
 (DIR) diff --git a/tpl/partials/partials.go b/tpl/partials/partials.go
       @@ -107,7 +107,7 @@ func (ns *Namespace) Include(name string, contextList ...interface{}) (interface
        
                }
        
       -        return "", fmt.Errorf("Partial %q not found", name)
       +        return "", fmt.Errorf("partial %q not found", name)
        }
        
        // IncludeCached executes and caches partial templates.  An optional variant
 (DIR) diff --git a/tpl/template.go b/tpl/template.go
       @@ -152,7 +152,7 @@ func (t *TemplateAdapter) Execute(w io.Writer, data interface{}) (execErr error)
                        // Panics in templates are a little bit too common (nil pointers etc.)
                        // See https://github.com/gohugoio/hugo/issues/5327
                        if r := recover(); r != nil {
       -                        execErr = t.addFileContext(t.Name(), fmt.Errorf(`panic in Execute: %s. See "https://github.com/gohugoio/hugo/issues/5327" for the reason why we cannot provide a better error message for this.`, r))
       +                        execErr = t.addFileContext(t.Name(), fmt.Errorf(`panic in Execute: %s. See "https://github.com/gohugoio/hugo/issues/5327" for the reason why we cannot provide a better error message for this`, r))
                        }
                }()
        
       @@ -174,7 +174,7 @@ func (t *TemplateAdapter) TemplateInfo() Info {
        
        // The identifiers may be truncated in the log, e.g.
        // "executing "main" at <$scaled.SRelPermalin...>: can't evaluate field SRelPermalink in type *resource.Image"
       -var identifiersRe = regexp.MustCompile("at \\<(.*?)(\\.{3})?\\>:")
       +var identifiersRe = regexp.MustCompile(`at \<(.*?)(\.{3})?\>:`)
        
        func (t *TemplateAdapter) extractIdentifiers(line string) []string {
                m := identifiersRe.FindAllStringSubmatch(line, -1)
 (DIR) diff --git a/tpl/tplimpl/embedded/generate/generate.go b/tpl/tplimpl/embedded/generate/generate.go
       @@ -39,6 +39,9 @@ func main() {
                var nameValues []string
        
                err = filepath.Walk(temlatePath, func(path string, info os.FileInfo, err error) error {
       +                if err != nil {
       +                        return err
       +                }
        
                        if info.IsDir() {
                                return nil
 (DIR) diff --git a/tpl/transform/remarshal.go b/tpl/transform/remarshal.go
       @@ -41,6 +41,9 @@ func (ns *Namespace) Remarshal(format string, data interface{}) (string, error) 
                }
        
                meta, err := metadecoders.Default.UnmarshalToMap([]byte(from), fromFormat)
       +        if err != nil {
       +                return "", err
       +        }
        
                var result bytes.Buffer
                if err := parser.InterfaceToConfig(meta, mark, &result); err != nil {
 (DIR) diff --git a/transform/chain_test.go b/transform/chain_test.go
       @@ -58,8 +58,8 @@ func TestChaingMultipleTransformers(t *testing.T) {
        
                expected := "Test: f4r f3r f1r f2r f1r The End."
        
       -        if string(out.Bytes()) != expected {
       -                t.Errorf("Expected %s got %s", expected, string(out.Bytes()))
       +        if out.String() != expected {
       +                t.Errorf("Expected %s got %s", expected, out.String())
                }
        }
        
 (DIR) diff --git a/transform/livereloadinject/livereloadinject_test.go b/transform/livereloadinject/livereloadinject_test.go
       @@ -35,7 +35,7 @@ func doTestLiveReloadInject(t *testing.T, bodyEndTag string) {
                tr.Apply(out, in)
        
                expected := fmt.Sprintf(`<script data-no-instant>document.write('<script src="/livereload.js?port=1313&mindelay=10"></' + 'script>')</script>%s`, bodyEndTag)
       -        if string(out.Bytes()) != expected {
       -                t.Errorf("Expected %s got %s", expected, string(out.Bytes()))
       +        if out.String() != expected {
       +                t.Errorf("Expected %s got %s", expected, out.String())
                }
        }
 (DIR) diff --git a/transform/urlreplacers/absurlreplacer.go b/transform/urlreplacers/absurlreplacer.go
       @@ -37,8 +37,6 @@ type absurllexer struct {
                quotes [][]byte
        }
        
       -type stateFunc func(*absurllexer) stateFunc
       -
        type prefix struct {
                disabled bool
                b        []byte
       @@ -54,11 +52,6 @@ func newPrefixState() []*prefix {
                }
        }
        
       -type absURLMatcher struct {
       -        match []byte
       -        quote []byte
       -}
       -
        func (l *absurllexer) emit() {
                l.w.Write(l.content[l.start:l.pos])
                l.start = l.pos
 (DIR) diff --git a/transform/urlreplacers/absurlreplacer_test.go b/transform/urlreplacers/absurlreplacer_test.go
       @@ -41,7 +41,6 @@ const (
                replace1 = "No replacements."
                replace2 = "ᚠᛇᚻ ᛒᛦᚦ ᚠᚱᚩᚠᚢᚱ\nᚠᛁᚱᚪ ᚷᛖᚻᚹᛦᛚᚳᚢᛗ"
                replace3 = `End of file: src="/`
       -        replace4 = `End of file: srcset="/`
                replace5 = `Srcsett with no closing quote: srcset="/img/small.jpg do be do be do.`
        
                // Issue: 816, schemaless links combined with others