From 669924e830df4fadaaa71691dc90942189598dc7 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 06 Apr 2025 11:07:36 +0800 Subject: [PATCH] HTTP: git log should stop on context done --- forged/internal/unsorted/git_misc.go | 10 +++++++++- forged/internal/unsorted/http_handle_repo_log.go | 4 ++-- diff --git a/forged/internal/unsorted/git_misc.go b/forged/internal/unsorted/git_misc.go index ceda3d123e29e505d55068b2c6551d6580fdc569..dd93726b6a6b0cab0b796d9360b78f02016aac86 100644 --- a/forged/internal/unsorted/git_misc.go +++ b/forged/internal/unsorted/git_misc.go @@ -67,7 +67,7 @@ // [object.CommitIter], and additionally returns a pointer to error. // The pointer to error is guaranteed to be populated with either nil or the // error returned by the commit iterator after the returned iterator is // finished. -func commitIterSeqErr(commitIter object.CommitIter) (iter.Seq[*object.Commit], *error) { +func commitIterSeqErr(ctx context.Context, commitIter object.CommitIter) (iter.Seq[*object.Commit], *error) { var err error return func(yield func(*object.Commit) bool) { for { @@ -79,6 +79,14 @@ } err = err2 return } + + select { + case <-ctx.Done(): + err = ctx.Err() + return + default: + } + if !yield(commit) { return } diff --git a/forged/internal/unsorted/http_handle_repo_log.go b/forged/internal/unsorted/http_handle_repo_log.go index fa992b3f845a4c97ff93a349d4d788e86d3c15bd..5d9087165cfb4f7dd268272cc49caa8eb3c160a4 100644 --- a/forged/internal/unsorted/http_handle_repo_log.go +++ b/forged/internal/unsorted/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 (s *Server) httpHandleRepoLog(writer http.ResponseWriter, _ *http.Request, params map[string]any) { +func (s *Server) httpHandleRepoLog(writer http.ResponseWriter, req *http.Request, params map[string]any) { var repo *git.Repository var refHash plumbing.Hash var err error @@ -33,7 +33,7 @@ if err != nil { web.ErrorPage500(s.templates, writer, params, "Error getting recent commits: "+err.Error()) return } - params["commits"], params["commits_err"] = commitIterSeqErr(commitIter) + params["commits"], params["commits_err"] = commitIterSeqErr(req.Context(), commitIter) s.renderTemplate(writer, "repo_log", params) } -- 2.48.1