From 669924e830df4fadaaa71691dc90942189598dc7 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 6 Apr 2025 11:07:36 +0800 Subject: HTTP: git log should stop on context done --- forged/internal/unsorted/git_misc.go | 10 +++++++++- forged/internal/unsorted/http_handle_repo_log.go | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/forged/internal/unsorted/git_misc.go b/forged/internal/unsorted/git_misc.go index ceda3d1..dd93726 100644 --- a/forged/internal/unsorted/git_misc.go +++ b/forged/internal/unsorted/git_misc.go @@ -67,7 +67,7 @@ WHERE g.depth = cardinality($1::text[]) // 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 @@ func commitIterSeqErr(commitIter object.CommitIter) (iter.Seq[*object.Commit], * 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 fa992b3..5d90871 100644 --- a/forged/internal/unsorted/http_handle_repo_log.go +++ b/forged/internal/unsorted/http_handle_repo_log.go @@ -15,7 +15,7 @@ import ( // // 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 @@ func (s *Server) httpHandleRepoLog(writer http.ResponseWriter, _ *http.Request, 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) } -- cgit v1.2.3