aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--git_misc.go35
-rw-r--r--http_handle_repo_index.go9
-rw-r--r--http_template_funcs.go4
-rw-r--r--resources.go9
-rw-r--r--templates/repo_index.tmpl3
-rw-r--r--templates/repo_log.tmpl3
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>