diff options
author | Runxi Yu <me@runxiyu.org> | 2025-03-21 16:55:53 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-03-21 16:56:51 +0800 |
commit | 44626e60bf2bac53e2e3988874d310e7882eaabf (patch) | |
tree | 6e5e096fc6d568fb1c330e78508cef952e8c0d1a | |
parent | Bump Go version to 1.24.1 (diff) | |
download | forge-44626e60bf2bac53e2e3988874d310e7882eaabf.tar.gz forge-44626e60bf2bac53e2e3988874d310e7882eaabf.tar.zst forge-44626e60bf2bac53e2e3988874d310e7882eaabf.zip |
Output git logs incrementally
-rw-r--r-- | git_misc.go | 35 | ||||
-rw-r--r-- | http_handle_repo_index.go | 9 | ||||
-rw-r--r-- | http_template_funcs.go | 4 | ||||
-rw-r--r-- | resources.go | 9 | ||||
-rw-r--r-- | templates/repo_index.tmpl | 3 | ||||
-rw-r--r-- | templates/repo_log.tmpl | 3 |
6 files changed, 56 insertions, 7 deletions
diff --git a/git_misc.go b/git_misc.go index cd2dc4d..5b19965 100644 --- a/git_misc.go +++ b/git_misc.go @@ -7,6 +7,7 @@ import ( "context" "errors" "io" + "iter" "os" "strings" @@ -96,6 +97,40 @@ func makeDisplayTree(tree *object.Tree) (displayTree []displayTreeEntry) { 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) { var commitIter object.CommitIter var thisCommit *object.Commit diff --git a/http_handle_repo_index.go b/http_handle_repo_index.go index cb3fcdc..a22c75f 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 @@ func httpHandleRepoIndex(w http.ResponseWriter, r *http.Request, params map[stri 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 @@ func httpHandleRepoIndex(w http.ResponseWriter, r *http.Request, params map[stri } 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 9609e61..5395b92 100644 --- a/http_template_funcs.go +++ b/http_template_funcs.go @@ -25,3 +25,7 @@ func pathEscape(s string) string { 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 c1b4a9b..2576c12 100644 --- a/resources.go +++ b/resources.go @@ -40,10 +40,11 @@ func loadTemplates() (err error) { 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 19814cc..d59e480 100644 --- a/templates/repo_index.tmpl +++ b/templates/repo_index.tmpl @@ -90,6 +90,9 @@ </td> </tr> {{- end -}} + {{- if dereference_error .commits_err -}} + Error while obtaining commit log: {{ .commits_err }} + {{- end -}} </tbody> </table> </div> diff --git a/templates/repo_log.tmpl b/templates/repo_log.tmpl index 64e6783..ac5f554 100644 --- a/templates/repo_log.tmpl +++ b/templates/repo_log.tmpl @@ -37,6 +37,9 @@ </td> </tr> {{- end -}} + {{- if dereference_error .commits_err -}} + Error while obtaining commit log: {{ .commits_err }} + {{- end -}} </tbody> </table> </div> |