From 0c0062b22ff4ddac9cf8c4ef84116eddba99bce2 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 05 Apr 2025 23:59:17 +0800 Subject: [PATCH] templates shall no longer be a global variable --- http_handle_branches.go | 2 +- http_handle_group_index.go | 30 +++++++++++++++--------------- http_handle_index.go | 4 ++-- http_handle_login.go | 16 ++++++++-------- http_handle_repo_commit.go | 10 +++++----- http_handle_repo_contrib_index.go | 8 ++++---- http_handle_repo_contrib_one.go | 20 ++++++++++---------- http_handle_repo_index.go | 6 +++--- http_handle_repo_log.go | 8 ++++---- http_handle_repo_raw.go | 8 ++++---- http_handle_repo_tree.go | 10 +++++----- http_handle_users.go | 4 ++-- http_server.go | 42 +++++++++++++++++++++--------------------- http_template.go | 4 ++-- resources.go | 8 +++----- server.go | 5 ++++- diff --git a/http_handle_branches.go b/http_handle_branches.go index 659287f7ed87015f3e406fd99be30cf295d85e22..7709d4e9371f4e2716a0cbbaa3cdeb475408ad5e 100644 --- a/http_handle_branches.go +++ b/http_handle_branches.go @@ -42,5 +42,5 @@ params["http_clone_url"] = s.genHTTPRemoteURL(groupPath, repoName) params["ssh_clone_url"] = s.genSSHRemoteURL(groupPath, repoName) params["notes"] = notes - renderTemplate(writer, "repo_branches", params) + s.renderTemplate(writer, "repo_branches", params) } diff --git a/http_handle_group_index.go b/http_handle_group_index.go index 63bb164d918984761dbe3574f5be7b66e54363c4..5d2edce60abba50a10c33e9318826f162047693b 100644 --- a/http_handle_group_index.go +++ b/http_handle_group_index.go @@ -62,10 +62,10 @@ pgtype.FlatArray[string](groupPath), ).Scan(&groupID, &groupDesc) if errors.Is(err, pgx.ErrNoRows) { - web.ErrorPage404(templates, writer, params) + web.ErrorPage404(s.templates, writer, params) return } else if err != nil { - web.ErrorPage500(templates, writer, params, "Error getting group: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting group: "+err.Error()) return } @@ -78,14 +78,14 @@ WHERE user_id = $1 AND group_id = $2 `, params["user_id"].(int), groupID).Scan(&count) if err != nil { - web.ErrorPage500(templates, writer, params, "Error checking access: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error checking access: "+err.Error()) return } directAccess := (count > 0) if request.Method == http.MethodPost { if !directAccess { - web.ErrorPage403(templates, writer, params, "You do not have direct access to this group") + web.ErrorPage403(s.templates, writer, params, "You do not have direct access to this group") return } @@ -93,7 +93,7 @@ repoName := request.FormValue("repo_name") repoDesc := request.FormValue("repo_desc") contribReq := request.FormValue("repo_contrib") if repoName == "" { - web.ErrorPage400(templates, writer, params, "Repo name is required") + web.ErrorPage400(s.templates, writer, params, "Repo name is required") return } @@ -109,7 +109,7 @@ groupID, contribReq, ).Scan(&newRepoID) if err != nil { - web.ErrorPage500(templates, writer, params, "Error creating repo: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error creating repo: "+err.Error()) return } @@ -124,12 +124,12 @@ filePath, newRepoID, ) if err != nil { - web.ErrorPage500(templates, writer, params, "Error updating repo path: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error updating repo path: "+err.Error()) return } if err = s.gitInit(filePath); err != nil { - web.ErrorPage500(templates, writer, params, "Error initializing repo: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error initializing repo: "+err.Error()) return } @@ -145,7 +145,7 @@ FROM repos WHERE group_id = $1 `, groupID) if err != nil { - web.ErrorPage500(templates, writer, params, "Error getting repos: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting repos: "+err.Error()) return } defer rows.Close() @@ -153,13 +153,13 @@ for rows.Next() { var name, description string if err = rows.Scan(&name, &description); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting repos: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting repos: "+err.Error()) return } repos = append(repos, nameDesc{name, description}) } if err = rows.Err(); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting repos: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting repos: "+err.Error()) return } @@ -170,7 +170,7 @@ FROM groups WHERE parent_group = $1 `, groupID) if err != nil { - web.ErrorPage500(templates, writer, params, "Error getting subgroups: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting subgroups: "+err.Error()) return } defer rows.Close() @@ -178,13 +178,13 @@ for rows.Next() { var name, description string if err = rows.Scan(&name, &description); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting subgroups: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting subgroups: "+err.Error()) return } subgroups = append(subgroups, nameDesc{name, description}) } if err = rows.Err(); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting subgroups: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting subgroups: "+err.Error()) return } @@ -193,5 +193,5 @@ params["subgroups"] = subgroups params["description"] = groupDesc params["direct_access"] = directAccess - renderTemplate(writer, "group", params) + s.renderTemplate(writer, "group", params) } diff --git a/http_handle_index.go b/http_handle_index.go index a1ecfe4db09ebfe3e341274718bf260aa5535c54..c1efd98debb5aa6ec920e56bfd99c36b52618c2c 100644 --- a/http_handle_index.go +++ b/http_handle_index.go @@ -19,7 +19,7 @@ var groups []nameDesc groups, err = s.queryNameDesc(request.Context(), "SELECT name, COALESCE(description, '') FROM groups WHERE parent_group IS NULL") if err != nil { - web.ErrorPage500(templates, writer, params, "Error querying groups: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error querying groups: "+err.Error()) return } params["groups"] = groups @@ -28,5 +28,5 @@ // Memory currently allocated memstats := runtime.MemStats{} //exhaustruct:ignore runtime.ReadMemStats(&memstats) params["mem"] = humanize.IBytes(memstats.Alloc) - renderTemplate(writer, "index", params) + s.renderTemplate(writer, "index", params) } diff --git a/http_handle_login.go b/http_handle_login.go index dfb74c8b0cd12c5c38a0b35ce2dfb2db865a5c97..4b7cacf744b0cf687f98c138c0af9ad9f3ad1cc2 100644 --- a/http_handle_login.go +++ b/http_handle_login.go @@ -29,7 +29,7 @@ var expiry time.Time var cookie http.Cookie if request.Method != http.MethodPost { - renderTemplate(writer, "login", params) + s.renderTemplate(writer, "login", params) return } @@ -43,31 +43,31 @@ ).Scan(&userID, &passwordHash) if err != nil { if errors.Is(err, pgx.ErrNoRows) { params["login_error"] = "Unknown username" - renderTemplate(writer, "login", params) + s.renderTemplate(writer, "login", params) return } - web.ErrorPage500(templates, writer, params, "Error querying user information: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error querying user information: "+err.Error()) return } if passwordHash == "" { params["login_error"] = "User has no password" - renderTemplate(writer, "login", params) + s.renderTemplate(writer, "login", params) return } if passwordMatches, err = argon2id.ComparePasswordAndHash(password, passwordHash); err != nil { - web.ErrorPage500(templates, writer, params, "Error comparing password and hash: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error comparing password and hash: "+err.Error()) return } if !passwordMatches { params["login_error"] = "Invalid password" - renderTemplate(writer, "login", params) + s.renderTemplate(writer, "login", params) return } if cookieValue, err = randomUrlsafeStr(16); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting random string: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting random string: "+err.Error()) return } @@ -88,7 +88,7 @@ http.SetCookie(writer, &cookie) _, err = s.database.Exec(request.Context(), "INSERT INTO sessions (user_id, session_id) VALUES ($1, $2)", userID, cookieValue) if err != nil { - web.ErrorPage500(templates, writer, params, "Error inserting session: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error inserting session: "+err.Error()) return } diff --git a/http_handle_repo_commit.go b/http_handle_repo_commit.go index c348dca590b3e0bcbcf16a9b4c82f33195f0806b..196489fec4800f38115cef39c51ee57a2e756371 100644 --- a/http_handle_repo_commit.go +++ b/http_handle_repo_commit.go @@ -32,7 +32,7 @@ Operation diff.Operation Content string } -func httpHandleRepoCommit(writer http.ResponseWriter, request *http.Request, params map[string]any) { +func (s *Server) httpHandleRepoCommit(writer http.ResponseWriter, request *http.Request, params map[string]any) { var repo *git.Repository var commitIDStrSpec, commitIDStrSpecNoSuffix string var commitID plumbing.Hash @@ -47,13 +47,13 @@ commitIDStrSpecNoSuffix = strings.TrimSuffix(commitIDStrSpec, ".patch") commitID = plumbing.NewHash(commitIDStrSpecNoSuffix) if commitObj, err = repo.CommitObject(commitID); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting commit object: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting commit object: "+err.Error()) return } if commitIDStrSpecNoSuffix != commitIDStrSpec { var patchStr string if patchStr, err = fmtCommitPatch(commitObj); err != nil { - web.ErrorPage500(templates, writer, params, "Error formatting patch: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error formatting patch: "+err.Error()) return } fmt.Fprintln(writer, patchStr) @@ -71,7 +71,7 @@ params["commit_id"] = commitIDStr parentCommitHash, patch, err = commitToPatch(commitObj) if err != nil { - web.ErrorPage500(templates, writer, params, "Error getting patch from commit: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting patch from commit: "+err.Error()) return } params["parent_commit_hash"] = parentCommitHash.String() @@ -79,7 +79,7 @@ params["patch"] = patch params["file_patches"] = makeUsableFilePatches(patch) - renderTemplate(writer, "repo_commit", params) + s.renderTemplate(writer, "repo_commit", params) } type fakeDiffFile struct { diff --git a/http_handle_repo_contrib_index.go b/http_handle_repo_contrib_index.go index b83dfcb11832738a6a82e13ff5773c5607973f92..7bdcb49098403ddce48f243a162fd98e0b4b91fc 100644 --- a/http_handle_repo_contrib_index.go +++ b/http_handle_repo_contrib_index.go @@ -28,7 +28,7 @@ if rows, err = s.database.Query(request.Context(), "SELECT repo_local_id, COALESCE(title, 'Untitled'), status FROM merge_requests WHERE repo_id = $1", params["repo_id"], ); err != nil { - web.ErrorPage500(templates, writer, params, "Error querying merge requests: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error querying merge requests: "+err.Error()) return } defer rows.Close() @@ -37,16 +37,16 @@ for rows.Next() { var mrID int var mrTitle, mrStatus string if err = rows.Scan(&mrID, &mrTitle, &mrStatus); err != nil { - web.ErrorPage500(templates, writer, params, "Error scanning merge request: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error scanning merge request: "+err.Error()) return } result = append(result, idTitleStatus{mrID, mrTitle, mrStatus}) } if err = rows.Err(); err != nil { - web.ErrorPage500(templates, writer, params, "Error ranging over merge requests: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error ranging over merge requests: "+err.Error()) return } params["merge_requests"] = result - renderTemplate(writer, "repo_contrib_index", params) + s.renderTemplate(writer, "repo_contrib_index", params) } diff --git a/http_handle_repo_contrib_one.go b/http_handle_repo_contrib_one.go index dac58d0afa1b6f1967367a9b4a431375f3b3daca..280dca80da120c597eca3abdd96adb844c7026e0 100644 --- a/http_handle_repo_contrib_one.go +++ b/http_handle_repo_contrib_one.go @@ -29,7 +29,7 @@ mrIDStr = params["mr_id"].(string) mrIDInt64, err := strconv.ParseInt(mrIDStr, 10, strconv.IntSize) if err != nil { - web.ErrorPage400(templates, writer, params, "Merge request ID not an integer") + web.ErrorPage400(s.templates, writer, params, "Merge request ID not an integer") return } mrIDInt = int(mrIDInt64) @@ -38,18 +38,18 @@ if err = s.database.QueryRow(request.Context(), "SELECT COALESCE(title, ''), status, source_ref, COALESCE(destination_branch, '') FROM merge_requests WHERE repo_id = $1 AND repo_local_id = $2", params["repo_id"], mrIDInt, ).Scan(&title, &status, &srcRefStr, &dstBranchStr); err != nil { - web.ErrorPage500(templates, writer, params, "Error querying merge request: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error querying merge request: "+err.Error()) return } repo = params["repo"].(*git.Repository) if srcRefHash, err = getRefHash(repo, "branch", srcRefStr); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting source ref hash: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting source ref hash: "+err.Error()) return } if srcCommit, err = repo.CommitObject(srcRefHash); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting source commit: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting source commit: "+err.Error()) return } params["source_commit"] = srcCommit @@ -61,23 +61,23 @@ } else { dstBranchHash, err = getRefHash(repo, "branch", dstBranchStr) } if err != nil { - web.ErrorPage500(templates, writer, params, "Error getting destination branch hash: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting destination branch hash: "+err.Error()) return } if dstCommit, err = repo.CommitObject(dstBranchHash); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting destination commit: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting destination commit: "+err.Error()) return } params["destination_commit"] = dstCommit if mergeBases, err = srcCommit.MergeBase(dstCommit); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting merge base: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting merge base: "+err.Error()) return } if len(mergeBases) < 1 { - web.ErrorPage500(templates, writer, params, "No merge base found for this merge request; these two branches do not share any common history") + web.ErrorPage500(s.templates, writer, params, "No merge base found for this merge request; these two branches do not share any common history") // TODO return } @@ -87,12 +87,12 @@ params["merge_base"] = mergeBaseCommit patch, err := mergeBaseCommit.Patch(srcCommit) if err != nil { - web.ErrorPage500(templates, writer, params, "Error getting patch: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting patch: "+err.Error()) return } params["file_patches"] = makeUsableFilePatches(patch) params["mr_title"], params["mr_status"], params["mr_source_ref"], params["mr_destination_branch"] = title, status, srcRefStr, dstBranchStr - renderTemplate(writer, "repo_contrib_one", params) + s.renderTemplate(writer, "repo_contrib_one", params) } diff --git a/http_handle_repo_index.go b/http_handle_repo_index.go index bb5d57e7b59223739eead553ad9dd3cadb067a07..b564286dedf6204e8c74bf4ab938d48428bca58b 100644 --- a/http_handle_repo_index.go +++ b/http_handle_repo_index.go @@ -20,14 +20,14 @@ _, repoPath, _, _, _, _, _ := s.getRepoInfo(req.Context(), groupPath, repoName, "") // TODO: Don't use getRepoInfo client, err := git2c.NewClient(s.config.Git.Socket) if err != nil { - web.ErrorPage500(templates, w, params, err.Error()) + web.ErrorPage500(s.templates, w, params, err.Error()) return } defer client.Close() commits, readme, err := client.Cmd1(repoPath) if err != nil { - web.ErrorPage500(templates, w, params, err.Error()) + web.ErrorPage500(s.templates, w, params, err.Error()) return } @@ -35,7 +35,7 @@ params["commits"] = commits params["readme_filename"] = readme.Filename _, params["readme"] = render.Readme(readme.Content, readme.Filename) - renderTemplate(w, "repo_index", params) + s.renderTemplate(w, "repo_index", params) // TODO: Caching } diff --git a/http_handle_repo_log.go b/http_handle_repo_log.go index 14fe84c9ee80fc1b9d93270ad9b8e0a3dd8b33fe..fbc747899ee0fa657e397b085c894825d3c20a54 100644 --- a/http_handle_repo_log.go +++ b/http_handle_repo_log.go @@ -15,7 +15,7 @@ // httpHandleRepoLog provides a page with a complete Git log. // // TODO: This currently provides all commits in the branch. It should be // paginated and cached instead. -func httpHandleRepoLog(writer http.ResponseWriter, _ *http.Request, params map[string]any) { +func (s *Server) httpHandleRepoLog(writer http.ResponseWriter, _ *http.Request, params map[string]any) { var repo *git.Repository var refHash plumbing.Hash var err error @@ -23,17 +23,17 @@ repo = params["repo"].(*git.Repository) if refHash, err = getRefHash(repo, params["ref_type"].(string), params["ref_name"].(string)); err != nil { - web.ErrorPage500(templates, writer, params, "Error getting ref hash: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting ref hash: "+err.Error()) return } logOptions := git.LogOptions{From: refHash} //exhaustruct:ignore commitIter, err := repo.Log(&logOptions) if err != nil { - web.ErrorPage500(templates, writer, params, "Error getting recent commits: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting recent commits: "+err.Error()) return } params["commits"], params["commits_err"] = commitIterSeqErr(commitIter) - renderTemplate(writer, "repo_log", params) + s.renderTemplate(writer, "repo_log", params) } diff --git a/http_handle_repo_raw.go b/http_handle_repo_raw.go index c7f5653c53b3d8af7f08fc3a7137365b9e1a106a..286cbdf345a6a84d7a66f7110e65ec5f56922230 100644 --- a/http_handle_repo_raw.go +++ b/http_handle_repo_raw.go @@ -27,14 +27,14 @@ _, repoPath, _, _, _, _, _ := s.getRepoInfo(request.Context(), groupPath, repoName, "") client, err := git2c.NewClient(s.config.Git.Socket) if err != nil { - web.ErrorPage500(templates, writer, params, err.Error()) + web.ErrorPage500(s.templates, writer, params, err.Error()) return } defer client.Close() files, content, err := client.Cmd2(repoPath, pathSpec) if err != nil { - web.ErrorPage500(templates, writer, params, err.Error()) + web.ErrorPage500(s.templates, writer, params, err.Error()) return } @@ -43,7 +43,7 @@ case files != nil: params["files"] = files params["readme_filename"] = "README.md" params["readme"] = template.HTML("

README rendering here is WIP again

") // TODO - renderTemplate(writer, "repo_raw_dir", params) + s.renderTemplate(writer, "repo_raw_dir", params) case content != "": if misc.RedirectNoDir(writer, request) { return @@ -51,6 +51,6 @@ } writer.Header().Set("Content-Type", "application/octet-stream") fmt.Fprint(writer, content) default: - web.ErrorPage500(templates, writer, params, "Unknown error fetching repo raw data") + web.ErrorPage500(s.templates, writer, params, "Unknown error fetching repo raw data") } } diff --git a/http_handle_repo_tree.go b/http_handle_repo_tree.go index b855fe454b65cbb77a3950f461697f44c5eaefe0..d127e5dc48c47978c466cb3ae193e3c08270d38a 100644 --- a/http_handle_repo_tree.go +++ b/http_handle_repo_tree.go @@ -28,14 +28,14 @@ _, repoPath, _, _, _, _, _ := s.getRepoInfo(request.Context(), groupPath, repoName, "") client, err := git2c.NewClient(s.config.Git.Socket) if err != nil { - web.ErrorPage500(templates, writer, params, err.Error()) + web.ErrorPage500(s.templates, writer, params, err.Error()) return } defer client.Close() files, content, err := client.Cmd2(repoPath, pathSpec) if err != nil { - web.ErrorPage500(templates, writer, params, err.Error()) + web.ErrorPage500(s.templates, writer, params, err.Error()) return } @@ -44,12 +44,12 @@ case files != nil: params["files"] = files params["readme_filename"] = "README.md" params["readme"] = template.HTML("

README rendering here is WIP again

") // TODO - renderTemplate(writer, "repo_tree_dir", params) + s.renderTemplate(writer, "repo_tree_dir", params) case content != "": rendered := render.Highlight(pathSpec, content) params["file_contents"] = rendered - renderTemplate(writer, "repo_tree_file", params) + s.renderTemplate(writer, "repo_tree_file", params) default: - web.ErrorPage500(templates, writer, params, "Unknown object type, something is seriously wrong") + web.ErrorPage500(s.templates, writer, params, "Unknown object type, something is seriously wrong") } } diff --git a/http_handle_users.go b/http_handle_users.go index ce6c0457d784d731aab8f987a61388409d3b641b..816d7032b8aafb1a97f44d88877b030c4f4dd7b9 100644 --- a/http_handle_users.go +++ b/http_handle_users.go @@ -10,6 +10,6 @@ "go.lindenii.runxiyu.org/forge/internal/web" ) // httpHandleUsers is a useless stub. -func httpHandleUsers(writer http.ResponseWriter, _ *http.Request, params map[string]any) { - web.ErrorPage501(templates, writer, params) +func (s *Server) httpHandleUsers(writer http.ResponseWriter, _ *http.Request, params map[string]any) { + web.ErrorPage501(s.templates, writer, params) } diff --git a/http_server.go b/http_server.go index b2c93b94fb8dd9e6b1a36cf47ea2580166ff9f47..717f223dc76cde89e3bde6b9d380d6db5226c63a 100644 --- a/http_server.go +++ b/http_server.go @@ -40,7 +40,7 @@ var sepIndex int params := make(map[string]any) if segments, _, err = misc.ParseReqURI(request.RequestURI); err != nil { - web.ErrorPage400(templates, writer, params, "Error parsing request URI: "+err.Error()) + web.ErrorPage400(s.templates, writer, params, "Error parsing request URI: "+err.Error()) return } dirMode := false @@ -56,7 +56,7 @@ var userID int // 0 for none userID, params["username"], err = s.getUserFromRequest(request) params["user_id"] = userID if err != nil && !errors.Is(err, http.ErrNoCookie) && !errors.Is(err, pgx.ErrNoRows) { - web.ErrorPage500(templates, writer, params, "Error getting user info from request: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error getting user info from request: "+err.Error()) return } @@ -68,7 +68,7 @@ } for _, v := range segments { if strings.Contains(v, ":") { - web.ErrorPage400Colon(templates, writer, params) + web.ErrorPage400Colon(s.templates, writer, params) return } } @@ -80,7 +80,7 @@ } if segments[0] == "-" { if len(segments) < 2 { - web.ErrorPage404(templates, writer, params) + web.ErrorPage404(s.templates, writer, params) return } else if len(segments) == 2 && misc.RedirectDir(writer, request) { return @@ -102,10 +102,10 @@ case "login": s.httpHandleLogin(writer, request, params) return case "users": - httpHandleUsers(writer, request, params) + s.httpHandleUsers(writer, request, params) return default: - web.ErrorPage404(templates, writer, params) + web.ErrorPage404(s.templates, writer, params) return } } @@ -138,10 +138,10 @@ return } s.httpHandleGroupIndex(writer, request, params) case len(segments) == sepIndex+1: - web.ErrorPage404(templates, writer, params) + web.ErrorPage404(s.templates, writer, params) return case len(segments) == sepIndex+2: - web.ErrorPage404(templates, writer, params) + web.ErrorPage404(s.templates, writer, params) return default: moduleType = segments[sepIndex+1] @@ -154,12 +154,12 @@ if len(segments) > sepIndex+3 { switch segments[sepIndex+3] { case "info": if err = s.httpHandleRepoInfo(writer, request, params); err != nil { - web.ErrorPage500(templates, writer, params, err.Error()) + web.ErrorPage500(s.templates, writer, params, err.Error()) } return case "git-upload-pack": if err = s.httpHandleUploadPack(writer, request, params); err != nil { - web.ErrorPage500(templates, writer, params, err.Error()) + web.ErrorPage500(s.templates, writer, params, err.Error()) } return } @@ -169,13 +169,13 @@ if params["ref_type"], params["ref_name"], err = misc.GetParamRefTypeName(request); err != nil { if errors.Is(err, misc.ErrNoRefSpec) { params["ref_type"] = "" } else { - web.ErrorPage400(templates, writer, params, "Error querying ref type: "+err.Error()) + web.ErrorPage400(s.templates, writer, params, "Error querying ref type: "+err.Error()) return } } if params["repo"], params["repo_description"], params["repo_id"], _, err = s.openRepo(request.Context(), groupPath, moduleName); err != nil { - web.ErrorPage500(templates, writer, params, "Error opening repo: "+err.Error()) + web.ErrorPage500(s.templates, writer, params, "Error opening repo: "+err.Error()) return } @@ -200,7 +200,7 @@ repoFeature := segments[sepIndex+3] switch repoFeature { case "tree": if misc.AnyContain(segments[sepIndex+4:], "/") { - web.ErrorPage400(templates, writer, params, "Repo tree paths may not contain slashes in any segments") + web.ErrorPage400(s.templates, writer, params, "Repo tree paths may not contain slashes in any segments") return } if dirMode { @@ -220,7 +220,7 @@ s.httpHandleRepoBranches(writer, request, params) return case "raw": if misc.AnyContain(segments[sepIndex+4:], "/") { - web.ErrorPage400(templates, writer, params, "Repo tree paths may not contain slashes in any segments") + web.ErrorPage400(s.templates, writer, params, "Repo tree paths may not contain slashes in any segments") return } if dirMode { @@ -234,23 +234,23 @@ } s.httpHandleRepoRaw(writer, request, params) case "log": if len(segments) > sepIndex+4 { - web.ErrorPage400(templates, writer, params, "Too many parameters") + web.ErrorPage400(s.templates, writer, params, "Too many parameters") return } if misc.RedirectDir(writer, request) { return } - httpHandleRepoLog(writer, request, params) + s.httpHandleRepoLog(writer, request, params) case "commit": if len(segments) != sepIndex+5 { - web.ErrorPage400(templates, writer, params, "Incorrect number of parameters") + web.ErrorPage400(s.templates, writer, params, "Incorrect number of parameters") return } if misc.RedirectNoDir(writer, request) { return } params["commit_id"] = segments[sepIndex+4] - httpHandleRepoCommit(writer, request, params) + s.httpHandleRepoCommit(writer, request, params) case "contrib": if misc.RedirectDir(writer, request) { return @@ -262,14 +262,14 @@ case sepIndex + 5: params["mr_id"] = segments[sepIndex+4] s.httpHandleRepoContribOne(writer, request, params) default: - web.ErrorPage400(templates, writer, params, "Too many parameters") + web.ErrorPage400(s.templates, writer, params, "Too many parameters") } default: - web.ErrorPage404(templates, writer, params) + web.ErrorPage404(s.templates, writer, params) return } default: - web.ErrorPage404(templates, writer, params) + web.ErrorPage404(s.templates, writer, params) return } } diff --git a/http_template.go b/http_template.go index f60f0261bf13e198d8f13e87ad270d1b6d3f08ef..d6af9fbb69bff6fbb4e8ae35ee078cc767c6798a 100644 --- a/http_template.go +++ b/http_template.go @@ -10,8 +10,8 @@ ) // renderTemplate abstracts out the annoyances of reporting template rendering // errors. -func renderTemplate(w http.ResponseWriter, templateName string, params map[string]any) { - if err := templates.ExecuteTemplate(w, templateName, params); err != nil { +func (s *Server) renderTemplate(w http.ResponseWriter, templateName string, params map[string]any) { + if err := s.templates.ExecuteTemplate(w, templateName, params); err != nil { http.Error(w, "error rendering template: "+err.Error(), http.StatusInternalServerError) slog.Error("error rendering template", "error", err.Error()) } diff --git a/resources.go b/resources.go index e2168a3bf37d4686697cf272c705a6c98bb16409..514c0ae30c165c22066caa3adf67f21357be924f 100644 --- a/resources.go +++ b/resources.go @@ -20,10 +20,8 @@ //go:embed templates/* static/* //go:embed hookc/hookc git2d/git2d var embeddedResourcesFS embed.FS -var templates *template.Template //nolint:gochecknoglobals - // loadTemplates minifies and loads HTML templates. -func loadTemplates() (err error) { +func (s *Server) loadTemplates() (err error) { minifier := minify.New() minifierOptions := html.Minifier{ TemplateDelims: [2]string{"{{", "}}"}, @@ -31,7 +29,7 @@ KeepDefaultAttrVals: true, } //exhaustruct:ignore minifier.Add("text/html", &minifierOptions) - templates = template.New("templates").Funcs(template.FuncMap{ + s.templates = template.New("templates").Funcs(template.FuncMap{ "first_line": misc.FirstLine, "path_escape": misc.PathEscape, "query_escape": misc.QueryEscape, @@ -54,7 +52,7 @@ if err != nil { return err } - _, err = templates.Parse(misc.BytesToString(minified)) + _, err = s.templates.Parse(misc.BytesToString(minified)) if err != nil { return err } diff --git a/server.go b/server.go index 90b2e2e5d97ef87fd2432fc9bb1cbaa1371acced..feab082de9f18c24ddf0251de6b4ce3e83788e6a 100644 --- a/server.go +++ b/server.go @@ -5,6 +5,7 @@ package forge import ( "errors" + "html/template" "io/fs" "log" "log/slog" @@ -40,6 +41,8 @@ serverPubkey goSSH.PublicKey // packPasses contains hook cookies mapped to their packPass. packPasses cmap.Map[string, packPass] + + templates *template.Template } func (s *Server) Setup() { @@ -65,7 +68,7 @@ if err := s.deployHooks(); err != nil { slog.Error("deploying hooks", "error", err) os.Exit(1) } - if err := loadTemplates(); err != nil { + if err := s.loadTemplates(); err != nil { slog.Error("loading templates", "error", err) os.Exit(1) } -- 2.48.1