1diff --git a/pkg/git/git.go b/pkg/git/git.go
2index b9ab235f7226301c7f57ca245c5b1660fa6230b9..80c0e4613fdd261329634bf48bd58069ff827f6b 100644
3--- a/pkg/git/git.go
4+++ b/pkg/git/git.go
5@@ -2,6 +2,8 @@ package git
6
7 import (
8 "errors"
9+ "fmt"
10+ "io"
11
12 "github.com/go-git/go-git/v5"
13 "github.com/go-git/go-git/v5/plumbing/object"
14@@ -46,3 +48,36 @@ return nil, err
15 }
16 return c, nil
17 }
18+
19+func (g *GitRepository) Commits() ([]*object.Commit, error) {
20+ repo, err := git.PlainOpen(g.path)
21+ if err != nil {
22+ return nil, err
23+ }
24+ ref, err := repo.Head()
25+ if err != nil {
26+ return nil, errors.Join(MissingHeadErr, err)
27+ }
28+
29+ ci, err := repo.Log(&git.LogOptions{From: ref.Hash()})
30+ if err != nil {
31+ return nil, fmt.Errorf("commits from ref: %w", err)
32+ }
33+
34+ commits := []*object.Commit{}
35+ // TODO: for now only load first 1000
36+ for x := 0; x < 1000; x++ {
37+ c, err := ci.Next()
38+ if err != nil && errors.Is(err, io.EOF) {
39+ break
40+ } else if err != nil {
41+ return nil, err
42+ }
43+ commits = append(commits, c)
44+ }
45+ if err != nil {
46+ return nil, err
47+ }
48+
49+ return commits, nil
50+}
51diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
52index 45cd865ea42c7929931a0472529d7916644bd8ce..ebfb37f298597e7aee5afa1ca9026e44fe9b364e 100644
53--- a/pkg/handler/git/handler.go
54+++ b/pkg/handler/git/handler.go
55@@ -6,6 +6,7 @@ "net/http"
56
57 "git.gabrielgio.me/cerrado/pkg/service"
58 "git.gabrielgio.me/cerrado/templates"
59+ "github.com/go-git/go-git/v5/plumbing/object"
60 "github.com/gorilla/mux"
61 )
62
63@@ -16,6 +17,7 @@ }
64
65 gitService interface {
66 ListRepositories() ([]*service.Repository, error)
67+ ListCommits(string) ([]*object.Commit, error)
68 }
69 )
70
71@@ -74,9 +76,18 @@ }
72
73 func (g *GitHandler) Log(w http.ResponseWriter, r *http.Request) {
74 name := mux.Vars(r)["name"]
75+
76+ commits, err := g.gitService.ListCommits(name)
77+ if err != nil {
78+ slog.Error("Error loading commits", "error", err)
79+ return
80+ }
81+
82 gitList := &templates.GitItemPage{
83- Name: name,
84- GitItemBase: &templates.GitItemLogPage{},
85+ Name: name,
86+ GitItemBase: &templates.GitItemLogPage{
87+ Commits: commits,
88+ },
89 }
90 templates.WritePageTemplate(w, gitList)
91 }
92diff --git a/pkg/service/git.go b/pkg/service/git.go
93index 2b1fe252f8e7785238896329ceca3305c71b817c..614770fa55884c145409031ec3e31fee1c9f6a07 100644
94--- a/pkg/service/git.go
95+++ b/pkg/service/git.go
96@@ -5,6 +5,7 @@ "path"
97
98 "git.gabrielgio.me/cerrado/pkg/config"
99 "git.gabrielgio.me/cerrado/pkg/git"
100+ "github.com/go-git/go-git/v5/plumbing/object"
101 )
102
103 type (
104@@ -21,6 +22,7 @@ }
105
106 configurationRepository interface {
107 List() []*config.GitRepositoryConfiguration
108+ GetByName(name string) *config.GitRepositoryConfiguration
109 }
110 )
111
112@@ -55,3 +57,11 @@ }
113
114 return repos, nil
115 }
116+
117+func (g *GitService) ListCommits(name string) ([]*object.Commit, error) {
118+ // TODO: handle nil
119+ r := g.configRepo.GetByName(name)
120+
121+ repo := git.NewGitRepository(r.Path)
122+ return repo.Commits()
123+}
124diff --git a/scss/main.scss b/scss/main.scss
125index deea23b381c4ce957482bdf81c2d71ecdb0972dc..9f17dadab978cf2bef7863c4ff6a292d87e107a8 100644
126--- a/scss/main.scss
127+++ b/scss/main.scss
128@@ -26,10 +26,6 @@ font-size: $base-font-size;
129 margin: 0;
130 }
131
132-.card-body {
133- padding: 5px;
134-}
135-
136 .navbar-nav {
137 margin-top: 0px
138 }
139@@ -65,3 +61,34 @@ .code-view {
140 display: grid;
141 overflow-x: auto;
142 }
143+
144+.logs {
145+ >div:nth-child(odd) {
146+ background: #f8f9fa;
147+ }
148+
149+ >div {
150+ padding: 10px;
151+ }
152+
153+ pre {
154+ white-space: break-spaces;
155+ margin: 0;
156+ }
157+}
158+
159+.logs pre::first-line {
160+ font-weight: bold;
161+}
162+
163+@include media-breakpoint-down(sm) {
164+ // add extra spacing then list is seen on vertical
165+ .logs>div>div:first-child {
166+ margin-bottom: 15px;
167+ }
168+ .logs>div>div:last-child {
169+ margin-top: 15px;
170+ }
171+}
172+
173+
174diff --git a/templates/base.qtpl b/templates/base.qtpl
175index ba32aad77d3aa3bf33796127b6af71409d673e1c..16b878014575bb4d5d6dc275b17774b1d63079c3 100644
176--- a/templates/base.qtpl
177+++ b/templates/base.qtpl
178@@ -1,6 +1,7 @@
179 This is a base page template. All the other template pages implement this interface.
180
181 {% import "strconv" %}
182+{% import "time" %}
183
184 {% code
185 var Slug = ""
186@@ -21,6 +22,11 @@ if u != nil {
187 return strconv.FormatUint(uint64(*u), 10)
188 }
189 return ""
190+ }
191+%}
192+
193+{% code func TimeFormat(t time.Time) string {
194+ return t.Format("2006-01-02")
195 }
196 %}
197
198diff --git a/templates/base.qtpl.go b/templates/base.qtpl.go
199index 2f419c68086d58c248e274382152c0ab9a3fc6fb..6d4d0a082e97a6f3bba19dc6a343ba313eabcc21 100644
200--- a/templates/base.qtpl.go
201+++ b/templates/base.qtpl.go
202@@ -10,52 +10,55 @@
203 //line base.qtpl:3
204 import "strconv"
205
206-//line base.qtpl:5
207+//line base.qtpl:4
208+import "time"
209+
210+//line base.qtpl:6
211 import (
212 qtio422016 "io"
213
214 qt422016 "github.com/valyala/quicktemplate"
215 )
216
217-//line base.qtpl:5
218+//line base.qtpl:6
219 var (
220 _ = qtio422016.Copy
221 _ = qt422016.AcquireByteBuffer
222 )
223
224-//line base.qtpl:6
225+//line base.qtpl:7
226 var Slug = ""
227
228-//line base.qtpl:10
229+//line base.qtpl:11
230 type Page interface {
231-//line base.qtpl:10
232+//line base.qtpl:11
233 Title() string
234-//line base.qtpl:10
235+//line base.qtpl:11
236 StreamTitle(qw422016 *qt422016.Writer)
237-//line base.qtpl:10
238+//line base.qtpl:11
239 WriteTitle(qq422016 qtio422016.Writer)
240-//line base.qtpl:10
241+//line base.qtpl:11
242 Content() string
243-//line base.qtpl:10
244+//line base.qtpl:11
245 StreamContent(qw422016 *qt422016.Writer)
246-//line base.qtpl:10
247+//line base.qtpl:11
248 WriteContent(qq422016 qtio422016.Writer)
249-//line base.qtpl:10
250+//line base.qtpl:11
251 Script() string
252-//line base.qtpl:10
253+//line base.qtpl:11
254 StreamScript(qw422016 *qt422016.Writer)
255-//line base.qtpl:10
256+//line base.qtpl:11
257 WriteScript(qq422016 qtio422016.Writer)
258-//line base.qtpl:10
259+//line base.qtpl:11
260 Navbar() string
261-//line base.qtpl:10
262+//line base.qtpl:11
263 StreamNavbar(qw422016 *qt422016.Writer)
264-//line base.qtpl:10
265+//line base.qtpl:11
266 WriteNavbar(qq422016 qtio422016.Writer)
267-//line base.qtpl:10
268+//line base.qtpl:11
269 }
270
271-//line base.qtpl:19
272+//line base.qtpl:20
273 func FromUInttoString(u *uint) string {
274 if u != nil {
275 return strconv.FormatUint(uint64(*u), 10)
276@@ -63,174 +66,179 @@ }
277 return ""
278 }
279
280+//line base.qtpl:28
281+func TimeFormat(t time.Time) string {
282+ return t.Format("2006-01-02")
283+}
284+
285 // Page prints a page implementing Page interface.
286
287-//line base.qtpl:28
288+//line base.qtpl:34
289 func StreamPageTemplate(qw422016 *qt422016.Writer, p Page) {
290-//line base.qtpl:28
291+//line base.qtpl:34
292 qw422016.N().S(`
293 <html lang="en">
294 <head>
295 <meta charset="utf-8">
296 <link rel="icon" href="data:,">
297 <title>cerrado | `)
298-//line base.qtpl:33
299+//line base.qtpl:39
300 p.StreamTitle(qw422016)
301-//line base.qtpl:33
302+//line base.qtpl:39
303 qw422016.N().S(`</title>
304 <link rel="stylesheet" href="/static/main`)
305-//line base.qtpl:34
306+//line base.qtpl:40
307 qw422016.E().S(Slug)
308-//line base.qtpl:34
309+//line base.qtpl:40
310 qw422016.N().S(`.css">
311 <meta name="viewport" content="width=device-width, initial-scale=1" />
312 </head>
313 <body>
314 `)
315-//line base.qtpl:38
316+//line base.qtpl:44
317 p.StreamNavbar(qw422016)
318-//line base.qtpl:38
319+//line base.qtpl:44
320 qw422016.N().S(`
321 <div class="container">
322 `)
323-//line base.qtpl:40
324+//line base.qtpl:46
325 p.StreamContent(qw422016)
326-//line base.qtpl:40
327+//line base.qtpl:46
328 qw422016.N().S(`
329 </div>
330 </body>
331 `)
332-//line base.qtpl:43
333+//line base.qtpl:49
334 p.StreamScript(qw422016)
335-//line base.qtpl:43
336+//line base.qtpl:49
337 qw422016.N().S(`
338 </html>
339 `)
340-//line base.qtpl:45
341+//line base.qtpl:51
342 }
343
344-//line base.qtpl:45
345+//line base.qtpl:51
346 func WritePageTemplate(qq422016 qtio422016.Writer, p Page) {
347-//line base.qtpl:45
348+//line base.qtpl:51
349 qw422016 := qt422016.AcquireWriter(qq422016)
350-//line base.qtpl:45
351+//line base.qtpl:51
352 StreamPageTemplate(qw422016, p)
353-//line base.qtpl:45
354+//line base.qtpl:51
355 qt422016.ReleaseWriter(qw422016)
356-//line base.qtpl:45
357+//line base.qtpl:51
358 }
359
360-//line base.qtpl:45
361+//line base.qtpl:51
362 func PageTemplate(p Page) string {
363-//line base.qtpl:45
364+//line base.qtpl:51
365 qb422016 := qt422016.AcquireByteBuffer()
366-//line base.qtpl:45
367+//line base.qtpl:51
368 WritePageTemplate(qb422016, p)
369-//line base.qtpl:45
370+//line base.qtpl:51
371 qs422016 := string(qb422016.B)
372-//line base.qtpl:45
373+//line base.qtpl:51
374 qt422016.ReleaseByteBuffer(qb422016)
375-//line base.qtpl:45
376+//line base.qtpl:51
377 return qs422016
378-//line base.qtpl:45
379+//line base.qtpl:51
380 }
381
382-//line base.qtpl:47
383+//line base.qtpl:53
384 type BasePage struct{}
385
386-//line base.qtpl:48
387+//line base.qtpl:54
388 func (p *BasePage) StreamTitle(qw422016 *qt422016.Writer) {
389-//line base.qtpl:48
390+//line base.qtpl:54
391 qw422016.N().S(`Empty`)
392-//line base.qtpl:48
393+//line base.qtpl:54
394 }
395
396-//line base.qtpl:48
397+//line base.qtpl:54
398 func (p *BasePage) WriteTitle(qq422016 qtio422016.Writer) {
399-//line base.qtpl:48
400+//line base.qtpl:54
401 qw422016 := qt422016.AcquireWriter(qq422016)
402-//line base.qtpl:48
403+//line base.qtpl:54
404 p.StreamTitle(qw422016)
405-//line base.qtpl:48
406+//line base.qtpl:54
407 qt422016.ReleaseWriter(qw422016)
408-//line base.qtpl:48
409+//line base.qtpl:54
410 }
411
412-//line base.qtpl:48
413+//line base.qtpl:54
414 func (p *BasePage) Title() string {
415-//line base.qtpl:48
416+//line base.qtpl:54
417 qb422016 := qt422016.AcquireByteBuffer()
418-//line base.qtpl:48
419+//line base.qtpl:54
420 p.WriteTitle(qb422016)
421-//line base.qtpl:48
422+//line base.qtpl:54
423 qs422016 := string(qb422016.B)
424-//line base.qtpl:48
425+//line base.qtpl:54
426 qt422016.ReleaseByteBuffer(qb422016)
427-//line base.qtpl:48
428+//line base.qtpl:54
429 return qs422016
430-//line base.qtpl:48
431+//line base.qtpl:54
432 }
433
434-//line base.qtpl:49
435+//line base.qtpl:55
436 func (p *BasePage) StreamBody(qw422016 *qt422016.Writer) {
437-//line base.qtpl:49
438+//line base.qtpl:55
439 qw422016.N().S(`HelloWorld`)
440-//line base.qtpl:49
441+//line base.qtpl:55
442 }
443
444-//line base.qtpl:49
445+//line base.qtpl:55
446 func (p *BasePage) WriteBody(qq422016 qtio422016.Writer) {
447-//line base.qtpl:49
448+//line base.qtpl:55
449 qw422016 := qt422016.AcquireWriter(qq422016)
450-//line base.qtpl:49
451+//line base.qtpl:55
452 p.StreamBody(qw422016)
453-//line base.qtpl:49
454+//line base.qtpl:55
455 qt422016.ReleaseWriter(qw422016)
456-//line base.qtpl:49
457+//line base.qtpl:55
458 }
459
460-//line base.qtpl:49
461+//line base.qtpl:55
462 func (p *BasePage) Body() string {
463-//line base.qtpl:49
464+//line base.qtpl:55
465 qb422016 := qt422016.AcquireByteBuffer()
466-//line base.qtpl:49
467+//line base.qtpl:55
468 p.WriteBody(qb422016)
469-//line base.qtpl:49
470+//line base.qtpl:55
471 qs422016 := string(qb422016.B)
472-//line base.qtpl:49
473+//line base.qtpl:55
474 qt422016.ReleaseByteBuffer(qb422016)
475-//line base.qtpl:49
476+//line base.qtpl:55
477 return qs422016
478-//line base.qtpl:49
479+//line base.qtpl:55
480 }
481
482-//line base.qtpl:50
483+//line base.qtpl:56
484 func (p *BasePage) StreamScript(qw422016 *qt422016.Writer) {
485-//line base.qtpl:50
486+//line base.qtpl:56
487 }
488
489-//line base.qtpl:50
490+//line base.qtpl:56
491 func (p *BasePage) WriteScript(qq422016 qtio422016.Writer) {
492-//line base.qtpl:50
493+//line base.qtpl:56
494 qw422016 := qt422016.AcquireWriter(qq422016)
495-//line base.qtpl:50
496+//line base.qtpl:56
497 p.StreamScript(qw422016)
498-//line base.qtpl:50
499+//line base.qtpl:56
500 qt422016.ReleaseWriter(qw422016)
501-//line base.qtpl:50
502+//line base.qtpl:56
503 }
504
505-//line base.qtpl:50
506+//line base.qtpl:56
507 func (p *BasePage) Script() string {
508-//line base.qtpl:50
509+//line base.qtpl:56
510 qb422016 := qt422016.AcquireByteBuffer()
511-//line base.qtpl:50
512+//line base.qtpl:56
513 p.WriteScript(qb422016)
514-//line base.qtpl:50
515+//line base.qtpl:56
516 qs422016 := string(qb422016.B)
517-//line base.qtpl:50
518+//line base.qtpl:56
519 qt422016.ReleaseByteBuffer(qb422016)
520-//line base.qtpl:50
521+//line base.qtpl:56
522 return qs422016
523-//line base.qtpl:50
524+//line base.qtpl:56
525 }
526diff --git a/templates/gititem.qtpl b/templates/gititem.qtpl
527index 4a6c49a5709efe777228786bb881715991e01268..d2fcea7fcbac20ca753c668f71b7937a7c61e7c5 100644
528--- a/templates/gititem.qtpl
529+++ b/templates/gititem.qtpl
530@@ -23,7 +23,7 @@ </div>
531 <div class="row">
532 {%= p.Nav(p.Name) %}
533 </div>
534-<div class="row">
535+<div class="container">
536 {%= p.GitContent() %}
537 </div>
538 {% endfunc %}
539diff --git a/templates/gititem.qtpl.go b/templates/gititem.qtpl.go
540index f978c4d3d66423b73ba92eecd30ca5c359004237..9709a43ec697fd27687af9e2ac9b424ff8e981a1 100644
541--- a/templates/gititem.qtpl.go
542+++ b/templates/gititem.qtpl.go
543@@ -124,7 +124,7 @@ p.StreamNav(qw422016, p.Name)
544 //line gititem.qtpl:24
545 qw422016.N().S(`
546 </div>
547-<div class="row">
548+<div class="container">
549 `)
550 //line gititem.qtpl:27
551 p.StreamGitContent(qw422016)
552diff --git a/templates/gititemlog.qtpl b/templates/gititemlog.qtpl
553index ae88a5205a998eec94dc046b0a7e2f2e71d3ede4..a39fb777497d50df7bec71fa6d2465b3a1b56570 100644
554--- a/templates/gititemlog.qtpl
555+++ b/templates/gititemlog.qtpl
556@@ -1,10 +1,27 @@
557+{% import "github.com/go-git/go-git/v5/plumbing/object" %}
558+
559 {% code
560 type GitItemLogPage struct {
561+ Commits []*object.Commit
562 }
563 %}
564
565 {% func (g *GitItemLogPage) Nav(name string) %}{%= GitItemNav(name, Log) %}{% endfunc %}
566
567 {% func (g *GitItemLogPage) GitContent() %}
568-<h4>Log</h4>
569+<div class="logs">
570+ {% for _, c := range g.Commits %}
571+ <div class="row">
572+ <div class="col-sm-2">
573+ {%s TimeFormat(c.Committer.When) %}
574+ </div>
575+ <div class="col-sm-7">
576+ <pre>{%s c.Message %}</pre>
577+ </div>
578+ <div class="col-sm-3">
579+ {%s c.Committer.Name %}
580+ </div>
581+ </div>
582+ {% endfor %}
583+</div>
584 {% endfunc %}
585diff --git a/templates/gititemlog.qtpl.go b/templates/gititemlog.qtpl.go
586index 2d559d745fa7d15387f20e382b4e8f18bc8b29b6..cc5652d56de5724d82b1ec87ed045e9722c6dfc5 100644
587--- a/templates/gititemlog.qtpl.go
588+++ b/templates/gititemlog.qtpl.go
589@@ -5,86 +5,124 @@ //line gititemlog.qtpl:1
590 package templates
591
592 //line gititemlog.qtpl:1
593+import "github.com/go-git/go-git/v5/plumbing/object"
594+
595+//line gititemlog.qtpl:3
596 import (
597 qtio422016 "io"
598
599 qt422016 "github.com/valyala/quicktemplate"
600 )
601
602-//line gititemlog.qtpl:1
603+//line gititemlog.qtpl:3
604 var (
605 _ = qtio422016.Copy
606 _ = qt422016.AcquireByteBuffer
607 )
608
609-//line gititemlog.qtpl:2
610+//line gititemlog.qtpl:4
611 type GitItemLogPage struct {
612+ Commits []*object.Commit
613 }
614
615-//line gititemlog.qtpl:6
616+//line gititemlog.qtpl:9
617 func (g *GitItemLogPage) StreamNav(qw422016 *qt422016.Writer, name string) {
618-//line gititemlog.qtpl:6
619+//line gititemlog.qtpl:9
620 StreamGitItemNav(qw422016, name, Log)
621-//line gititemlog.qtpl:6
622+//line gititemlog.qtpl:9
623 }
624
625-//line gititemlog.qtpl:6
626+//line gititemlog.qtpl:9
627 func (g *GitItemLogPage) WriteNav(qq422016 qtio422016.Writer, name string) {
628-//line gititemlog.qtpl:6
629+//line gititemlog.qtpl:9
630 qw422016 := qt422016.AcquireWriter(qq422016)
631-//line gititemlog.qtpl:6
632+//line gititemlog.qtpl:9
633 g.StreamNav(qw422016, name)
634-//line gititemlog.qtpl:6
635+//line gititemlog.qtpl:9
636 qt422016.ReleaseWriter(qw422016)
637-//line gititemlog.qtpl:6
638+//line gititemlog.qtpl:9
639 }
640
641-//line gititemlog.qtpl:6
642+//line gititemlog.qtpl:9
643 func (g *GitItemLogPage) Nav(name string) string {
644-//line gititemlog.qtpl:6
645+//line gititemlog.qtpl:9
646 qb422016 := qt422016.AcquireByteBuffer()
647-//line gititemlog.qtpl:6
648+//line gititemlog.qtpl:9
649 g.WriteNav(qb422016, name)
650-//line gititemlog.qtpl:6
651+//line gititemlog.qtpl:9
652 qs422016 := string(qb422016.B)
653-//line gititemlog.qtpl:6
654+//line gititemlog.qtpl:9
655 qt422016.ReleaseByteBuffer(qb422016)
656-//line gititemlog.qtpl:6
657+//line gititemlog.qtpl:9
658 return qs422016
659-//line gititemlog.qtpl:6
660+//line gititemlog.qtpl:9
661 }
662
663-//line gititemlog.qtpl:8
664+//line gititemlog.qtpl:11
665 func (g *GitItemLogPage) StreamGitContent(qw422016 *qt422016.Writer) {
666-//line gititemlog.qtpl:8
667+//line gititemlog.qtpl:11
668 qw422016.N().S(`
669-<h4>Log</h4>
670+<div class="logs">
671+ `)
672+//line gititemlog.qtpl:13
673+ for _, c := range g.Commits {
674+//line gititemlog.qtpl:13
675+ qw422016.N().S(`
676+ <div class="row">
677+ <div class="col-sm-2">
678+ `)
679+//line gititemlog.qtpl:16
680+ qw422016.E().S(TimeFormat(c.Committer.When))
681+//line gititemlog.qtpl:16
682+ qw422016.N().S(`
683+ </div>
684+ <div class="col-sm-7">
685+ <pre>`)
686+//line gititemlog.qtpl:19
687+ qw422016.E().S(c.Message)
688+//line gititemlog.qtpl:19
689+ qw422016.N().S(`</pre>
690+ </div>
691+ <div class="col-sm-3">
692+ `)
693+//line gititemlog.qtpl:22
694+ qw422016.E().S(c.Committer.Name)
695+//line gititemlog.qtpl:22
696+ qw422016.N().S(`
697+ </div>
698+ </div>
699+ `)
700+//line gititemlog.qtpl:25
701+ }
702+//line gititemlog.qtpl:25
703+ qw422016.N().S(`
704+</div>
705 `)
706-//line gititemlog.qtpl:10
707+//line gititemlog.qtpl:27
708 }
709
710-//line gititemlog.qtpl:10
711+//line gititemlog.qtpl:27
712 func (g *GitItemLogPage) WriteGitContent(qq422016 qtio422016.Writer) {
713-//line gititemlog.qtpl:10
714+//line gititemlog.qtpl:27
715 qw422016 := qt422016.AcquireWriter(qq422016)
716-//line gititemlog.qtpl:10
717+//line gititemlog.qtpl:27
718 g.StreamGitContent(qw422016)
719-//line gititemlog.qtpl:10
720+//line gititemlog.qtpl:27
721 qt422016.ReleaseWriter(qw422016)
722-//line gititemlog.qtpl:10
723+//line gititemlog.qtpl:27
724 }
725
726-//line gititemlog.qtpl:10
727+//line gititemlog.qtpl:27
728 func (g *GitItemLogPage) GitContent() string {
729-//line gititemlog.qtpl:10
730+//line gititemlog.qtpl:27
731 qb422016 := qt422016.AcquireByteBuffer()
732-//line gititemlog.qtpl:10
733+//line gititemlog.qtpl:27
734 g.WriteGitContent(qb422016)
735-//line gititemlog.qtpl:10
736+//line gititemlog.qtpl:27
737 qs422016 := string(qb422016.B)
738-//line gititemlog.qtpl:10
739+//line gititemlog.qtpl:27
740 qt422016.ReleaseByteBuffer(qb422016)
741-//line gititemlog.qtpl:10
742+//line gititemlog.qtpl:27
743 return qs422016
744-//line gititemlog.qtpl:10
745+//line gititemlog.qtpl:27
746 }