1diff --git a/pkg/git/git.go b/pkg/git/git.go
2index ad5d3bca28fe075da5da0ea6ae72cb87bd09861a..428bfb164e78ca7e8055097fbe77a31b985e5da4 100644
3--- a/pkg/git/git.go
4+++ b/pkg/git/git.go
5@@ -107,14 +107,14 @@ func (g *GitRepository) Head() (*plumbing.Reference, error) {
6 return g.repository.Head()
7 }
8
9-func (g *GitRepository) Tags() ([]*object.Tag, error) {
10- ti, err := g.repository.TagObjects()
11+func (g *GitRepository) Tags() ([]*plumbing.Reference, error) {
12+ ti, err := g.repository.Tags()
13 if err != nil {
14 return nil, err
15 }
16
17- tags := []*object.Tag{}
18- err = ti.ForEach(func(t *object.Tag) error {
19+ tags := []*plumbing.Reference{}
20+ err = ti.ForEach(func(t *plumbing.Reference) error {
21 tags = append(tags, t)
22 return nil
23 })
24diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
25index b4c7c5481ede247f1e2f67f7b9aa4c2ca6373863..48093629296b5531caef1fe0e4736576b205fca6 100644
26--- a/pkg/handler/git/handler.go
27+++ b/pkg/handler/git/handler.go
28@@ -33,7 +33,7 @@ ListCommits(name string, ref string) ([]*object.Commit, error)
29 GetHead(name string) (*plumbing.Reference, error)
30 GetTree(name, ref, path string) (*object.Tree, error)
31 GetFileContent(name, ref, path string) (string, error)
32- ListTags(name string) ([]*object.Tag, error)
33+ ListTags(name string) ([]*plumbing.Reference, error)
34 ListBranches(name string) ([]*plumbing.Reference, error)
35 }
36
37diff --git a/pkg/service/git.go b/pkg/service/git.go
38index 0907924cf24789e3a8f5a558231b7af319e409d1..071e10d640e86887901e442c608f898fa6058ffe 100644
39--- a/pkg/service/git.go
40+++ b/pkg/service/git.go
41@@ -128,7 +128,7 @@
42 return repo.FileContent(path)
43 }
44
45-func (g *GitService) ListTags(name string) ([]*object.Tag, error) {
46+func (g *GitService) ListTags(name string) ([]*plumbing.Reference, error) {
47 r := g.configRepo.GetByName(name)
48 if r == nil {
49 return nil, RepositoryNotFoundErr
50diff --git a/scss/main.scss b/scss/main.scss
51index 5500a383ec0e462a371173601b8a19e63e0820a0..af8a00210b514e60d9459176b42217b525a24b92 100644
52--- a/scss/main.scss
53+++ b/scss/main.scss
54@@ -58,8 +58,14 @@ values: (
55 start: left,
56 end: right,
57 center: center,
58- )
59-),
60+ )
61+ ),
62+ "margin-end": (
63+ responsive: true,
64+ property: margin-right,
65+ class: me,
66+ values: map-merge($spacers, (auto: auto))
67+ ),
68 );
69
70 @import "bootstrap/scss/utilities/_api.scss";
71diff --git a/templates/gititemrefs.qtpl b/templates/gititemrefs.qtpl
72index 47a69e32967bc8e90fd2595efa487ff71380d593..09d7446a2dfa524db36d016a9ffcffafc57d504b 100644
73--- a/templates/gititemrefs.qtpl
74+++ b/templates/gititemrefs.qtpl
75@@ -1,9 +1,8 @@
76 {% import "github.com/go-git/go-git/v5/plumbing" %}
77-{% import "github.com/go-git/go-git/v5/plumbing/object" %}
78
79 {% code
80 type GitItemRefsPage struct {
81- Tags []*object.Tag
82+ Tags []*plumbing.Reference
83 Branches []*plumbing.Reference
84 }
85 %}
86@@ -13,21 +12,25 @@
87 {% func (g *GitItemRefsPage) GitContent(name, ref string) %}
88 <div class="row">
89 <div class="col-md-8">
90+ {% if len(g.Tags) > 0 %}
91 <div class="event-list">
92 {% for _, t := range g.Tags %}
93- <div class="row event">
94- <div class="col-xxl-2">
95- {%s TimeFormat(t.Tagger.When) %}
96+ <div class="row event me-md-2">
97+ <div class="col-4">
98+ {%s t.Name().Short() %}
99 </div>
100- <div class="col-xxl-7">
101- <pre>{%s t.Message %}</pre>
102- </div>
103- <div class="col-xxl-3">
104- <small>{%s t.Tagger.Name %}</small>
105+ <div class="col-8">
106+ <div class="float-end">
107+ <a href="/{%s name %}/tree/{%s t.Name().Short() %}">tree</a>
108+ <a href="/{%s name %}/log/{%s t.Name().Short() %}">log</a>
109+ </div>
110 </div>
111 </div>
112 {% endfor %}
113 </div>
114+ {% else %}
115+ <p> No tags </p>
116+ {% endif %}
117 </div>
118 <div class="col-md-4">
119 <div class="event-list">
120diff --git a/templates/gititemrefs.qtpl.go b/templates/gititemrefs.qtpl.go
121index 95dd31a0114a36ee774711c902dea4bf809bc2df..62c1725248bccf069a7ab9b0f1fa10816fb1bc90 100644
122--- a/templates/gititemrefs.qtpl.go
123+++ b/templates/gititemrefs.qtpl.go
124@@ -7,175 +7,196 @@
125 //line gititemrefs.qtpl:1
126 import "github.com/go-git/go-git/v5/plumbing"
127
128-//line gititemrefs.qtpl:2
129-import "github.com/go-git/go-git/v5/plumbing/object"
130-
131-//line gititemrefs.qtpl:4
132+//line gititemrefs.qtpl:3
133 import (
134 qtio422016 "io"
135
136 qt422016 "github.com/valyala/quicktemplate"
137 )
138
139-//line gititemrefs.qtpl:4
140+//line gititemrefs.qtpl:3
141 var (
142 _ = qtio422016.Copy
143 _ = qt422016.AcquireByteBuffer
144 )
145
146-//line gititemrefs.qtpl:5
147+//line gititemrefs.qtpl:4
148 type GitItemRefsPage struct {
149- Tags []*object.Tag
150+ Tags []*plumbing.Reference
151 Branches []*plumbing.Reference
152 }
153
154-//line gititemrefs.qtpl:11
155+//line gititemrefs.qtpl:10
156 func (g *GitItemRefsPage) StreamNav(qw422016 *qt422016.Writer, name, ref string) {
157-//line gititemrefs.qtpl:11
158+//line gititemrefs.qtpl:10
159 StreamGitItemNav(qw422016, name, ref, Refs)
160-//line gititemrefs.qtpl:11
161+//line gititemrefs.qtpl:10
162 }
163
164-//line gititemrefs.qtpl:11
165+//line gititemrefs.qtpl:10
166 func (g *GitItemRefsPage) WriteNav(qq422016 qtio422016.Writer, name, ref string) {
167-//line gititemrefs.qtpl:11
168+//line gititemrefs.qtpl:10
169 qw422016 := qt422016.AcquireWriter(qq422016)
170-//line gititemrefs.qtpl:11
171+//line gititemrefs.qtpl:10
172 g.StreamNav(qw422016, name, ref)
173-//line gititemrefs.qtpl:11
174+//line gititemrefs.qtpl:10
175 qt422016.ReleaseWriter(qw422016)
176-//line gititemrefs.qtpl:11
177+//line gititemrefs.qtpl:10
178 }
179
180-//line gititemrefs.qtpl:11
181+//line gititemrefs.qtpl:10
182 func (g *GitItemRefsPage) Nav(name, ref string) string {
183-//line gititemrefs.qtpl:11
184+//line gititemrefs.qtpl:10
185 qb422016 := qt422016.AcquireByteBuffer()
186-//line gititemrefs.qtpl:11
187+//line gititemrefs.qtpl:10
188 g.WriteNav(qb422016, name, ref)
189-//line gititemrefs.qtpl:11
190+//line gititemrefs.qtpl:10
191 qs422016 := string(qb422016.B)
192-//line gititemrefs.qtpl:11
193+//line gititemrefs.qtpl:10
194 qt422016.ReleaseByteBuffer(qb422016)
195-//line gititemrefs.qtpl:11
196+//line gititemrefs.qtpl:10
197 return qs422016
198-//line gititemrefs.qtpl:11
199+//line gititemrefs.qtpl:10
200 }
201
202-//line gititemrefs.qtpl:13
203+//line gititemrefs.qtpl:12
204 func (g *GitItemRefsPage) StreamGitContent(qw422016 *qt422016.Writer, name, ref string) {
205-//line gititemrefs.qtpl:13
206+//line gititemrefs.qtpl:12
207 qw422016.N().S(`
208 <div class="row">
209 <div class="col-md-8">
210+ `)
211+//line gititemrefs.qtpl:15
212+ if len(g.Tags) > 0 {
213+//line gititemrefs.qtpl:15
214+ qw422016.N().S(`
215 <div class="event-list">
216 `)
217 //line gititemrefs.qtpl:17
218- for _, t := range g.Tags {
219+ for _, t := range g.Tags {
220 //line gititemrefs.qtpl:17
221- qw422016.N().S(`
222- <div class="row event">
223- <div class="col-xxl-2">
224+ qw422016.N().S(`
225+ <div class="row event me-md-2">
226+ <div class="col-4">
227 `)
228 //line gititemrefs.qtpl:20
229- qw422016.E().S(TimeFormat(t.Tagger.When))
230+ qw422016.E().S(t.Name().Short())
231 //line gititemrefs.qtpl:20
232- qw422016.N().S(`
233+ qw422016.N().S(`
234 </div>
235- <div class="col-xxl-7">
236- <pre>`)
237-//line gititemrefs.qtpl:23
238- qw422016.E().S(t.Message)
239-//line gititemrefs.qtpl:23
240- qw422016.N().S(`</pre>
241- </div>
242- <div class="col-xxl-3">
243- <small>`)
244-//line gititemrefs.qtpl:26
245- qw422016.E().S(t.Tagger.Name)
246-//line gititemrefs.qtpl:26
247- qw422016.N().S(`</small>
248+ <div class="col-8">
249+ <div class="float-end">
250+ <a href="/`)
251+//line gititemrefs.qtpl:24
252+ qw422016.E().S(name)
253+//line gititemrefs.qtpl:24
254+ qw422016.N().S(`/tree/`)
255+//line gititemrefs.qtpl:24
256+ qw422016.E().S(t.Name().Short())
257+//line gititemrefs.qtpl:24
258+ qw422016.N().S(`">tree</a>
259+ <a href="/`)
260+//line gititemrefs.qtpl:25
261+ qw422016.E().S(name)
262+//line gititemrefs.qtpl:25
263+ qw422016.N().S(`/log/`)
264+//line gititemrefs.qtpl:25
265+ qw422016.E().S(t.Name().Short())
266+//line gititemrefs.qtpl:25
267+ qw422016.N().S(`">log</a>
268+ </div>
269 </div>
270 </div>
271 `)
272 //line gititemrefs.qtpl:29
273+ }
274+//line gititemrefs.qtpl:29
275+ qw422016.N().S(`
276+ </div>
277+ `)
278+//line gititemrefs.qtpl:31
279+ } else {
280+//line gititemrefs.qtpl:31
281+ qw422016.N().S(`
282+ <p> No tags </p>
283+ `)
284+//line gititemrefs.qtpl:33
285 }
286-//line gititemrefs.qtpl:29
287+//line gititemrefs.qtpl:33
288 qw422016.N().S(`
289- </div>
290 </div>
291 <div class="col-md-4">
292 <div class="event-list">
293 `)
294-//line gititemrefs.qtpl:34
295+//line gititemrefs.qtpl:37
296 for _, b := range g.Branches {
297-//line gititemrefs.qtpl:34
298+//line gititemrefs.qtpl:37
299 qw422016.N().S(`
300 <div class="row event">
301 <div class="col-4">
302 `)
303-//line gititemrefs.qtpl:37
304+//line gititemrefs.qtpl:40
305 qw422016.E().S(b.Name().Short())
306-//line gititemrefs.qtpl:37
307+//line gititemrefs.qtpl:40
308 qw422016.N().S(`
309 </div>
310 <div class="col-8">
311 <div class="float-end">
312 <a href="/`)
313-//line gititemrefs.qtpl:41
314+//line gititemrefs.qtpl:44
315 qw422016.E().S(name)
316-//line gititemrefs.qtpl:41
317+//line gititemrefs.qtpl:44
318 qw422016.N().S(`/tree/`)
319-//line gititemrefs.qtpl:41
320+//line gititemrefs.qtpl:44
321 qw422016.E().S(b.Name().Short())
322-//line gititemrefs.qtpl:41
323+//line gititemrefs.qtpl:44
324 qw422016.N().S(`">tree</a>
325 <a href="/`)
326-//line gititemrefs.qtpl:42
327+//line gititemrefs.qtpl:45
328 qw422016.E().S(name)
329-//line gititemrefs.qtpl:42
330+//line gititemrefs.qtpl:45
331 qw422016.N().S(`/log/`)
332-//line gititemrefs.qtpl:42
333+//line gititemrefs.qtpl:45
334 qw422016.E().S(b.Name().Short())
335-//line gititemrefs.qtpl:42
336+//line gititemrefs.qtpl:45
337 qw422016.N().S(`">log</a>
338 </div>
339 </div>
340 </div>
341 `)
342-//line gititemrefs.qtpl:46
343+//line gititemrefs.qtpl:49
344 }
345-//line gititemrefs.qtpl:46
346+//line gititemrefs.qtpl:49
347 qw422016.N().S(`
348 </div>
349 </div>
350 </div>
351 `)
352-//line gititemrefs.qtpl:50
353+//line gititemrefs.qtpl:53
354 }
355
356-//line gititemrefs.qtpl:50
357+//line gititemrefs.qtpl:53
358 func (g *GitItemRefsPage) WriteGitContent(qq422016 qtio422016.Writer, name, ref string) {
359-//line gititemrefs.qtpl:50
360+//line gititemrefs.qtpl:53
361 qw422016 := qt422016.AcquireWriter(qq422016)
362-//line gititemrefs.qtpl:50
363+//line gititemrefs.qtpl:53
364 g.StreamGitContent(qw422016, name, ref)
365-//line gititemrefs.qtpl:50
366+//line gititemrefs.qtpl:53
367 qt422016.ReleaseWriter(qw422016)
368-//line gititemrefs.qtpl:50
369+//line gititemrefs.qtpl:53
370 }
371
372-//line gititemrefs.qtpl:50
373+//line gititemrefs.qtpl:53
374 func (g *GitItemRefsPage) GitContent(name, ref string) string {
375-//line gititemrefs.qtpl:50
376+//line gititemrefs.qtpl:53
377 qb422016 := qt422016.AcquireByteBuffer()
378-//line gititemrefs.qtpl:50
379+//line gititemrefs.qtpl:53
380 g.WriteGitContent(qb422016, name, ref)
381-//line gititemrefs.qtpl:50
382+//line gititemrefs.qtpl:53
383 qs422016 := string(qb422016.B)
384-//line gititemrefs.qtpl:50
385+//line gititemrefs.qtpl:53
386 qt422016.ReleaseByteBuffer(qb422016)
387-//line gititemrefs.qtpl:50
388+//line gititemrefs.qtpl:53
389 return qs422016
390-//line gititemrefs.qtpl:50
391+//line gititemrefs.qtpl:53
392 }