From 5a44be627c055d3e9eb406ec4a91579de78b6910 Mon Sep 17 00:00:00 2001 From: guillep2k <18600385+guillep2k@users.noreply.github.com> Date: Thu, 15 Aug 2019 09:07:28 -0300 Subject: Convert files to utf-8 for indexing (#7814) * Convert files to utf-8 for indexing * Move utf8 functions to modules/base * Bump repoIndexerLatestVersion to 3 * Add tests for base/encoding.go * Changes to pass gosimple * Move UTF8 funcs into new modules/charset package --- modules/base/tool.go | 49 ----------------------------------------------- modules/base/tool_test.go | 36 ---------------------------------- 2 files changed, 85 deletions(-) (limited to 'modules/base') diff --git a/modules/base/tool.go b/modules/base/tool.go index 4893abff71..2bb39dbfea 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -5,7 +5,6 @@ package base import ( - "bytes" "crypto/md5" "crypto/rand" "crypto/sha1" @@ -26,7 +25,6 @@ import ( "strings" "time" "unicode" - "unicode/utf8" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" @@ -35,12 +33,8 @@ import ( "github.com/Unknwon/com" "github.com/Unknwon/i18n" - "github.com/gogits/chardet" ) -// UTF8BOM is the utf-8 byte-order marker -var UTF8BOM = []byte{'\xef', '\xbb', '\xbf'} - // EncodeMD5 encodes string to md5 hex value. func EncodeMD5(str string) string { m := md5.New() @@ -68,49 +62,6 @@ func ShortSha(sha1 string) string { return TruncateString(sha1, 10) } -// DetectEncoding detect the encoding of content -func DetectEncoding(content []byte) (string, error) { - if utf8.Valid(content) { - log.Debug("Detected encoding: utf-8 (fast)") - return "UTF-8", nil - } - - textDetector := chardet.NewTextDetector() - var detectContent []byte - if len(content) < 1024 { - // Check if original content is valid - if _, err := textDetector.DetectBest(content); err != nil { - return "", err - } - times := 1024 / len(content) - detectContent = make([]byte, 0, times*len(content)) - for i := 0; i < times; i++ { - detectContent = append(detectContent, content...) - } - } else { - detectContent = content - } - result, err := textDetector.DetectBest(detectContent) - if err != nil { - return "", err - } - if result.Charset != "UTF-8" && len(setting.Repository.AnsiCharset) > 0 { - log.Debug("Using default AnsiCharset: %s", setting.Repository.AnsiCharset) - return setting.Repository.AnsiCharset, err - } - - log.Debug("Detected encoding: %s", result.Charset) - return result.Charset, err -} - -// RemoveBOMIfPresent removes a UTF-8 BOM from a []byte -func RemoveBOMIfPresent(content []byte) []byte { - if len(content) > 2 && bytes.Equal(content[0:3], UTF8BOM) { - return content[3:] - } - return content -} - // BasicAuthDecode decode basic auth string func BasicAuthDecode(encoded string) (string, string, error) { s, err := base64.StdEncoding.DecodeString(encoded) diff --git a/modules/base/tool_test.go b/modules/base/tool_test.go index fa61e5dfb1..3f1eebfc4b 100644 --- a/modules/base/tool_test.go +++ b/modules/base/tool_test.go @@ -64,42 +64,6 @@ func TestShortSha(t *testing.T) { assert.Equal(t, "veryverylo", ShortSha("veryverylong")) } -func TestDetectEncoding(t *testing.T) { - testSuccess := func(b []byte, expected string) { - encoding, err := DetectEncoding(b) - assert.NoError(t, err) - assert.Equal(t, expected, encoding) - } - // utf-8 - b := []byte("just some ascii") - testSuccess(b, "UTF-8") - - // utf-8-sig: "hey" (with BOM) - b = []byte{0xef, 0xbb, 0xbf, 0x68, 0x65, 0x79} - testSuccess(b, "UTF-8") - - // utf-16: "hey" - b = []byte{0xff, 0xfe, 0x68, 0x00, 0x65, 0x00, 0x79, 0x00, 0xf4, 0x01} - testSuccess(b, "UTF-16LE") - - // iso-8859-1: dcor - b = []byte{0x44, 0xe9, 0x63, 0x6f, 0x72, 0x0a} - encoding, err := DetectEncoding(b) - assert.NoError(t, err) - // due to a race condition in `chardet` library, it could either detect - // "ISO-8859-1" or "IS0-8859-2" here. Technically either is correct, so - // we accept either. - assert.Contains(t, encoding, "ISO-8859") - - setting.Repository.AnsiCharset = "placeholder" - testSuccess(b, "placeholder") - - // invalid bytes - b = []byte{0xfa} - _, err = DetectEncoding(b) - assert.Error(t, err) -} - func TestBasicAuthDecode(t *testing.T) { _, _, err := BasicAuthDecode("?") assert.Equal(t, "illegal base64 data at input byte 0", err.Error()) -- cgit v1.2.3