From 98826d198b228e725ceb5a9fcf1d936ad3817d8e Mon Sep 17 00:00:00 2001 From: Runxi Yu <me@runxiyu.org> Date: Sat, 05 Apr 2025 14:09:15 +0800 Subject: [PATCH] Reduce unnecessary allocations when converting []byte to string --- git_plumbing.go | 4 ++-- http_handle_repo_index.go | 8 ++++---- http_handle_repo_raw.go | 4 ++-- http_handle_repo_tree.go | 4 ++-- readme_to_html.go | 6 +++--- diff --git a/git_plumbing.go b/git_plumbing.go index e787c59dbbeb3beaa06874bb7734461926b7af1f..15329adb4126a7df38f201ae896b66a8d4b1b8e9 100644 --- a/git_plumbing.go +++ b/git_plumbing.go @@ -76,14 +76,14 @@ modeEnd := bytes.IndexByte(data[i:], ' ') if modeEnd < 0 { return errors.New("invalid tree format") } - mode := string(data[i : i+modeEnd]) + mode := bytesToString(data[i : i+modeEnd]) i += modeEnd + 1 nameEnd := bytes.IndexByte(data[i:], 0) if nameEnd < 0 { return errors.New("missing null after filename") } - name := string(data[i : i+nameEnd]) + name := bytesToString(data[i : i+nameEnd]) i += nameEnd + 1 if i+20 > len(data) { diff --git a/http_handle_repo_index.go b/http_handle_repo_index.go index b0a5899d9b29ae2fa68ef3abea2690b57d677231..8f0a62b6586abf9ab584cf57374017f00a529d86 100644 --- a/http_handle_repo_index.go +++ b/http_handle_repo_index.go @@ -91,10 +91,10 @@ authorDate, _ := reader.ReadData() commits = append(commits, commitDisplay{ Hash: hex.EncodeToString(id), - Author: string(authorName), - Email: string(authorEmail), - Date: string(authorDate), - Message: string(title), + Author: bytesToString(authorName), + Email: bytesToString(authorEmail), + Date: bytesToString(authorDate), + Message: bytesToString(title), }) } diff --git a/http_handle_repo_raw.go b/http_handle_repo_raw.go index 5c8f62679e2dcd5625a3bcaea179941d4e60001b..d12fa392d81abac1417dc30ad12b1b1a44ed3844 100644 --- a/http_handle_repo_raw.go +++ b/http_handle_repo_raw.go @@ -98,7 +98,7 @@ errorPage500(writer, params, "error reading entry name: "+err.Error()) return } files = append(files, displayTreeEntry{ - Name: string(name), + Name: bytesToString(name), Mode: fmt.Sprintf("%06o", mode), Size: size, IsFile: typeCode == 2, @@ -123,7 +123,7 @@ errorPage500(writer, params, "error reading blob content: "+err.Error()) return } writer.Header().Set("Content-Type", "application/octet-stream") - fmt.Fprint(writer, string(content)) + fmt.Fprint(writer, bytesToString(content)) default: errorPage500(writer, params, fmt.Sprintf("unknown object kind: %d", kind)) diff --git a/http_handle_repo_tree.go b/http_handle_repo_tree.go index c834ad9b60e6b48a5d482e0e87b94368dd8a170a..347026dd2c12a024687c885bd56f4bc811a61cd0 100644 --- a/http_handle_repo_tree.go +++ b/http_handle_repo_tree.go @@ -97,7 +97,7 @@ return } files = append(files, displayTreeEntry{ - Name: string(name), + Name: bytesToString(name), Mode: fmt.Sprintf("%06o", mode), Size: size, IsFile: typeCode == 2, @@ -116,7 +116,7 @@ if err != nil && !errors.Is(err, io.EOF) { errorPage500(writer, params, "error reading file content: "+err.Error()) return } - rendered := renderHighlightedFile(pathSpec, string(content)) + rendered := renderHighlightedFile(pathSpec, bytesToString(content)) params["file_contents"] = rendered renderTemplate(writer, "repo_tree_file", params) diff --git a/readme_to_html.go b/readme_to_html.go index c5cc706dcb09187ea87c0b8aee2a178819aacd94..a7a9cc3e18b221c5c9ce24cdc05a10321711826f 100644 --- a/readme_to_html.go +++ b/readme_to_html.go @@ -44,7 +44,7 @@ // renderReadme renders and sanitizes README content from a byte slice and filename. func renderReadme(data []byte, filename string) (string, template.HTML) { switch strings.ToLower(filename) { case "readme": - return "README", template.HTML("<pre>" + html.EscapeString(string(data)) + "</pre>") //#nosec G203 + return "README", template.HTML("<pre>" + html.EscapeString(bytesToString(data)) + "</pre>") //#nosec G203 case "readme.md": var buf bytes.Buffer if err := markdownConverter.Convert(data, &buf); err != nil { @@ -52,12 +52,12 @@ return "Error fetching README", escapeHTML("Unable to render README: " + err.Error()) } return "README.md", template.HTML(bluemonday.UGCPolicy().SanitizeBytes(buf.Bytes())) //#nosec G203 case "readme.org": - htmlStr, err := org.New().Parse(strings.NewReader(string(data)), filename).Write(org.NewHTMLWriter()) + htmlStr, err := org.New().Parse(strings.NewReader(bytesToString(data)), filename).Write(org.NewHTMLWriter()) if err != nil { return "Error fetching README", escapeHTML("Unable to render README: " + err.Error()) } return "README.org", template.HTML(bluemonday.UGCPolicy().Sanitize(htmlStr)) //#nosec G203 default: - return filename, template.HTML("<pre>" + html.EscapeString(string(data)) + "</pre>") //#nosec G203 + return filename, template.HTML("<pre>" + html.EscapeString(bytesToString(data)) + "</pre>") //#nosec G203 } } -- 2.48.1