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