1diff --git a/pkg/service/git.go b/pkg/service/git.go
2index 2d00715f57ab9553c54a3d02a88bb8feb34cb817..773d335d0d1694bf104f94455ccc6943dce9b07f 100644
3--- a/pkg/service/git.go
4+++ b/pkg/service/git.go
5@@ -15,11 +15,11 @@ )
6
7 type (
8 Repository struct {
9- Name string
10- Description string
11- Public bool
12- LastCommitDate string
13- Ref string
14+ Name string
15+ Description string
16+ Public bool
17+ LastCommit *object.Commit
18+ Ref string
19 }
20
21 GitService struct {
22@@ -70,11 +70,11 @@ continue
23 }
24
25 repos = append(repos, &Repository{
26- Name: r.Name,
27- Description: r.Description,
28- Public: r.Public,
29- LastCommitDate: obj.Author.When.Format(timeFormat),
30- Ref: head.Name().Short(),
31+ Name: r.Name,
32+ Description: r.Description,
33+ Public: r.Public,
34+ LastCommit: obj,
35+ Ref: head.Name().Short(),
36 })
37 }
38
39diff --git a/templates/gitlist.qtpl b/templates/gitlist.qtpl
40index fc047ebf4a7f8946462124d017d6d9def0c9f76c..4f25fc674af9952f5c95f91baedce34301e0c19e 100644
41--- a/templates/gitlist.qtpl
42+++ b/templates/gitlist.qtpl
43@@ -1,10 +1,21 @@
44 {% import "git.gabrielgio.me/cerrado/pkg/service" %}
45 {% import "context" %}
46+{% import "strings" %}
47
48 {% code
49 type GitListPage struct {
50 Respositories []*service.Repository
51 About []byte
52+}
53+%}
54+
55+
56+{% code func firstLine(text string) string {
57+ lines := strings.Split(text, "\n")
58+ if len(lines) > 0 {
59+ return lines[0]
60+ }
61+ return ""
62 }
63 %}
64
65@@ -28,6 +39,10 @@ </div>
66 </div>
67 </hr>
68 <p>{%s r.Description %}</p>
69+ <p style="background: #dadada">
70+ <a title="{%s r.LastCommit.Hash.String() %}" href="/{%s r.Name %}/commit/{%s r.LastCommit.Hash.String() %}/">{%s r.LastCommit.Hash.String()[0:8] %}</a> -
71+ <a title="{%s r.LastCommit.Author.Email %}">{%s r.LastCommit.Author.Name %}</a> -
72+ {%s firstLine(r.LastCommit.Message) %}</p>
73 <p>
74 <a href="/{%s r.Name %}/log/{%s r.Ref %}/">log</a>
75 <a href="/{%s r.Name %}/tree/{%s r.Ref %}/">tree</a>
76diff --git a/templates/gitlist.qtpl.go b/templates/gitlist.qtpl.go
77index 07e5567039df5840d9c40d821cc6d60c88bec6b0..f3df84f80a4dac96623865d413e62b51598d25aa 100644
78--- a/templates/gitlist.qtpl.go
79+++ b/templates/gitlist.qtpl.go
80@@ -10,172 +10,216 @@
81 //line templates/gitlist.qtpl:2
82 import "context"
83
84-//line templates/gitlist.qtpl:4
85+//line templates/gitlist.qtpl:3
86+import "strings"
87+
88+//line templates/gitlist.qtpl:5
89 import (
90 qtio422016 "io"
91
92 qt422016 "github.com/valyala/quicktemplate"
93 )
94
95-//line templates/gitlist.qtpl:4
96+//line templates/gitlist.qtpl:5
97 var (
98 _ = qtio422016.Copy
99 _ = qt422016.AcquireByteBuffer
100 )
101
102-//line templates/gitlist.qtpl:5
103+//line templates/gitlist.qtpl:6
104 type GitListPage struct {
105 Respositories []*service.Repository
106 About []byte
107 }
108
109-//line templates/gitlist.qtpl:11
110+//line templates/gitlist.qtpl:13
111+func firstLine(text string) string {
112+ lines := strings.Split(text, "\n")
113+ if len(lines) > 0 {
114+ return lines[0]
115+ }
116+ return ""
117+}
118+
119+//line templates/gitlist.qtpl:22
120 func (p *GitListPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
121-//line templates/gitlist.qtpl:11
122+//line templates/gitlist.qtpl:22
123 qw422016.N().S(`Git | List`)
124-//line templates/gitlist.qtpl:11
125+//line templates/gitlist.qtpl:22
126 }
127
128-//line templates/gitlist.qtpl:11
129+//line templates/gitlist.qtpl:22
130 func (p *GitListPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
131-//line templates/gitlist.qtpl:11
132+//line templates/gitlist.qtpl:22
133 qw422016 := qt422016.AcquireWriter(qq422016)
134-//line templates/gitlist.qtpl:11
135+//line templates/gitlist.qtpl:22
136 p.StreamTitle(qw422016, ctx)
137-//line templates/gitlist.qtpl:11
138+//line templates/gitlist.qtpl:22
139 qt422016.ReleaseWriter(qw422016)
140-//line templates/gitlist.qtpl:11
141+//line templates/gitlist.qtpl:22
142 }
143
144-//line templates/gitlist.qtpl:11
145+//line templates/gitlist.qtpl:22
146 func (p *GitListPage) Title(ctx context.Context) string {
147-//line templates/gitlist.qtpl:11
148+//line templates/gitlist.qtpl:22
149 qb422016 := qt422016.AcquireByteBuffer()
150-//line templates/gitlist.qtpl:11
151+//line templates/gitlist.qtpl:22
152 p.WriteTitle(qb422016, ctx)
153-//line templates/gitlist.qtpl:11
154+//line templates/gitlist.qtpl:22
155 qs422016 := string(qb422016.B)
156-//line templates/gitlist.qtpl:11
157+//line templates/gitlist.qtpl:22
158 qt422016.ReleaseByteBuffer(qb422016)
159-//line templates/gitlist.qtpl:11
160+//line templates/gitlist.qtpl:22
161 return qs422016
162-//line templates/gitlist.qtpl:11
163+//line templates/gitlist.qtpl:22
164 }
165
166-//line templates/gitlist.qtpl:13
167+//line templates/gitlist.qtpl:24
168 func (p *GitListPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
169-//line templates/gitlist.qtpl:13
170+//line templates/gitlist.qtpl:24
171 StreamNavbar(qw422016, ctx, Git)
172-//line templates/gitlist.qtpl:13
173+//line templates/gitlist.qtpl:24
174 }
175
176-//line templates/gitlist.qtpl:13
177+//line templates/gitlist.qtpl:24
178 func (p *GitListPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
179-//line templates/gitlist.qtpl:13
180+//line templates/gitlist.qtpl:24
181 qw422016 := qt422016.AcquireWriter(qq422016)
182-//line templates/gitlist.qtpl:13
183+//line templates/gitlist.qtpl:24
184 p.StreamNavbar(qw422016, ctx)
185-//line templates/gitlist.qtpl:13
186+//line templates/gitlist.qtpl:24
187 qt422016.ReleaseWriter(qw422016)
188-//line templates/gitlist.qtpl:13
189+//line templates/gitlist.qtpl:24
190 }
191
192-//line templates/gitlist.qtpl:13
193+//line templates/gitlist.qtpl:24
194 func (p *GitListPage) Navbar(ctx context.Context) string {
195-//line templates/gitlist.qtpl:13
196+//line templates/gitlist.qtpl:24
197 qb422016 := qt422016.AcquireByteBuffer()
198-//line templates/gitlist.qtpl:13
199+//line templates/gitlist.qtpl:24
200 p.WriteNavbar(qb422016, ctx)
201-//line templates/gitlist.qtpl:13
202+//line templates/gitlist.qtpl:24
203 qs422016 := string(qb422016.B)
204-//line templates/gitlist.qtpl:13
205+//line templates/gitlist.qtpl:24
206 qt422016.ReleaseByteBuffer(qb422016)
207-//line templates/gitlist.qtpl:13
208+//line templates/gitlist.qtpl:24
209 return qs422016
210-//line templates/gitlist.qtpl:13
211+//line templates/gitlist.qtpl:24
212 }
213
214-//line templates/gitlist.qtpl:15
215+//line templates/gitlist.qtpl:26
216 func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
217-//line templates/gitlist.qtpl:15
218+//line templates/gitlist.qtpl:26
219 qw422016.N().S(`
220 <div class="row">
221 <div class="col-md-6 order-last order-md-first">
222 <div class="event-list">
223 `)
224-//line templates/gitlist.qtpl:19
225+//line templates/gitlist.qtpl:30
226 for _, r := range p.Respositories {
227-//line templates/gitlist.qtpl:19
228+//line templates/gitlist.qtpl:30
229 qw422016.N().S(`
230 <div class="event">
231 <div class="row">
232 <div class="col-md">
233 <a href="/`)
234-//line templates/gitlist.qtpl:23
235+//line templates/gitlist.qtpl:34
236 qw422016.E().S(r.Name)
237-//line templates/gitlist.qtpl:23
238+//line templates/gitlist.qtpl:34
239 qw422016.N().S(`/">`)
240-//line templates/gitlist.qtpl:23
241+//line templates/gitlist.qtpl:34
242 qw422016.E().S(r.Name)
243-//line templates/gitlist.qtpl:23
244+//line templates/gitlist.qtpl:34
245 qw422016.N().S(`</a>
246 </div>
247 <div class="col-md text-md-end">
248 <small>`)
249-//line templates/gitlist.qtpl:26
250+//line templates/gitlist.qtpl:37
251 if !r.Public {
252-//line templates/gitlist.qtpl:26
253+//line templates/gitlist.qtpl:37
254 qw422016.N().S(`private`)
255-//line templates/gitlist.qtpl:26
256+//line templates/gitlist.qtpl:37
257 }
258-//line templates/gitlist.qtpl:26
259+//line templates/gitlist.qtpl:37
260 qw422016.N().S(`</small>
261 </div>
262 </div>
263 </hr>
264 <p>`)
265-//line templates/gitlist.qtpl:30
266+//line templates/gitlist.qtpl:41
267 qw422016.E().S(r.Description)
268-//line templates/gitlist.qtpl:30
269+//line templates/gitlist.qtpl:41
270+ qw422016.N().S(`</p>
271+ <p style="background: #dadada">
272+ <a title="`)
273+//line templates/gitlist.qtpl:43
274+ qw422016.E().S(r.LastCommit.Hash.String())
275+//line templates/gitlist.qtpl:43
276+ qw422016.N().S(`" href="/`)
277+//line templates/gitlist.qtpl:43
278+ qw422016.E().S(r.Name)
279+//line templates/gitlist.qtpl:43
280+ qw422016.N().S(`/commit/`)
281+//line templates/gitlist.qtpl:43
282+ qw422016.E().S(r.LastCommit.Hash.String())
283+//line templates/gitlist.qtpl:43
284+ qw422016.N().S(`/">`)
285+//line templates/gitlist.qtpl:43
286+ qw422016.E().S(r.LastCommit.Hash.String()[0:8])
287+//line templates/gitlist.qtpl:43
288+ qw422016.N().S(`</a> -
289+ <a title="`)
290+//line templates/gitlist.qtpl:44
291+ qw422016.E().S(r.LastCommit.Author.Email)
292+//line templates/gitlist.qtpl:44
293+ qw422016.N().S(`">`)
294+//line templates/gitlist.qtpl:44
295+ qw422016.E().S(r.LastCommit.Author.Name)
296+//line templates/gitlist.qtpl:44
297+ qw422016.N().S(`</a> -
298+ `)
299+//line templates/gitlist.qtpl:45
300+ qw422016.E().S(firstLine(r.LastCommit.Message))
301+//line templates/gitlist.qtpl:45
302 qw422016.N().S(`</p>
303 <p>
304 <a href="/`)
305-//line templates/gitlist.qtpl:32
306+//line templates/gitlist.qtpl:47
307 qw422016.E().S(r.Name)
308-//line templates/gitlist.qtpl:32
309+//line templates/gitlist.qtpl:47
310 qw422016.N().S(`/log/`)
311-//line templates/gitlist.qtpl:32
312+//line templates/gitlist.qtpl:47
313 qw422016.E().S(r.Ref)
314-//line templates/gitlist.qtpl:32
315+//line templates/gitlist.qtpl:47
316 qw422016.N().S(`/">log</a>
317 <a href="/`)
318-//line templates/gitlist.qtpl:33
319+//line templates/gitlist.qtpl:48
320 qw422016.E().S(r.Name)
321-//line templates/gitlist.qtpl:33
322+//line templates/gitlist.qtpl:48
323 qw422016.N().S(`/tree/`)
324-//line templates/gitlist.qtpl:33
325+//line templates/gitlist.qtpl:48
326 qw422016.E().S(r.Ref)
327-//line templates/gitlist.qtpl:33
328+//line templates/gitlist.qtpl:48
329 qw422016.N().S(`/">tree</a>
330 <a href="/`)
331-//line templates/gitlist.qtpl:34
332+//line templates/gitlist.qtpl:49
333 qw422016.E().S(r.Name)
334-//line templates/gitlist.qtpl:34
335+//line templates/gitlist.qtpl:49
336 qw422016.N().S(`/refs/">refs</a>
337 </p>
338 </div>
339 `)
340-//line templates/gitlist.qtpl:37
341+//line templates/gitlist.qtpl:52
342 }
343-//line templates/gitlist.qtpl:37
344+//line templates/gitlist.qtpl:52
345 qw422016.N().S(`
346 </div>
347 </div>
348 <div id="about" class="col-md-4 order-first order-md-last">
349 `)
350-//line templates/gitlist.qtpl:41
351+//line templates/gitlist.qtpl:56
352 qw422016.N().Z(p.About)
353-//line templates/gitlist.qtpl:41
354+//line templates/gitlist.qtpl:56
355 qw422016.N().S(`
356 <div class="alert alert-warning text-center" role="alert">
357 This project is under development, things may be broken or incomplete.
358@@ -183,65 +227,65 @@ </div>
359 </div>
360 </div>
361 `)
362-//line templates/gitlist.qtpl:47
363+//line templates/gitlist.qtpl:62
364 }
365
366-//line templates/gitlist.qtpl:47
367+//line templates/gitlist.qtpl:62
368 func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
369-//line templates/gitlist.qtpl:47
370+//line templates/gitlist.qtpl:62
371 qw422016 := qt422016.AcquireWriter(qq422016)
372-//line templates/gitlist.qtpl:47
373+//line templates/gitlist.qtpl:62
374 p.StreamContent(qw422016, ctx)
375-//line templates/gitlist.qtpl:47
376+//line templates/gitlist.qtpl:62
377 qt422016.ReleaseWriter(qw422016)
378-//line templates/gitlist.qtpl:47
379+//line templates/gitlist.qtpl:62
380 }
381
382-//line templates/gitlist.qtpl:47
383+//line templates/gitlist.qtpl:62
384 func (p *GitListPage) Content(ctx context.Context) string {
385-//line templates/gitlist.qtpl:47
386+//line templates/gitlist.qtpl:62
387 qb422016 := qt422016.AcquireByteBuffer()
388-//line templates/gitlist.qtpl:47
389+//line templates/gitlist.qtpl:62
390 p.WriteContent(qb422016, ctx)
391-//line templates/gitlist.qtpl:47
392+//line templates/gitlist.qtpl:62
393 qs422016 := string(qb422016.B)
394-//line templates/gitlist.qtpl:47
395+//line templates/gitlist.qtpl:62
396 qt422016.ReleaseByteBuffer(qb422016)
397-//line templates/gitlist.qtpl:47
398+//line templates/gitlist.qtpl:62
399 return qs422016
400-//line templates/gitlist.qtpl:47
401+//line templates/gitlist.qtpl:62
402 }
403
404-//line templates/gitlist.qtpl:49
405+//line templates/gitlist.qtpl:64
406 func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
407-//line templates/gitlist.qtpl:49
408+//line templates/gitlist.qtpl:64
409 qw422016.N().S(`
410 `)
411-//line templates/gitlist.qtpl:50
412+//line templates/gitlist.qtpl:65
413 }
414
415-//line templates/gitlist.qtpl:50
416+//line templates/gitlist.qtpl:65
417 func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
418-//line templates/gitlist.qtpl:50
419+//line templates/gitlist.qtpl:65
420 qw422016 := qt422016.AcquireWriter(qq422016)
421-//line templates/gitlist.qtpl:50
422+//line templates/gitlist.qtpl:65
423 p.StreamScript(qw422016, ctx)
424-//line templates/gitlist.qtpl:50
425+//line templates/gitlist.qtpl:65
426 qt422016.ReleaseWriter(qw422016)
427-//line templates/gitlist.qtpl:50
428+//line templates/gitlist.qtpl:65
429 }
430
431-//line templates/gitlist.qtpl:50
432+//line templates/gitlist.qtpl:65
433 func (p *GitListPage) Script(ctx context.Context) string {
434-//line templates/gitlist.qtpl:50
435+//line templates/gitlist.qtpl:65
436 qb422016 := qt422016.AcquireByteBuffer()
437-//line templates/gitlist.qtpl:50
438+//line templates/gitlist.qtpl:65
439 p.WriteScript(qb422016, ctx)
440-//line templates/gitlist.qtpl:50
441+//line templates/gitlist.qtpl:65
442 qs422016 := string(qb422016.B)
443-//line templates/gitlist.qtpl:50
444+//line templates/gitlist.qtpl:65
445 qt422016.ReleaseByteBuffer(qb422016)
446-//line templates/gitlist.qtpl:50
447+//line templates/gitlist.qtpl:65
448 return qs422016
449-//line templates/gitlist.qtpl:50
450+//line templates/gitlist.qtpl:65
451 }