cerrado @ 4ea63e98cc999ab05d1ac98b64875d7413e86972

feat: Add initial log
  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 }