Refactor to use UnsafeStringToBytes (#31358)

The PR replaces all `goldmark/util.BytesToReadOnlyString` with
`util.UnsafeBytesToString`, `goldmark/util.StringToReadOnlyBytes` with
`util.UnsafeStringToBytes`. This removes one `TODO`.

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
(cherry picked from commit 1761459ebc7eb6d432eced093b4583425a5c5d4b)
This commit is contained in:
Oleksandr Redko 2024-06-14 04:26:33 +03:00 committed by Earl Warren
parent b5ea092964
commit b640ac4660
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
6 changed files with 14 additions and 18 deletions

View file

@ -9,9 +9,9 @@ import (
"code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/markup/common" "code.gitea.io/gitea/modules/markup/common"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/util"
) )
type prefixedIDs struct { type prefixedIDs struct {
@ -36,7 +36,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
if !bytes.HasPrefix(result, []byte("user-content-")) { if !bytes.HasPrefix(result, []byte("user-content-")) {
result = append([]byte("user-content-"), result...) result = append([]byte("user-content-"), result...)
} }
if p.values.Add(util.BytesToReadOnlyString(result)) { if p.values.Add(util.UnsafeBytesToString(result)) {
return result return result
} }
for i := 1; ; i++ { for i := 1; ; i++ {
@ -49,7 +49,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
// Put puts a given element id to the used ids table. // Put puts a given element id to the used ids table.
func (p *prefixedIDs) Put(value []byte) { func (p *prefixedIDs) Put(value []byte) {
p.values.Add(util.BytesToReadOnlyString(value)) p.values.Add(util.UnsafeBytesToString(value))
} }
func newPrefixedIDs() *prefixedIDs { func newPrefixedIDs() *prefixedIDs {

View file

@ -7,10 +7,10 @@ import (
"fmt" "fmt"
"code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/text" "github.com/yuin/goldmark/text"
"github.com/yuin/goldmark/util"
) )
func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Heading, reader text.Reader, tocList *[]markup.Header) { func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Heading, reader text.Reader, tocList *[]markup.Header) {
@ -21,11 +21,11 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin
} }
txt := v.Text(reader.Source()) txt := v.Text(reader.Source())
header := markup.Header{ header := markup.Header{
Text: util.BytesToReadOnlyString(txt), Text: util.UnsafeBytesToString(txt),
Level: v.Level, Level: v.Level,
} }
if id, found := v.AttributeString("id"); found { if id, found := v.AttributeString("id"); found {
header.ID = util.BytesToReadOnlyString(id.([]byte)) header.ID = util.UnsafeBytesToString(id.([]byte))
} }
*tocList = append(*tocList, header) *tocList = append(*tocList, header)
g.applyElementDir(v) g.applyElementDir(v)

View file

@ -14,8 +14,7 @@ import (
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup/mdstripper" "code.gitea.io/gitea/modules/markup/mdstripper"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/util"
) )
var ( var (
@ -341,7 +340,7 @@ func FindRenderizableReferenceNumeric(content string, prOnly, crossLinkOnly bool
return false, nil return false, nil
} }
} }
r := getCrossReference(util.StringToReadOnlyBytes(content), match[2], match[3], false, prOnly) r := getCrossReference(util.UnsafeStringToBytes(content), match[2], match[3], false, prOnly)
if r == nil { if r == nil {
return false, nil return false, nil
} }

View file

@ -8,8 +8,7 @@ import (
"code.gitea.io/gitea/models/system" "code.gitea.io/gitea/models/system"
"code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/util"
) )
// DBStore can be used to store app state items in local filesystem // DBStore can be used to store app state items in local filesystem
@ -24,7 +23,7 @@ func (f *DBStore) Get(ctx context.Context, item StateItem) error {
if content == "" { if content == "" {
return nil return nil
} }
return json.Unmarshal(util.StringToReadOnlyBytes(content), item) return json.Unmarshal(util.UnsafeStringToBytes(content), item)
} }
// Set saves the state item // Set saves the state item
@ -33,5 +32,5 @@ func (f *DBStore) Set(ctx context.Context, item StateItem) error {
if err != nil { if err != nil {
return err return err
} }
return system.SaveAppStateContent(ctx, item.Name(), util.BytesToReadOnlyString(b)) return system.SaveAppStateContent(ctx, item.Name(), util.UnsafeBytesToString(b))
} }

View file

@ -6,8 +6,6 @@ package util
import ( import (
"bytes" "bytes"
"unicode" "unicode"
"github.com/yuin/goldmark/util"
) )
type sanitizedError struct { type sanitizedError struct {
@ -33,7 +31,7 @@ var schemeSep = []byte("://")
// SanitizeCredentialURLs remove all credentials in URLs (starting with "scheme://") for the input string: "https://user:pass@domain.com" => "https://sanitized-credential@domain.com" // SanitizeCredentialURLs remove all credentials in URLs (starting with "scheme://") for the input string: "https://user:pass@domain.com" => "https://sanitized-credential@domain.com"
func SanitizeCredentialURLs(s string) string { func SanitizeCredentialURLs(s string) string {
bs := util.StringToReadOnlyBytes(s) bs := UnsafeStringToBytes(s)
schemeSepPos := bytes.Index(bs, schemeSep) schemeSepPos := bytes.Index(bs, schemeSep)
if schemeSepPos == -1 || bytes.IndexByte(bs[schemeSepPos:], '@') == -1 { if schemeSepPos == -1 || bytes.IndexByte(bs[schemeSepPos:], '@') == -1 {
return s // fast return if there is no URL scheme or no userinfo return s // fast return if there is no URL scheme or no userinfo
@ -70,5 +68,5 @@ func SanitizeCredentialURLs(s string) string {
schemeSepPos = bytes.Index(bs, schemeSep) schemeSepPos = bytes.Index(bs, schemeSep)
} }
out = append(out, bs...) out = append(out, bs...)
return util.BytesToReadOnlyString(out) return UnsafeBytesToString(out)
} }

View file

@ -87,11 +87,11 @@ func ToSnakeCase(input string) string {
} }
// UnsafeBytesToString uses Go's unsafe package to convert a byte slice to a string. // UnsafeBytesToString uses Go's unsafe package to convert a byte slice to a string.
// TODO: replace all "goldmark/util.BytesToReadOnlyString" with this official approach
func UnsafeBytesToString(b []byte) string { func UnsafeBytesToString(b []byte) string {
return unsafe.String(unsafe.SliceData(b), len(b)) return unsafe.String(unsafe.SliceData(b), len(b))
} }
// UnsafeStringToBytes uses Go's unsafe package to convert a string to a byte slice.
func UnsafeStringToBytes(s string) []byte { func UnsafeStringToBytes(s string) []byte {
return unsafe.Slice(unsafe.StringData(s), len(s)) return unsafe.Slice(unsafe.StringData(s), len(s))
} }