bidet

commit e627440a1bc80b93c0b3cabede4f05680ad96ab9

tree

parent:
4cda3b879627a0422d8884f8dd70e4d3e59e7015

nmyk <nick@nmyk.io>

2026-03-01T11:12:31-05:00

adds annotations to refs/tags page

sorts tags in reverse chronological order

diff --git a/internal/handlers/formatting.go b/internal/handlers/formatting.go
index 37cc7e2f529e5310c33143f7ebcbb0f9e108274f..e73959e58f88047130a8ed5efae9b1508745f823 100644
--- a/internal/handlers/formatting.go
+++ b/internal/handlers/formatting.go
@@ -9,14 +9,14 @@ func fmtAuthor(name string, email string) string {
 	return name + " <" + email + ">"
 }
 
-type Crumb struct {
+type crumb struct {
 	Name   string
 	URL    string
 	IsLast bool
 }
 
-func breadcrumbs(repoName string, refLabel string, p string) []Crumb {
-	var crumbs []Crumb
+func breadcrumbs(repoName string, refLabel string, p string) []crumb {
+	var crumbs []crumb
 	last := true
 	cur := p
 	for {
@@ -24,7 +24,7 @@ 		base := path.Base(cur)
 		if base == "." || base == "/" {
 			break
 		}
-		crumbs = append(crumbs, Crumb{
+		crumbs = append(crumbs, crumb{
 			Name:   base,
 			URL:    path.Join(repoName, "tree", refLabel, cur),
 			IsLast: last,
diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go
index 02671d9981532bd09e5dc6092300168e17c539fb..49ec5f8365ac11617947b660587767000d4d2848 100644
--- a/internal/handlers/handlers.go
+++ b/internal/handlers/handlers.go
@@ -153,7 +153,9 @@ 	Name string
 }
 
 type TagMeta struct {
-	Name string
+	Name       string
+	Annotation string
+	When       time.Time
 }
 
 type RefsData struct {
@@ -195,13 +197,32 @@ 		return
 	}
 	var tags []TagMeta
 	err = tagIter.ForEach(func(ref *plumbing.Reference) error {
-		tags = append(tags, TagMeta{ref.Name().Short()})
+		var t TagMeta
+		tagObj, err := repo.TagObject(ref.Hash())
+		switch err {
+		case nil:
+			t.Annotation = tagObj.Message
+			t.When = tagObj.Tagger.When
+		case plumbing.ErrObjectNotFound:
+			commit, err := repo.CommitObject(ref.Hash())
+			if err != nil {
+				return err
+			}
+			t.When = commit.Committer.When
+		default:
+			return err
+		}
+		t.Name = ref.Name().Short()
+		tags = append(tags, t)
 		return nil
 	})
 	if err != nil {
 		s.error(w, err)
 		return
 	}
+	slices.SortFunc(tags, func(a TagMeta, b TagMeta) int {
+		return -1 * a.When.Compare(b.When)
+	})
 	refType := r.PathValue("type")
 	if !slices.Contains([]string{"branches", "tags"}, refType) {
 		refType = "branches"
@@ -332,7 +353,7 @@ type BlobData struct {
 	Repo     string
 	RefLabel string
 	Path     string
-	Crumbs   []Crumb
+	Crumbs   []crumb
 	Content  string
 }
 
@@ -387,7 +408,7 @@ 	RefLabel   string
 	Commit     string
 	HeadRef    string
 	Path       string
-	Crumbs     []Crumb
+	Crumbs     []crumb
 	Entries    []EntryMeta
 	ReadmeName string
 	Readme     string
diff --git a/internal/handlers/templates/refs.tmpl b/internal/handlers/templates/refs.tmpl
index 1a2d878e194b02853a3df4d462c39a70a830bf8d..c058e830e6e559805c9f35b30972032e66776ba4 100644
--- a/internal/handlers/templates/refs.tmpl
+++ b/internal/handlers/templates/refs.tmpl
@@ -20,6 +20,7 @@     {{end}}
   {{else if eq .Type "tags"}}
     {{range .Tags}}
     <li><a href="/{{$.Repo}}/tree/{{.Name}}">{{.Name}}</a></li>
+    {{ if ne .Annotation "" }}<pre>{{ .Annotation }}</pre>{{ end }}
     {{end}}
   {{else}}
   {{end}}