From 44626e60bf2bac53e2e3988874d310e7882eaabf Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 21 Mar 2025 16:55:53 +0800 Subject: [PATCH] Output git logs incrementally --- git_misc.go | 35 +++++++++++++++++++++++++++++++++++ http_handle_repo_index.go | 9 ++++++--- http_template_funcs.go | 4 ++++ resources.go | 9 +++++---- templates/repo_index.tmpl | 3 +++ templates/repo_log.tmpl | 3 +++ diff --git a/git_misc.go b/git_misc.go index cd2dc4dc4a8dcd42b0d49e792c069195eedf9e10..5b199650fd2d1b13e9000977bd3b0c9902fd4041 100644 --- a/git_misc.go +++ b/git_misc.go @@ -7,6 +7,7 @@ import ( "context" "errors" "io" + "iter" "os" "strings" @@ -94,6 +95,40 @@ displayTree = append(displayTree, displayEntry) } return displayTree +} + +func commitIterSeqErr(commitIter object.CommitIter) (iter.Seq[*object.Commit], *error) { + var err error + return func(yield func(*object.Commit) bool) { + for { + commit, err2 := commitIter.Next() + if err2 != nil { + if errors.Is(err2, io.EOF) { + return + } + err = err2 + return + } + if !yield(commit) { + return + } + } + }, &err +} + +func iterSeqLimit[T any](s iter.Seq[T], n uint) iter.Seq[T] { + return func(yield func(T) bool) { + var i uint + for v := range s { + if i > n-1 { + return + } + if !yield(v) { + return + } + i++ + } + } } func getRecentCommits(repo *git.Repository, headHash plumbing.Hash, numCommits int) (recentCommits []*object.Commit, err error) { diff --git a/http_handle_repo_index.go b/http_handle_repo_index.go index cb3fcdcbcb7f42111c9686e4ab083fd8194f609f..a22c75f9016937029e2e8aadd317d888480b5387 100644 --- a/http_handle_repo_index.go +++ b/http_handle_repo_index.go @@ -4,6 +4,7 @@ package main import ( + "iter" "net/http" "strings" @@ -19,7 +20,8 @@ var repoName string var groupPath []string var refHash plumbing.Hash var err error - var recentCommits []*object.Commit + var commitIter object.CommitIter + var commitIterSeq iter.Seq[*object.Commit] var commitObj *object.Commit var tree *object.Tree var notes []string @@ -46,10 +48,11 @@ }) } params["branches"] = branches - if recentCommits, err = getRecentCommits(repo, refHash, 3); err != nil { + if commitIter, err = repo.Log(&git.LogOptions{From: refHash}); err != nil { goto no_ref } - params["commits"] = recentCommits + commitIterSeq, params["commits_err"] = commitIterSeqErr(commitIter) + params["commits"] = iterSeqLimit(commitIterSeq, 3) if commitObj, err = repo.CommitObject(refHash); err != nil { goto no_ref diff --git a/http_template_funcs.go b/http_template_funcs.go index 9609e61971efb9bf65ba39fc943f4f745f9660f0..5395b92a4612f2b075d75c04ddbb4d0efd92c76f 100644 --- a/http_template_funcs.go +++ b/http_template_funcs.go @@ -25,3 +25,7 @@ func queryEscape(s string) string { return url.QueryEscape(s) } + +func dereference[T any](p *T) T { + return *p +} diff --git a/resources.go b/resources.go index c1b4a9b3be156ba02a07aa0ed14f89693cee649d..2576c12d4bf194868d160e1151e250638edcc5c6 100644 --- a/resources.go +++ b/resources.go @@ -40,10 +40,11 @@ m := minify.New() m.Add("text/html", &html.Minifier{TemplateDelims: [2]string{"{{", "}}"}, KeepDefaultAttrVals: true}) templates = template.New("templates").Funcs(template.FuncMap{ - "first_line": firstLine, - "base_name": baseName, - "path_escape": pathEscape, - "query_escape": queryEscape, + "first_line": firstLine, + "base_name": baseName, + "path_escape": pathEscape, + "query_escape": queryEscape, + "dereference_error": dereference[error], }) err = fs.WalkDir(resourcesFS, "templates", func(path string, d fs.DirEntry, err error) error { diff --git a/templates/repo_index.tmpl b/templates/repo_index.tmpl index 19814ccc8a038d39be81dc1694bad82742e998a1..d59e480416db268e4aabb8760fb2f7458fbcc8ca 100644 --- a/templates/repo_index.tmpl +++ b/templates/repo_index.tmpl @@ -90,6 +90,9 @@ {{- .Author.When.Format "2006-01-02 15:04:05 -0700" -}} {{- end -}} + {{- if dereference_error .commits_err -}} + Error while obtaining commit log: {{ .commits_err }} + {{- end -}} diff --git a/templates/repo_log.tmpl b/templates/repo_log.tmpl index 64e6783989551be8a2dd9ba72b1245fc323726a7..ac5f5549e14b666ecc2c1dda49101a6e1c76f7c7 100644 --- a/templates/repo_log.tmpl +++ b/templates/repo_log.tmpl @@ -37,6 +37,9 @@ {{- .Author.When.Format "2006-01-02 15:04:05 -0700" -}} {{- end -}} + {{- if dereference_error .commits_err -}} + Error while obtaining commit log: {{ .commits_err }} + {{- end -}} -- 2.48.1