aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2024-12-11 17:05:12 +0100
committerGabriel A. Giovanini <mail@gabrielgio.me>2024-12-11 17:05:12 +0100
commit1e45ae2ea3497958b2ea6a20137955cfc3bbc964 (patch)
tree00af0e28864d79d7a9cbb8b693aff1b397b1a949
parente6ded0d01117c592ec124f3e02d6c89eeafec382 (diff)
downloadcerrado-1e45ae2ea3497958b2ea6a20137955cfc3bbc964.tar.gz
cerrado-1e45ae2ea3497958b2ea6a20137955cfc3bbc964.tar.bz2
cerrado-1e45ae2ea3497958b2ea6a20137955cfc3bbc964.zip
feat: Add UI/Handler login process
It adds the whole workflow to store and handle login on both UI and handler level. With that the login information should be available at any point given the context.
-rw-r--r--main.go10
-rw-r--r--pkg/config/config.go16
-rw-r--r--pkg/ext/auth.go45
-rw-r--r--pkg/ext/router.go18
-rw-r--r--pkg/handler/about/handler.go4
-rw-r--r--pkg/handler/auth/login.go75
-rw-r--r--pkg/handler/git/handler.go24
-rw-r--r--pkg/handler/router.go5
-rw-r--r--pkg/service/auth.go8
-rw-r--r--pkg/service/git.go4
-rw-r--r--templates/about.qtpl11
-rw-r--r--templates/about.qtpl.go176
-rw-r--r--templates/base.qtpl27
-rw-r--r--templates/base.qtpl.go143
-rw-r--r--templates/error.qtpl10
-rw-r--r--templates/error.qtpl.go165
-rw-r--r--templates/gititem.qtpl10
-rw-r--r--templates/gititem.qtpl.go189
-rw-r--r--templates/gitlist.qtpl9
-rw-r--r--templates/gitlist.qtpl.go215
-rw-r--r--templates/login.qtpl24
-rw-r--r--templates/login.qtpl.go195
-rw-r--r--templates/navbar.qtpl8
-rw-r--r--templates/navbar.qtpl.go211
24 files changed, 920 insertions, 682 deletions
diff --git a/main.go b/main.go
index ab4aee9..797ebea 100644
--- a/main.go
+++ b/main.go
@@ -74,8 +74,7 @@ func run() error {
return err
}
- // checking chroma configurationo
-
+ // checking chroma configuration
if _, ok := styles.Registry[configRepo.GetSyntaxHighlight()]; !ok {
slog.Warn(
"Invalid Syntax highlight selected",
@@ -87,8 +86,13 @@ func run() error {
// services
gitService := service.NewGitService(configRepo)
+ authService := service.NewAuthService(configRepo)
- handler, err := handler.MountHandler(gitService, configRepo)
+ handler, err := handler.MountHandler(
+ gitService,
+ authService,
+ configRepo,
+ )
if err != nil {
return err
}
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 812a06e..da6e0e7 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -55,8 +55,8 @@ type (
ConfigurationRepository struct {
rootReadme string
listenAddr string
- passphrase string
- aesKey string
+ passphrase []byte
+ aesKey []byte
syntaxHighlight string
repositories []*GitRepositoryConfiguration
}
@@ -74,9 +74,9 @@ func LoadConfigurationRepository(configPath string) (*ConfigurationRepository, e
}
repo := &ConfigurationRepository{
- aesKey: config.AESKey,
+ aesKey: []byte(config.AESKey),
listenAddr: config.ListenAddr,
- passphrase: config.Passphrase,
+ passphrase: []byte(config.Passphrase),
repositories: config.Repositories,
rootReadme: config.RootReadme,
syntaxHighlight: config.SyntaxHighlight,
@@ -105,6 +105,14 @@ func (c *ConfigurationRepository) GetListenAddr() string {
return c.listenAddr
}
+func (c *ConfigurationRepository) GetPassphrase() []byte {
+ return c.passphrase
+}
+
+func (c *ConfigurationRepository) GetBase64AesKey() []byte {
+ return c.aesKey
+}
+
// GetByName returns configuration of repository for a given name.
// It returns nil if there is not match for it.
func (c *ConfigurationRepository) GetByName(name string) *GitRepositoryConfiguration {
diff --git a/pkg/ext/auth.go b/pkg/ext/auth.go
new file mode 100644
index 0000000..bb6c0a2
--- /dev/null
+++ b/pkg/ext/auth.go
@@ -0,0 +1,45 @@
+package ext
+
+import (
+ "context"
+ "encoding/base64"
+ "log/slog"
+ "net/http"
+)
+
+type authService interface {
+ ValidateToken(token []byte) (bool, error)
+}
+
+func Authenticate(auth authService) func(next http.HandlerFunc) http.HandlerFunc {
+ return func(next http.HandlerFunc) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ cookie, err := r.Cookie("auth")
+ if err != nil {
+ slog.Error("Error loading cookie", "error", err)
+ next(w, r)
+ return
+ }
+
+ value, err := base64.StdEncoding.DecodeString(cookie.Value)
+ if err != nil {
+ slog.Error("Error decoding", "error", err)
+ next(w, r)
+ return
+ }
+
+ valid, err := auth.ValidateToken(value)
+ if err != nil {
+ slog.Error("Error validating token", "error", err, "cookie", cookie.Value)
+ next(w, r)
+ return
+ }
+
+ ctx := r.Context()
+ ctx = context.WithValue(ctx, "logged", true)
+
+ slog.Info("Validated token", "valid?", valid)
+ next(w, r.WithContext(ctx))
+ }
+ }
+}
diff --git a/pkg/ext/router.go b/pkg/ext/router.go
index 96da1c9..956254d 100644
--- a/pkg/ext/router.go
+++ b/pkg/ext/router.go
@@ -23,6 +23,7 @@ func NewRouter() *Router {
router: http.NewServeMux(),
}
}
+
func (r *Router) Handler() http.Handler {
return r.router
}
@@ -35,9 +36,9 @@ func wrapError(next ErrorRequestHandler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if err := next(w, r); err != nil {
if errors.Is(err, service.ErrRepositoryNotFound) {
- NotFound(w)
+ NotFound(w, r)
} else {
- InternalServerError(w, err)
+ InternalServerError(r, w, err)
}
}
}
@@ -57,16 +58,21 @@ func (r *Router) HandleFunc(path string, handler ErrorRequestHandler) {
r.router.HandleFunc(path, r.run(handler))
}
-func NotFound(w http.ResponseWriter) {
+func NotFound(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
templates.WritePageTemplate(w, &templates.ErrorPage{
Message: "Not Found",
- })
+ }, r.Context())
+}
+
+func Redirect(w http.ResponseWriter, location string) {
+ w.Header().Add("location", location)
+ w.WriteHeader(http.StatusTemporaryRedirect)
}
-func InternalServerError(w http.ResponseWriter, err error) {
+func InternalServerError(r *http.Request, w http.ResponseWriter, err error) {
w.WriteHeader(http.StatusInternalServerError)
templates.WritePageTemplate(w, &templates.ErrorPage{
Message: fmt.Sprintf("Internal Server Error:\n%s", err.Error()),
- })
+ }, r.Context())
}
diff --git a/pkg/handler/about/handler.go b/pkg/handler/about/handler.go
index ac3d314..ee084cd 100644
--- a/pkg/handler/about/handler.go
+++ b/pkg/handler/about/handler.go
@@ -26,7 +26,7 @@ func NewAboutHandler(configRepo configurationRepository) *AboutHandler {
return &AboutHandler{configRepo.GetRootReadme()}
}
-func (g *AboutHandler) About(w http.ResponseWriter, _ *http.Request) error {
+func (g *AboutHandler) About(w http.ResponseWriter, r *http.Request) error {
f, err := os.Open(g.readmePath)
if err != nil {
return err
@@ -50,6 +50,6 @@ func (g *AboutHandler) About(w http.ResponseWriter, _ *http.Request) error {
gitList := &templates.AboutPage{
Body: bs,
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
diff --git a/pkg/handler/auth/login.go b/pkg/handler/auth/login.go
index 7e77a67..7014548 100644
--- a/pkg/handler/auth/login.go
+++ b/pkg/handler/auth/login.go
@@ -1,20 +1,87 @@
package auth
import (
+ "encoding/base64"
"net/http"
+ "time"
"git.gabrielgio.me/cerrado/pkg/ext"
"git.gabrielgio.me/cerrado/templates"
)
type (
- LoginHandler struct{}
+ LoginHandler struct {
+ auth authService
+ }
+
+ authService interface {
+ CheckAuth(username, password string) bool
+ IssueToken() ([]byte, error)
+ }
)
+func NewLoginHandler(auth authService) *LoginHandler {
+ return &LoginHandler{
+ auth: auth,
+ }
+}
+
+func (g *LoginHandler) Logout(w http.ResponseWriter, r *http.Request) error {
+ cookie := &http.Cookie{
+ Name: "auth",
+ Value: "",
+ Path: "/",
+ Expires: time.Unix(0, 0),
+ }
+
+ referer := r.Header.Get("Referer")
+ if referer == "" {
+ referer = "/"
+ }
+
+ http.SetCookie(w, cookie)
+ ext.Redirect(w, referer)
+ return nil
+}
+
func (g *LoginHandler) Login(w http.ResponseWriter, r *http.Request) error {
- ext.SetHTML(w)
+ if r.Method == "GET" {
+ ext.SetHTML(w)
+
+ login := &templates.LoginPage{}
+ templates.WritePageTemplate(w, login, r.Context())
+ } else if r.Method == "POST" {
+
+ username := r.FormValue("username")
+ password := r.FormValue("password")
+
+ if !g.auth.CheckAuth(username, password) {
+ login := &templates.LoginPage{
+ ErrorMessage: "Invalid login",
+ }
+ templates.WritePageTemplate(w, login, r.Context())
+ } else {
+
+ bytes, err := g.auth.IssueToken()
+ if err != nil {
+ return err
+ }
+
+ cookie := &http.Cookie{
+ Name: "auth",
+ Value: base64.StdEncoding.EncodeToString(bytes),
+ Path: "/",
+ MaxAge: 3600,
+ HttpOnly: true,
+ Secure: true,
+ SameSite: http.SameSiteStrictMode,
+ }
+
+ http.SetCookie(w, cookie)
+ ext.Redirect(w, "/")
+ }
+
+ }
- login := &templates.LoginPage{}
- templates.WritePageTemplate(w, login)
return nil
}
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
index 5739c8e..4276159 100644
--- a/pkg/handler/git/handler.go
+++ b/pkg/handler/git/handler.go
@@ -43,7 +43,7 @@ func NewGitHandler(gitService *service.GitService, confRepo configurationReposit
}
}
-func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error {
+func (g *GitHandler) List(w http.ResponseWriter, r *http.Request) error {
repos, err := g.gitService.ListRepositories()
if err != nil {
return err
@@ -73,7 +73,7 @@ func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error {
Respositories: repos,
About: bs,
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -85,7 +85,7 @@ func (g *GitHandler) Archive(w http.ResponseWriter, r *http.Request) error {
// TODO: remove it once we can support more than gzip
if !strings.HasSuffix(file, ".tar.gz") {
- ext.NotFound(w)
+ ext.NotFound(w, r)
return nil
}
@@ -135,7 +135,7 @@ func (g *GitHandler) Summary(w http.ResponseWriter, r *http.Request) error {
Commits: commits,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -155,7 +155,7 @@ func (g *GitHandler) About(w http.ResponseWriter, r *http.Request) error {
GitItemBase: &templates.GitItemAboutPage{
About: []byte("About file not configured properly"),
},
- })
+ }, r.Context())
return nil
}
if err != nil {
@@ -179,7 +179,7 @@ func (g *GitHandler) About(w http.ResponseWriter, r *http.Request) error {
About: bs,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -210,7 +210,7 @@ func (g *GitHandler) Refs(w http.ResponseWriter, r *http.Request) error {
Branches: branches,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -239,7 +239,7 @@ func (g *GitHandler) Tree(w http.ResponseWriter, r *http.Request) error {
Tree: tree,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -270,7 +270,7 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *http.Request) error {
Content: []byte("Binary file"),
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -307,7 +307,7 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *http.Request) error {
Content: code.Bytes(),
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -328,7 +328,7 @@ func (g *GitHandler) Log(w http.ResponseWriter, r *http.Request) error {
Commits: commits,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
@@ -355,7 +355,7 @@ func (g *GitHandler) Commit(w http.ResponseWriter, r *http.Request) error {
Diff: diff,
},
}
- templates.WritePageTemplate(w, gitList)
+ templates.WritePageTemplate(w, gitList, r.Context())
return nil
}
diff --git a/pkg/handler/router.go b/pkg/handler/router.go
index 32bd78a..ee4081b 100644
--- a/pkg/handler/router.go
+++ b/pkg/handler/router.go
@@ -17,12 +17,13 @@ import (
// its sub package don't leak in other places.
func MountHandler(
gitService *service.GitService,
+ authService *service.AuthService,
configRepo *serverconfig.ConfigurationRepository,
) (http.Handler, error) {
var (
gitHandler = git.NewGitHandler(gitService, configRepo)
aboutHandler = about.NewAboutHandler(configRepo)
- loginHandler = &auth.LoginHandler{}
+ loginHandler = auth.NewLoginHandler(authService)
)
staticHandler, err := static.ServeStaticHandler()
@@ -32,10 +33,12 @@ func MountHandler(
mux := ext.NewRouter()
mux.AddMiddleware(ext.Compress)
+ mux.AddMiddleware(ext.Authenticate(authService))
mux.AddMiddleware(ext.Log)
mux.HandleFunc("/static/{file}", staticHandler)
mux.HandleFunc("/login/{$}", loginHandler.Login)
+ mux.HandleFunc("/logout/{$}", loginHandler.Logout)
mux.HandleFunc("/{name}/about/{$}", gitHandler.About)
mux.HandleFunc("/{name}/", gitHandler.Summary)
mux.HandleFunc("/{name}/refs/{$}", gitHandler.Refs)
diff --git a/pkg/service/auth.go b/pkg/service/auth.go
index 1fbf4b6..0dbd960 100644
--- a/pkg/service/auth.go
+++ b/pkg/service/auth.go
@@ -23,7 +23,13 @@ type (
}
)
-var tokenSeed = []byte("cerrado")
+var tokenSeed = []byte("this is a token for cerrado")
+
+func NewAuthService(repostiory authRepository) *AuthService {
+ return &AuthService{
+ authRepository: repostiory,
+ }
+}
func (a *AuthService) CheckAuth(username, password string) bool {
passphrase := a.authRepository.GetPassphrase()
diff --git a/pkg/service/git.go b/pkg/service/git.go
index f03ba42..6c3912f 100644
--- a/pkg/service/git.go
+++ b/pkg/service/git.go
@@ -30,9 +30,7 @@ type (
}
)
-var (
- ErrRepositoryNotFound = errors.New("Repository not found")
-)
+var ErrRepositoryNotFound = errors.New("Repository not found")
// TODO: make it configurable
const timeFormat = "2006.01.02 15:04:05"
diff --git a/templates/about.qtpl b/templates/about.qtpl
index faee50e..cfbf0d9 100644
--- a/templates/about.qtpl
+++ b/templates/about.qtpl
@@ -1,16 +1,19 @@
+{% import "context" %}
+
{% code
type AboutPage struct {
+ LoggedIn bool
Body []byte
}
%}
-{% func (p *AboutPage) Title() %}Hello{% endfunc %}
+{% func (p *AboutPage) Title(ctx context.Context) %}Hello{% endfunc %}
-{% func (p *AboutPage) Navbar() %}{%= Navbar(About) %}{% endfunc %}
+{% func (p *AboutPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, About) %}{% endfunc %}
-{% func (p *AboutPage) Content() %}
+{% func (p *AboutPage) Content(ctx context.Context) %}
{%z= p.Body %}
{% endfunc %}
-{% func (p *AboutPage) Script() %}
+{% func (p *AboutPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/about.qtpl.go b/templates/about.qtpl.go
index 2c07ceb..a640f7e 100644
--- a/templates/about.qtpl.go
+++ b/templates/about.qtpl.go
@@ -5,130 +5,100 @@
package templates
//line templates/about.qtpl:1
+import "context"
+
+//line templates/about.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/about.qtpl:1
+//line templates/about.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/about.qtpl:2
+//line templates/about.qtpl:4
type AboutPage struct {
- Body []byte
+ LoggedIn bool
+ Body []byte
}
-//line templates/about.qtpl:7
-func (p *AboutPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+func (p *AboutPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:10
qw422016.N().S(`Hello`)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
}
-//line templates/about.qtpl:7
-func (p *AboutPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+func (p *AboutPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:10
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/about.qtpl:7
- p.StreamTitle(qw422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+ p.StreamTitle(qw422016, ctx)
+//line templates/about.qtpl:10
qt422016.ReleaseWriter(qw422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
}
-//line templates/about.qtpl:7
-func (p *AboutPage) Title() string {
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+func (p *AboutPage) Title(ctx context.Context) string {
+//line templates/about.qtpl:10
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/about.qtpl:7
- p.WriteTitle(qb422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
+ p.WriteTitle(qb422016, ctx)
+//line templates/about.qtpl:10
qs422016 := string(qb422016.B)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/about.qtpl:7
+//line templates/about.qtpl:10
return qs422016
-//line templates/about.qtpl:7
-}
-
-//line templates/about.qtpl:9
-func (p *AboutPage) StreamNavbar(qw422016 *qt422016.Writer) {
-//line templates/about.qtpl:9
- StreamNavbar(qw422016, About)
-//line templates/about.qtpl:9
+//line templates/about.qtpl:10
}
-//line templates/about.qtpl:9
-func (p *AboutPage) WriteNavbar(qq422016 qtio422016.Writer) {
-//line templates/about.qtpl:9
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/about.qtpl:9
- p.StreamNavbar(qw422016)
-//line templates/about.qtpl:9
- qt422016.ReleaseWriter(qw422016)
-//line templates/about.qtpl:9
-}
-
-//line templates/about.qtpl:9
-func (p *AboutPage) Navbar() string {
-//line templates/about.qtpl:9
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/about.qtpl:9
- p.WriteNavbar(qb422016)
-//line templates/about.qtpl:9
- qs422016 := string(qb422016.B)
-//line templates/about.qtpl:9
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/about.qtpl:9
- return qs422016
-//line templates/about.qtpl:9
-}
-
-//line templates/about.qtpl:11
-func (p *AboutPage) StreamContent(qw422016 *qt422016.Writer) {
-//line templates/about.qtpl:11
- qw422016.N().S(`
-`)
//line templates/about.qtpl:12
- qw422016.N().Z(p.Body)
+func (p *AboutPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:12
+ StreamNavbar(qw422016, ctx, About)
//line templates/about.qtpl:12
- qw422016.N().S(`
-`)
-//line templates/about.qtpl:13
}
-//line templates/about.qtpl:13
-func (p *AboutPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+func (p *AboutPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:12
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/about.qtpl:13
- p.StreamContent(qw422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+ p.StreamNavbar(qw422016, ctx)
+//line templates/about.qtpl:12
qt422016.ReleaseWriter(qw422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
}
-//line templates/about.qtpl:13
-func (p *AboutPage) Content() string {
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+func (p *AboutPage) Navbar(ctx context.Context) string {
+//line templates/about.qtpl:12
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/about.qtpl:13
- p.WriteContent(qb422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
+ p.WriteNavbar(qb422016, ctx)
+//line templates/about.qtpl:12
qs422016 := string(qb422016.B)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
return qs422016
-//line templates/about.qtpl:13
+//line templates/about.qtpl:12
}
+//line templates/about.qtpl:14
+func (p *AboutPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:14
+ qw422016.N().S(`
+`)
//line templates/about.qtpl:15
-func (p *AboutPage) StreamScript(qw422016 *qt422016.Writer) {
+ qw422016.N().Z(p.Body)
//line templates/about.qtpl:15
qw422016.N().S(`
`)
@@ -136,22 +106,22 @@ func (p *AboutPage) StreamScript(qw422016 *qt422016.Writer) {
}
//line templates/about.qtpl:16
-func (p *AboutPage) WriteScript(qq422016 qtio422016.Writer) {
+func (p *AboutPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
//line templates/about.qtpl:16
qw422016 := qt422016.AcquireWriter(qq422016)
//line templates/about.qtpl:16
- p.StreamScript(qw422016)
+ p.StreamContent(qw422016, ctx)
//line templates/about.qtpl:16
qt422016.ReleaseWriter(qw422016)
//line templates/about.qtpl:16
}
//line templates/about.qtpl:16
-func (p *AboutPage) Script() string {
+func (p *AboutPage) Content(ctx context.Context) string {
//line templates/about.qtpl:16
qb422016 := qt422016.AcquireByteBuffer()
//line templates/about.qtpl:16
- p.WriteScript(qb422016)
+ p.WriteContent(qb422016, ctx)
//line templates/about.qtpl:16
qs422016 := string(qb422016.B)
//line templates/about.qtpl:16
@@ -160,3 +130,37 @@ func (p *AboutPage) Script() string {
return qs422016
//line templates/about.qtpl:16
}
+
+//line templates/about.qtpl:18
+func (p *AboutPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:18
+ qw422016.N().S(`
+`)
+//line templates/about.qtpl:19
+}
+
+//line templates/about.qtpl:19
+func (p *AboutPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/about.qtpl:19
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line templates/about.qtpl:19
+ p.StreamScript(qw422016, ctx)
+//line templates/about.qtpl:19
+ qt422016.ReleaseWriter(qw422016)
+//line templates/about.qtpl:19
+}
+
+//line templates/about.qtpl:19
+func (p *AboutPage) Script(ctx context.Context) string {
+//line templates/about.qtpl:19
+ qb422016 := qt422016.AcquireByteBuffer()
+//line templates/about.qtpl:19
+ p.WriteScript(qb422016, ctx)
+//line templates/about.qtpl:19
+ qs422016 := string(qb422016.B)
+//line templates/about.qtpl:19
+ qt422016.ReleaseByteBuffer(qb422016)
+//line templates/about.qtpl:19
+ return qs422016
+//line templates/about.qtpl:19
+}
diff --git a/templates/base.qtpl b/templates/base.qtpl
index 566308f..2a42cb8 100644
--- a/templates/base.qtpl
+++ b/templates/base.qtpl
@@ -1,5 +1,6 @@
This is a base page template. All the other template pages implement this interface.
+{% import "context" %}
{% import "strconv" %}
{% import "time" %}
@@ -9,10 +10,10 @@ This is a base page template. All the other template pages implement this interf
{% interface
Page {
- Title()
- Content()
- Script()
- Navbar()
+ Title(ctx context.Context)
+ Content(ctx context.Context)
+ Script(ctx context.Context)
+ Navbar(ctx context.Context)
}
%}
@@ -25,6 +26,8 @@ Page {
}
%}
+
+
{% code func TimeFormat(t time.Time) string {
return t.Format("02.01.2006")
}
@@ -35,24 +38,30 @@ Page {
}
%}
+{% code func IsLoggedIn(ctx context.Context) bool {
+ t, ok := ctx.Value("logged").(bool)
+ return ok && t
+ }
+%}
+
Page prints a page implementing Page interface.
-{% func PageTemplate(p Page) %}
+{% func PageTemplate(p Page, ctx context.Context) %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="icon" href="data:,">
- <title>{%= p.Title() %}</title>
+ <title>{%= p.Title(ctx) %}</title>
<link rel="stylesheet" href="/static/main{%s Slug %}.css">
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
- {%= p.Navbar() %}
+ {%= p.Navbar(ctx) %}
<div class="container">
- {%= p.Content() %}
+ {%= p.Content(ctx) %}
</div>
</body>
- {%= p.Script() %}
+ {%= p.Script(ctx) %}
</html>
{% endfunc %}
diff --git a/templates/base.qtpl.go b/templates/base.qtpl.go
index f8ff91f..5bb4532 100644
--- a/templates/base.qtpl.go
+++ b/templates/base.qtpl.go
@@ -8,57 +8,60 @@
package templates
//line templates/base.qtpl:3
-import "strconv"
+import "context"
//line templates/base.qtpl:4
+import "strconv"
+
+//line templates/base.qtpl:5
import "time"
-//line templates/base.qtpl:6
+//line templates/base.qtpl:7
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/base.qtpl:6
+//line templates/base.qtpl:7
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/base.qtpl:7
+//line templates/base.qtpl:8
var Slug = ""
-//line templates/base.qtpl:11
+//line templates/base.qtpl:12
type Page interface {
-//line templates/base.qtpl:11
- Title() string
-//line templates/base.qtpl:11
- StreamTitle(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteTitle(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
- Content() string
-//line templates/base.qtpl:11
- StreamContent(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteContent(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
- Script() string
-//line templates/base.qtpl:11
- StreamScript(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteScript(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
- Navbar() string
-//line templates/base.qtpl:11
- StreamNavbar(qw422016 *qt422016.Writer)
-//line templates/base.qtpl:11
- WriteNavbar(qq422016 qtio422016.Writer)
-//line templates/base.qtpl:11
+//line templates/base.qtpl:12
+ Title(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamTitle(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteTitle(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ Content(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamContent(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteContent(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ Script(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamScript(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteScript(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ Navbar(ctx context.Context) string
+//line templates/base.qtpl:12
+ StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
+ WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context)
+//line templates/base.qtpl:12
}
-//line templates/base.qtpl:20
+//line templates/base.qtpl:21
func FromUInttoString(u *uint) string {
if u != nil {
return strconv.FormatUint(uint64(*u), 10)
@@ -66,21 +69,27 @@ func FromUInttoString(u *uint) string {
return ""
}
-//line templates/base.qtpl:28
+//line templates/base.qtpl:31
func TimeFormat(t time.Time) string {
return t.Format("02.01.2006")
}
-//line templates/base.qtpl:33
+//line templates/base.qtpl:36
func Ignore[T any](v T, _ error) T {
return v
}
+//line templates/base.qtpl:41
+func IsLoggedIn(ctx context.Context) bool {
+ t, ok := ctx.Value("logged").(bool)
+ return ok && t
+}
+
// Page prints a page implementing Page interface.
-//line templates/base.qtpl:39
-func StreamPageTemplate(qw422016 *qt422016.Writer, p Page) {
-//line templates/base.qtpl:39
+//line templates/base.qtpl:48
+func StreamPageTemplate(qw422016 *qt422016.Writer, p Page, ctx context.Context) {
+//line templates/base.qtpl:48
qw422016.N().S(`
<!DOCTYPE html>
<html lang="en">
@@ -88,64 +97,64 @@ func StreamPageTemplate(qw422016 *qt422016.Writer, p Page) {
<meta charset="utf-8">
<link rel="icon" href="data:,">
<title>`)
-//line templates/base.qtpl:45
- p.StreamTitle(qw422016)
-//line templates/base.qtpl:45
+//line templates/base.qtpl:54
+ p.StreamTitle(qw422016, ctx)
+//line templates/base.qtpl:54
qw422016.N().S(`</title>
<link rel="stylesheet" href="/static/main`)
-//line templates/base.qtpl:46
+//line templates/base.qtpl:55
qw422016.E().S(Slug)
-//line templates/base.qtpl:46
+//line templates/base.qtpl:55
qw422016.N().S(`.css">
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
`)
-//line templates/base.qtpl:51
- p.StreamNavbar(qw422016)
-//line templates/base.qtpl:51
+//line templates/base.qtpl:60
+ p.StreamNavbar(qw422016, ctx)
+//line templates/base.qtpl:60
qw422016.N().S(`
<div class="container">
`)
-//line templates/base.qtpl:53
- p.StreamContent(qw422016)
-//line templates/base.qtpl:53
+//line templates/base.qtpl:62
+ p.StreamContent(qw422016, ctx)
+//line templates/base.qtpl:62
qw422016.N().S(`
</div>
</body>
`)
-//line templates/base.qtpl:56
- p.StreamScript(qw422016)
-//line templates/base.qtpl:56
+//line templates/base.qtpl:65
+ p.StreamScript(qw422016, ctx)
+//line templates/base.qtpl:65
qw422016.N().S(`
</html>
`)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
}
-//line templates/base.qtpl:58
-func WritePageTemplate(qq422016 qtio422016.Writer, p Page) {
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+func WritePageTemplate(qq422016 qtio422016.Writer, p Page, ctx context.Context) {
+//line templates/base.qtpl:67
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/base.qtpl:58
- StreamPageTemplate(qw422016, p)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+ StreamPageTemplate(qw422016, p, ctx)
+//line templates/base.qtpl:67
qt422016.ReleaseWriter(qw422016)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
}
-//line templates/base.qtpl:58
-func PageTemplate(p Page) string {
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+func PageTemplate(p Page, ctx context.Context) string {
+//line templates/base.qtpl:67
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/base.qtpl:58
- WritePageTemplate(qb422016, p)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
+ WritePageTemplate(qb422016, p, ctx)
+//line templates/base.qtpl:67
qs422016 := string(qb422016.B)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
return qs422016
-//line templates/base.qtpl:58
+//line templates/base.qtpl:67
}
diff --git a/templates/error.qtpl b/templates/error.qtpl
index 771d533..65e1321 100644
--- a/templates/error.qtpl
+++ b/templates/error.qtpl
@@ -1,16 +1,18 @@
+{% import "context" %}
+
{% code
type ErrorPage struct {
Message string
}
%}
-{% func (p *ErrorPage) Title() %}Error{% endfunc %}
+{% func (p *ErrorPage) Title(ctx context.Context) %}Error{% endfunc %}
-{% func (p *ErrorPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
+{% func (p *ErrorPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Git) %}{% endfunc %}
-{% func (p *ErrorPage) Content() %}
+{% func (p *ErrorPage) Content(ctx context.Context) %}
{%s p.Message %}
{% endfunc %}
-{% func (p *ErrorPage) Script() %}
+{% func (p *ErrorPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/error.qtpl.go b/templates/error.qtpl.go
index f415968..d4732c5 100644
--- a/templates/error.qtpl.go
+++ b/templates/error.qtpl.go
@@ -5,80 +5,50 @@
package templates
//line templates/error.qtpl:1
+import "context"
+
+//line templates/error.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/error.qtpl:1
+//line templates/error.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/error.qtpl:2
+//line templates/error.qtpl:4
type ErrorPage struct {
Message string
}
-//line templates/error.qtpl:7
-func (p *ErrorPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/error.qtpl:7
- qw422016.N().S(`Error`)
-//line templates/error.qtpl:7
-}
-
-//line templates/error.qtpl:7
-func (p *ErrorPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/error.qtpl:7
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/error.qtpl:7
- p.StreamTitle(qw422016)
-//line templates/error.qtpl:7
- qt422016.ReleaseWriter(qw422016)
-//line templates/error.qtpl:7
-}
-
-//line templates/error.qtpl:7
-func (p *ErrorPage) Title() string {
-//line templates/error.qtpl:7
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/error.qtpl:7
- p.WriteTitle(qb422016)
-//line templates/error.qtpl:7
- qs422016 := string(qb422016.B)
-//line templates/error.qtpl:7
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/error.qtpl:7
- return qs422016
-//line templates/error.qtpl:7
-}
-
//line templates/error.qtpl:9
-func (p *ErrorPage) StreamNavbar(qw422016 *qt422016.Writer) {
+func (p *ErrorPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
//line templates/error.qtpl:9
- StreamNavbar(qw422016, Git)
+ qw422016.N().S(`Error`)
//line templates/error.qtpl:9
}
//line templates/error.qtpl:9
-func (p *ErrorPage) WriteNavbar(qq422016 qtio422016.Writer) {
+func (p *ErrorPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
//line templates/error.qtpl:9
qw422016 := qt422016.AcquireWriter(qq422016)
//line templates/error.qtpl:9
- p.StreamNavbar(qw422016)
+ p.StreamTitle(qw422016, ctx)
//line templates/error.qtpl:9
qt422016.ReleaseWriter(qw422016)
//line templates/error.qtpl:9
}
//line templates/error.qtpl:9
-func (p *ErrorPage) Navbar() string {
+func (p *ErrorPage) Title(ctx context.Context) string {
//line templates/error.qtpl:9
qb422016 := qt422016.AcquireByteBuffer()
//line templates/error.qtpl:9
- p.WriteNavbar(qb422016)
+ p.WriteTitle(qb422016, ctx)
//line templates/error.qtpl:9
qs422016 := string(qb422016.B)
//line templates/error.qtpl:9
@@ -89,74 +59,107 @@ func (p *ErrorPage) Navbar() string {
}
//line templates/error.qtpl:11
-func (p *ErrorPage) StreamContent(qw422016 *qt422016.Writer) {
+func (p *ErrorPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:11
+ StreamNavbar(qw422016, ctx, Git)
+//line templates/error.qtpl:11
+}
+
+//line templates/error.qtpl:11
+func (p *ErrorPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:11
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line templates/error.qtpl:11
+ p.StreamNavbar(qw422016, ctx)
+//line templates/error.qtpl:11
+ qt422016.ReleaseWriter(qw422016)
+//line templates/error.qtpl:11
+}
+
+//line templates/error.qtpl:11
+func (p *ErrorPage) Navbar(ctx context.Context) string {
+//line templates/error.qtpl:11
+ qb422016 := qt422016.AcquireByteBuffer()
//line templates/error.qtpl:11
+ p.WriteNavbar(qb422016, ctx)
+//line templates/error.qtpl:11
+ qs422016 := string(qb422016.B)
+//line templates/error.qtpl:11
+ qt422016.ReleaseByteBuffer(qb422016)
+//line templates/error.qtpl:11
+ return qs422016
+//line templates/error.qtpl:11
+}
+
+//line templates/error.qtpl:13
+func (p *ErrorPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:13
qw422016.N().S(`
`)
-//line templates/error.qtpl:12
+//line templates/error.qtpl:14
qw422016.E().S(p.Message)
-//line templates/error.qtpl:12
+//line templates/error.qtpl:14
qw422016.N().S(`
`)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
}
-//line templates/error.qtpl:13
-func (p *ErrorPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+func (p *ErrorPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:15
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/error.qtpl:13
- p.StreamContent(qw422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+ p.StreamContent(qw422016, ctx)
+//line templates/error.qtpl:15
qt422016.ReleaseWriter(qw422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
}
-//line templates/error.qtpl:13
-func (p *ErrorPage) Content() string {
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+func (p *ErrorPage) Content(ctx context.Context) string {
+//line templates/error.qtpl:15
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/error.qtpl:13
- p.WriteContent(qb422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
+ p.WriteContent(qb422016, ctx)
+//line templates/error.qtpl:15
qs422016 := string(qb422016.B)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
return qs422016
-//line templates/error.qtpl:13
+//line templates/error.qtpl:15
}
-//line templates/error.qtpl:15
-func (p *ErrorPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/error.qtpl:15
+//line templates/error.qtpl:17
+func (p *ErrorPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:17
qw422016.N().S(`
`)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
}
-//line templates/error.qtpl:16
-func (p *ErrorPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+func (p *ErrorPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/error.qtpl:18
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/error.qtpl:16
- p.StreamScript(qw422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+ p.StreamScript(qw422016, ctx)
+//line templates/error.qtpl:18
qt422016.ReleaseWriter(qw422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
}
-//line templates/error.qtpl:16
-func (p *ErrorPage) Script() string {
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+func (p *ErrorPage) Script(ctx context.Context) string {
+//line templates/error.qtpl:18
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/error.qtpl:16
- p.WriteScript(qb422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
+ p.WriteScript(qb422016, ctx)
+//line templates/error.qtpl:18
qs422016 := string(qb422016.B)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
return qs422016
-//line templates/error.qtpl:16
+//line templates/error.qtpl:18
}
diff --git a/templates/gititem.qtpl b/templates/gititem.qtpl
index a6a312d..c43bbfd 100644
--- a/templates/gititem.qtpl
+++ b/templates/gititem.qtpl
@@ -1,3 +1,5 @@
+{% import "context" %}
+
{% interface
GitItemBase {
Nav(name, ref string)
@@ -13,16 +15,16 @@ type GitItemPage struct {
}
%}
-{% func (p *GitItemPage) Title() %}Git | {%s p.Name %}{% endfunc %}
+{% func (p *GitItemPage) Title(ctx context.Context) %}Git | {%s p.Name %}{% endfunc %}
-{% func (p *GitItemPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
+{% func (p *GitItemPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Git) %}{% endfunc %}
-{% func (p *GitItemPage) Content() %}
+{% func (p *GitItemPage) Content(ctx context.Context) %}
{%= p.Nav(p.Name, p.Ref) %}
<div class="container">
{%= p.GitContent(p.Name, p.Ref) %}
</div>
{% endfunc %}
-{% func (p *GitItemPage) Script() %}
+{% func (p *GitItemPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/gititem.qtpl.go b/templates/gititem.qtpl.go
index c9a00b2..5292e44 100644
--- a/templates/gititem.qtpl.go
+++ b/templates/gititem.qtpl.go
@@ -5,101 +5,71 @@
package templates
//line templates/gititem.qtpl:1
+import "context"
+
+//line templates/gititem.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/gititem.qtpl:1
+//line templates/gititem.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
type GitItemBase interface {
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
Nav(name, ref string) string
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
StreamNav(qw422016 *qt422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
WriteNav(qq422016 qtio422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
GitContent(name, ref string) string
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
StreamGitContent(qw422016 *qt422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
WriteGitContent(qq422016 qtio422016.Writer, name, ref string)
-//line templates/gititem.qtpl:2
+//line templates/gititem.qtpl:4
}
-//line templates/gititem.qtpl:9
+//line templates/gititem.qtpl:11
type GitItemPage struct {
Name string
Ref string
GitItemBase
}
-//line templates/gititem.qtpl:16
-func (p *GitItemPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/gititem.qtpl:16
- qw422016.N().S(`Git | `)
-//line templates/gititem.qtpl:16
- qw422016.E().S(p.Name)
-//line templates/gititem.qtpl:16
-}
-
-//line templates/gititem.qtpl:16
-func (p *GitItemPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/gititem.qtpl:16
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gititem.qtpl:16
- p.StreamTitle(qw422016)
-//line templates/gititem.qtpl:16
- qt422016.ReleaseWriter(qw422016)
-//line templates/gititem.qtpl:16
-}
-
-//line templates/gititem.qtpl:16
-func (p *GitItemPage) Title() string {
-//line templates/gititem.qtpl:16
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gititem.qtpl:16
- p.WriteTitle(qb422016)
-//line templates/gititem.qtpl:16
- qs422016 := string(qb422016.B)
-//line templates/gititem.qtpl:16
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gititem.qtpl:16
- return qs422016
-//line templates/gititem.qtpl:16
-}
-
//line templates/gititem.qtpl:18
-func (p *GitItemPage) StreamNavbar(qw422016 *qt422016.Writer) {
+func (p *GitItemPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
//line templates/gititem.qtpl:18
- StreamNavbar(qw422016, Git)
+ qw422016.N().S(`Git | `)
+//line templates/gititem.qtpl:18
+ qw422016.E().S(p.Name)
//line templates/gititem.qtpl:18
}
//line templates/gititem.qtpl:18
-func (p *GitItemPage) WriteNavbar(qq422016 qtio422016.Writer) {
+func (p *GitItemPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
//line templates/gititem.qtpl:18
qw422016 := qt422016.AcquireWriter(qq422016)
//line templates/gititem.qtpl:18
- p.StreamNavbar(qw422016)
+ p.StreamTitle(qw422016, ctx)
//line templates/gititem.qtpl:18
qt422016.ReleaseWriter(qw422016)
//line templates/gititem.qtpl:18
}
//line templates/gititem.qtpl:18
-func (p *GitItemPage) Navbar() string {
+func (p *GitItemPage) Title(ctx context.Context) string {
//line templates/gititem.qtpl:18
qb422016 := qt422016.AcquireByteBuffer()
//line templates/gititem.qtpl:18
- p.WriteNavbar(qb422016)
+ p.WriteTitle(qb422016, ctx)
//line templates/gititem.qtpl:18
qs422016 := string(qb422016.B)
//line templates/gititem.qtpl:18
@@ -110,81 +80,114 @@ func (p *GitItemPage) Navbar() string {
}
//line templates/gititem.qtpl:20
-func (p *GitItemPage) StreamContent(qw422016 *qt422016.Writer) {
+func (p *GitItemPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:20
+ StreamNavbar(qw422016, ctx, Git)
+//line templates/gititem.qtpl:20
+}
+
+//line templates/gititem.qtpl:20
+func (p *GitItemPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:20
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line templates/gititem.qtpl:20
+ p.StreamNavbar(qw422016, ctx)
+//line templates/gititem.qtpl:20
+ qt422016.ReleaseWriter(qw422016)
+//line templates/gititem.qtpl:20
+}
+
+//line templates/gititem.qtpl:20
+func (p *GitItemPage) Navbar(ctx context.Context) string {
+//line templates/gititem.qtpl:20
+ qb422016 := qt422016.AcquireByteBuffer()
+//line templates/gititem.qtpl:20
+ p.WriteNavbar(qb422016, ctx)
+//line templates/gititem.qtpl:20
+ qs422016 := string(qb422016.B)
+//line templates/gititem.qtpl:20
+ qt422016.ReleaseByteBuffer(qb422016)
+//line templates/gititem.qtpl:20
+ return qs422016
//line templates/gititem.qtpl:20
+}
+
+//line templates/gititem.qtpl:22
+func (p *GitItemPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:22
qw422016.N().S(`
`)
-//line templates/gititem.qtpl:21
+//line templates/gititem.qtpl:23
p.StreamNav(qw422016, p.Name, p.Ref)
-//line templates/gititem.qtpl:21
+//line templates/gititem.qtpl:23
qw422016.N().S(`
<div class="container">
`)
-//line templates/gititem.qtpl:23
+//line templates/gititem.qtpl:25
p.StreamGitContent(qw422016, p.Name, p.Ref)
-//line templates/gititem.qtpl:23
+//line templates/gititem.qtpl:25
qw422016.N().S(`
</div>
`)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
}
-//line templates/gititem.qtpl:25
-func (p *GitItemPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+func (p *GitItemPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:27
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gititem.qtpl:25
- p.StreamContent(qw422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+ p.StreamContent(qw422016, ctx)
+//line templates/gititem.qtpl:27
qt422016.ReleaseWriter(qw422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
}
-//line templates/gititem.qtpl:25
-func (p *GitItemPage) Content() string {
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+func (p *GitItemPage) Content(ctx context.Context) string {
+//line templates/gititem.qtpl:27
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gititem.qtpl:25
- p.WriteContent(qb422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
+ p.WriteContent(qb422016, ctx)
+//line templates/gititem.qtpl:27
qs422016 := string(qb422016.B)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
return qs422016
-//line templates/gititem.qtpl:25
+//line templates/gititem.qtpl:27
}
-//line templates/gititem.qtpl:27
-func (p *GitItemPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/gititem.qtpl:27
+//line templates/gititem.qtpl:29
+func (p *GitItemPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:29
qw422016.N().S(`
`)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
}
-//line templates/gititem.qtpl:28
-func (p *GitItemPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+func (p *GitItemPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gititem.qtpl:30
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gititem.qtpl:28
- p.StreamScript(qw422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+ p.StreamScript(qw422016, ctx)
+//line templates/gititem.qtpl:30
qt422016.ReleaseWriter(qw422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
}
-//line templates/gititem.qtpl:28
-func (p *GitItemPage) Script() string {
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+func (p *GitItemPage) Script(ctx context.Context) string {
+//line templates/gititem.qtpl:30
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gititem.qtpl:28
- p.WriteScript(qb422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
+ p.WriteScript(qb422016, ctx)
+//line templates/gititem.qtpl:30
qs422016 := string(qb422016.B)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
return qs422016
-//line templates/gititem.qtpl:28
+//line templates/gititem.qtpl:30
}
diff --git a/templates/gitlist.qtpl b/templates/gitlist.qtpl
index 7c104ca..fa47008 100644
--- a/templates/gitlist.qtpl
+++ b/templates/gitlist.qtpl
@@ -1,4 +1,5 @@
{% import "git.gabrielgio.me/cerrado/pkg/service" %}
+{% import "context" %}
{% code
type GitListPage struct {
@@ -7,11 +8,11 @@ type GitListPage struct {
}
%}
-{% func (p *GitListPage) Title() %}Git | List{% endfunc %}
+{% func (p *GitListPage) Title(ctx context.Context) %}Git | List{% endfunc %}
-{% func (p *GitListPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
+{% func (p *GitListPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Git) %}{% endfunc %}
-{% func (p *GitListPage) Content() %}
+{% func (p *GitListPage) Content(ctx context.Context) %}
<div class="row">
<div class="col-md-6 order-last order-md-first">
<div class="event-list">
@@ -40,5 +41,5 @@ type GitListPage struct {
</div>
{% endfunc %}
-{% func (p *GitListPage) Script() %}
+{% func (p *GitListPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/gitlist.qtpl.go b/templates/gitlist.qtpl.go
index 29adbc6..601dbb2 100644
--- a/templates/gitlist.qtpl.go
+++ b/templates/gitlist.qtpl.go
@@ -7,159 +7,162 @@ package templates
//line templates/gitlist.qtpl:1
import "git.gabrielgio.me/cerrado/pkg/service"
-//line templates/gitlist.qtpl:3
+//line templates/gitlist.qtpl:2
+import "context"
+
+//line templates/gitlist.qtpl:4
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/gitlist.qtpl:3
+//line templates/gitlist.qtpl:4
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/gitlist.qtpl:4
+//line templates/gitlist.qtpl:5
type GitListPage struct {
Respositories []*service.Repository
About []byte
}
-//line templates/gitlist.qtpl:10
-func (p *GitListPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+func (p *GitListPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:11
qw422016.N().S(`Git | List`)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
}
-//line templates/gitlist.qtpl:10
-func (p *GitListPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+func (p *GitListPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:11
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:10
- p.StreamTitle(qw422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+ p.StreamTitle(qw422016, ctx)
+//line templates/gitlist.qtpl:11
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
}
-//line templates/gitlist.qtpl:10
-func (p *GitListPage) Title() string {
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+func (p *GitListPage) Title(ctx context.Context) string {
+//line templates/gitlist.qtpl:11
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:10
- p.WriteTitle(qb422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
+ p.WriteTitle(qb422016, ctx)
+//line templates/gitlist.qtpl:11
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
return qs422016
-//line templates/gitlist.qtpl:10
+//line templates/gitlist.qtpl:11
}
-//line templates/gitlist.qtpl:12
-func (p *GitListPage) StreamNavbar(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:12
- StreamNavbar(qw422016, Git)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+func (p *GitListPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:13
+ StreamNavbar(qw422016, ctx, Git)
+//line templates/gitlist.qtpl:13
}
-//line templates/gitlist.qtpl:12
-func (p *GitListPage) WriteNavbar(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+func (p *GitListPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:13
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:12
- p.StreamNavbar(qw422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+ p.StreamNavbar(qw422016, ctx)
+//line templates/gitlist.qtpl:13
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
}
-//line templates/gitlist.qtpl:12
-func (p *GitListPage) Navbar() string {
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+func (p *GitListPage) Navbar(ctx context.Context) string {
+//line templates/gitlist.qtpl:13
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:12
- p.WriteNavbar(qb422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
+ p.WriteNavbar(qb422016, ctx)
+//line templates/gitlist.qtpl:13
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
return qs422016
-//line templates/gitlist.qtpl:12
+//line templates/gitlist.qtpl:13
}
-//line templates/gitlist.qtpl:14
-func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:14
+//line templates/gitlist.qtpl:15
+func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:15
qw422016.N().S(`
<div class="row">
<div class="col-md-6 order-last order-md-first">
<div class="event-list">
`)
-//line templates/gitlist.qtpl:18
+//line templates/gitlist.qtpl:19
for _, r := range p.Respositories {
-//line templates/gitlist.qtpl:18
+//line templates/gitlist.qtpl:19
qw422016.N().S(`
<div class="event">
<h4>
<a href="/`)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.N().S(`/">`)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:21
+//line templates/gitlist.qtpl:22
qw422016.N().S(`</a>
</h4>
</hr>
<p>`)
-//line templates/gitlist.qtpl:24
+//line templates/gitlist.qtpl:25
qw422016.E().S(r.Description)
-//line templates/gitlist.qtpl:24
+//line templates/gitlist.qtpl:25
qw422016.N().S(`</p>
<p>
<a href="/`)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.N().S(`/log/`)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.E().S(r.Ref)
-//line templates/gitlist.qtpl:26
+//line templates/gitlist.qtpl:27
qw422016.N().S(`/">log</a>
<a href="/`)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.N().S(`/tree/`)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.E().S(r.Ref)
-//line templates/gitlist.qtpl:27
+//line templates/gitlist.qtpl:28
qw422016.N().S(`/">tree</a>
<a href="/`)
-//line templates/gitlist.qtpl:28
+//line templates/gitlist.qtpl:29
qw422016.E().S(r.Name)
-//line templates/gitlist.qtpl:28
+//line templates/gitlist.qtpl:29
qw422016.N().S(`/refs/">refs</a>
</p>
</div>
`)
-//line templates/gitlist.qtpl:31
+//line templates/gitlist.qtpl:32
}
-//line templates/gitlist.qtpl:31
+//line templates/gitlist.qtpl:32
qw422016.N().S(`
</div>
</div>
<div id="about" class="col-md-4 order-first order-md-last">
`)
-//line templates/gitlist.qtpl:35
+//line templates/gitlist.qtpl:36
qw422016.N().Z(p.About)
-//line templates/gitlist.qtpl:35
+//line templates/gitlist.qtpl:36
qw422016.N().S(`
<div class="alert alert-warning text-center" role="alert">
This project is under development, things may be broken or incomplete.
@@ -167,65 +170,65 @@ func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer) {
</div>
</div>
`)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
}
-//line templates/gitlist.qtpl:41
-func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:42
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:41
- p.StreamContent(qw422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+ p.StreamContent(qw422016, ctx)
+//line templates/gitlist.qtpl:42
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
}
-//line templates/gitlist.qtpl:41
-func (p *GitListPage) Content() string {
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+func (p *GitListPage) Content(ctx context.Context) string {
+//line templates/gitlist.qtpl:42
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:41
- p.WriteContent(qb422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
+ p.WriteContent(qb422016, ctx)
+//line templates/gitlist.qtpl:42
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
return qs422016
-//line templates/gitlist.qtpl:41
+//line templates/gitlist.qtpl:42
}
-//line templates/gitlist.qtpl:43
-func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/gitlist.qtpl:43
+//line templates/gitlist.qtpl:44
+func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:44
qw422016.N().S(`
`)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
}
-//line templates/gitlist.qtpl:44
-func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/gitlist.qtpl:45
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/gitlist.qtpl:44
- p.StreamScript(qw422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+ p.StreamScript(qw422016, ctx)
+//line templates/gitlist.qtpl:45
qt422016.ReleaseWriter(qw422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
}
-//line templates/gitlist.qtpl:44
-func (p *GitListPage) Script() string {
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+func (p *GitListPage) Script(ctx context.Context) string {
+//line templates/gitlist.qtpl:45
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/gitlist.qtpl:44
- p.WriteScript(qb422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
+ p.WriteScript(qb422016, ctx)
+//line templates/gitlist.qtpl:45
qs422016 := string(qb422016.B)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
return qs422016
-//line templates/gitlist.qtpl:44
+//line templates/gitlist.qtpl:45
}
diff --git a/templates/login.qtpl b/templates/login.qtpl
index eee5711..7815bd7 100644
--- a/templates/login.qtpl
+++ b/templates/login.qtpl
@@ -1,31 +1,41 @@
+{% import "context" %}
+
{% code
type LoginPage struct {
+ ErrorMessage string
}
%}
-{% func (p *LoginPage) Title() %}Hello{% endfunc %}
+{% func (p *LoginPage) Title(ctx context.Context) %}Hello{% endfunc %}
-{% func (p *LoginPage) Navbar() %}{%= Navbar(Login) %}{% endfunc %}
+{% func (p *LoginPage) Navbar(ctx context.Context) %}{%= Navbar(ctx, Login) %}{% endfunc %}
-{% func (p *LoginPage) Content() %}
+{% func (p *LoginPage) Content(ctx context.Context) %}
<div class="row">
<div class="col-md-6 offset-md-3">
- <form>
+ <form action="/login/" method="POST">
<div class="form-group m-3">
<label for="username" class="form-label">Username</label>
- <input type="text" class="form-control" id="username" aria-describedby="emailHelp">
+ <input type="text" class="form-control" name="username" id="username">
</div>
<div class="form-group m-3">
<label for="password" class="form-label">Password</label>
- <input type="password" class="form-control" id="password">
+ <input type="password" class="form-control" name="password" id="password">
</div>
<div class="form-group m-3">
<button type="submit" class="btn btn-primary">Login</button>
</div>
</form>
</div>
+ {% if p.ErrorMessage != "" %}
+ <div class="col-md-6 offset-md-3">
+ <div class="alert alert-warning text-center" >
+ {%s p.ErrorMessage %}
+ </div>
+ </div>
+ {% endif %}
</div>
{% endfunc %}
-{% func (p *LoginPage) Script() %}
+{% func (p *LoginPage) Script(ctx context.Context) %}
{% endfunc %}
diff --git a/templates/login.qtpl.go b/templates/login.qtpl.go
index 0d3d2b0..5c07a44 100644
--- a/templates/login.qtpl.go
+++ b/templates/login.qtpl.go
@@ -5,169 +5,192 @@
package templates
//line templates/login.qtpl:1
+import "context"
+
+//line templates/login.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/login.qtpl:1
+//line templates/login.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/login.qtpl:2
+//line templates/login.qtpl:4
type LoginPage struct {
+ ErrorMessage string
}
-//line templates/login.qtpl:6
-func (p *LoginPage) StreamTitle(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+func (p *LoginPage) StreamTitle(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:9
qw422016.N().S(`Hello`)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
}
-//line templates/login.qtpl:6
-func (p *LoginPage) WriteTitle(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+func (p *LoginPage) WriteTitle(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:9
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:6
- p.StreamTitle(qw422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+ p.StreamTitle(qw422016, ctx)
+//line templates/login.qtpl:9
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
}
-//line templates/login.qtpl:6
-func (p *LoginPage) Title() string {
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+func (p *LoginPage) Title(ctx context.Context) string {
+//line templates/login.qtpl:9
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:6
- p.WriteTitle(qb422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
+ p.WriteTitle(qb422016, ctx)
+//line templates/login.qtpl:9
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
return qs422016
-//line templates/login.qtpl:6
+//line templates/login.qtpl:9
}
-//line templates/login.qtpl:8
-func (p *LoginPage) StreamNavbar(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:8
- StreamNavbar(qw422016, Login)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+func (p *LoginPage) StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:11
+ StreamNavbar(qw422016, ctx, Login)
+//line templates/login.qtpl:11
}
-//line templates/login.qtpl:8
-func (p *LoginPage) WriteNavbar(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+func (p *LoginPage) WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:11
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:8
- p.StreamNavbar(qw422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+ p.StreamNavbar(qw422016, ctx)
+//line templates/login.qtpl:11
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
}
-//line templates/login.qtpl:8
-func (p *LoginPage) Navbar() string {
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+func (p *LoginPage) Navbar(ctx context.Context) string {
+//line templates/login.qtpl:11
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:8
- p.WriteNavbar(qb422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
+ p.WriteNavbar(qb422016, ctx)
+//line templates/login.qtpl:11
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
return qs422016
-//line templates/login.qtpl:8
+//line templates/login.qtpl:11
}
-//line templates/login.qtpl:10
-func (p *LoginPage) StreamContent(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:10
+//line templates/login.qtpl:13
+func (p *LoginPage) StreamContent(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:13
qw422016.N().S(`
<div class="row">
<div class="col-md-6 offset-md-3">
- <form>
+ <form action="/login/" method="POST">
<div class="form-group m-3">
<label for="username" class="form-label">Username</label>
- <input type="text" class="form-control" id="username" aria-describedby="emailHelp">
+ <input type="text" class="form-control" name="username" id="username">
</div>
<div class="form-group m-3">
<label for="password" class="form-label">Password</label>
- <input type="password" class="form-control" id="password">
+ <input type="password" class="form-control" name="password" id="password">
</div>
<div class="form-group m-3">
<button type="submit" class="btn btn-primary">Login</button>
</div>
</form>
</div>
+ `)
+//line templates/login.qtpl:30
+ if p.ErrorMessage != "" {
+//line templates/login.qtpl:30
+ qw422016.N().S(`
+ <div class="col-md-6 offset-md-3">
+ <div class="alert alert-warning text-center" >
+ `)
+//line templates/login.qtpl:33
+ qw422016.E().S(p.ErrorMessage)
+//line templates/login.qtpl:33
+ qw422016.N().S(`
+ </div>
+ </div>
+ `)
+//line templates/login.qtpl:36
+ }
+//line templates/login.qtpl:36
+ qw422016.N().S(`
</div>
`)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
}
-//line templates/login.qtpl:28
-func (p *LoginPage) WriteContent(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+func (p *LoginPage) WriteContent(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:38
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:28
- p.StreamContent(qw422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+ p.StreamContent(qw422016, ctx)
+//line templates/login.qtpl:38
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
}
-//line templates/login.qtpl:28
-func (p *LoginPage) Content() string {
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+func (p *LoginPage) Content(ctx context.Context) string {
+//line templates/login.qtpl:38
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:28
- p.WriteContent(qb422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
+ p.WriteContent(qb422016, ctx)
+//line templates/login.qtpl:38
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
return qs422016
-//line templates/login.qtpl:28
+//line templates/login.qtpl:38
}
-//line templates/login.qtpl:30
-func (p *LoginPage) StreamScript(qw422016 *qt422016.Writer) {
-//line templates/login.qtpl:30
+//line templates/login.qtpl:40
+func (p *LoginPage) StreamScript(qw422016 *qt422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:40
qw422016.N().S(`
`)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
}
-//line templates/login.qtpl:31
-func (p *LoginPage) WriteScript(qq422016 qtio422016.Writer) {
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+func (p *LoginPage) WriteScript(qq422016 qtio422016.Writer, ctx context.Context) {
+//line templates/login.qtpl:41
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/login.qtpl:31
- p.StreamScript(qw422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+ p.StreamScript(qw422016, ctx)
+//line templates/login.qtpl:41
qt422016.ReleaseWriter(qw422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
}
-//line templates/login.qtpl:31
-func (p *LoginPage) Script() string {
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+func (p *LoginPage) Script(ctx context.Context) string {
+//line templates/login.qtpl:41
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/login.qtpl:31
- p.WriteScript(qb422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
+ p.WriteScript(qb422016, ctx)
+//line templates/login.qtpl:41
qs422016 := string(qb422016.B)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
return qs422016
-//line templates/login.qtpl:31
+//line templates/login.qtpl:41
}
diff --git a/templates/navbar.qtpl b/templates/navbar.qtpl
index 18400b1..3cd1b39 100644
--- a/templates/navbar.qtpl
+++ b/templates/navbar.qtpl
@@ -1,3 +1,5 @@
+{% import "context" %}
+
{% code
type Selection int
const (
@@ -22,13 +24,17 @@ const (
{% func insertIfEqual(s, d any) %}{% if s == d %} selected{% endif %}{% endfunc %}
-{% func Navbar (s Selection) %}
+{% func Navbar (ctx context.Context, s Selection) %}
<nav class="container navbar navbar-expand">
<div class="navbar-nav">
<a class="nav-link{%= insertIfEqual(s, Git) %}" href="/">git</a>
</div>
<div class="navbar-nav ms-auto">
+ {% if IsLoggedIn(ctx) %}
+ <a class="nav-link{%= insertIfEqual(s, Login) %}" href="/logout">logout</a>
+ {% else %}
<a class="nav-link{%= insertIfEqual(s, Login) %}" href="/login">login</a>
+ {% endif %}
{% comment %}
Add this back once needed
<a class="nav-link{%= insertIfEqual(s, List) %}" href="/list/">list</a>
diff --git a/templates/navbar.qtpl.go b/templates/navbar.qtpl.go
index e080785..d900c9c 100644
--- a/templates/navbar.qtpl.go
+++ b/templates/navbar.qtpl.go
@@ -5,19 +5,22 @@
package templates
//line templates/navbar.qtpl:1
+import "context"
+
+//line templates/navbar.qtpl:3
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line templates/navbar.qtpl:1
+//line templates/navbar.qtpl:3
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line templates/navbar.qtpl:2
+//line templates/navbar.qtpl:4
type Selection int
const (
@@ -28,7 +31,7 @@ const (
Login
)
-//line templates/navbar.qtpl:13
+//line templates/navbar.qtpl:15
type GitSelection int
const (
@@ -39,213 +42,233 @@ const (
Tree
)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
func streaminsertIfEqual(qw422016 *qt422016.Writer, s, d any) {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
if s == d {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qw422016.N().S(` selected`)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
func writeinsertIfEqual(qq422016 qtio422016.Writer, s, d any) {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
streaminsertIfEqual(qw422016, s, d)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
func insertIfEqual(s, d any) string {
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
writeinsertIfEqual(qb422016, s, d)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
return qs422016
-//line templates/navbar.qtpl:23
+//line templates/navbar.qtpl:25
}
-//line templates/navbar.qtpl:25
-func StreamNavbar(qw422016 *qt422016.Writer, s Selection) {
-//line templates/navbar.qtpl:25
+//line templates/navbar.qtpl:27
+func StreamNavbar(qw422016 *qt422016.Writer, ctx context.Context, s Selection) {
+//line templates/navbar.qtpl:27
qw422016.N().S(`
<nav class="container navbar navbar-expand">
<div class="navbar-nav">
<a class="nav-link`)
-//line templates/navbar.qtpl:28
+//line templates/navbar.qtpl:30
streaminsertIfEqual(qw422016, s, Git)
-//line templates/navbar.qtpl:28
+//line templates/navbar.qtpl:30
qw422016.N().S(`" href="/">git</a>
</div>
<div class="navbar-nav ms-auto">
+ `)
+//line templates/navbar.qtpl:33
+ if IsLoggedIn(ctx) {
+//line templates/navbar.qtpl:33
+ qw422016.N().S(`
<a class="nav-link`)
-//line templates/navbar.qtpl:31
- streaminsertIfEqual(qw422016, s, Login)
-//line templates/navbar.qtpl:31
- qw422016.N().S(`" href="/login">login</a>
-`)
+//line templates/navbar.qtpl:34
+ streaminsertIfEqual(qw422016, s, Login)
+//line templates/navbar.qtpl:34
+ qw422016.N().S(`" href="/logout">logout</a>
+ `)
+//line templates/navbar.qtpl:35
+ } else {
//line templates/navbar.qtpl:35
+ qw422016.N().S(`
+ <a class="nav-link`)
+//line templates/navbar.qtpl:36
+ streaminsertIfEqual(qw422016, s, Login)
+//line templates/navbar.qtpl:36
+ qw422016.N().S(`" href="/login">login</a>
+ `)
+//line templates/navbar.qtpl:37
+ }
+//line templates/navbar.qtpl:37
qw422016.N().S(`
`)
-//line templates/navbar.qtpl:39
+//line templates/navbar.qtpl:41
+ qw422016.N().S(`
+`)
+//line templates/navbar.qtpl:45
qw422016.N().S(`
</div>
</nav>
`)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
}
-//line templates/navbar.qtpl:42
-func WriteNavbar(qq422016 qtio422016.Writer, s Selection) {
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+func WriteNavbar(qq422016 qtio422016.Writer, ctx context.Context, s Selection) {
+//line templates/navbar.qtpl:48
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:42
- StreamNavbar(qw422016, s)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+ StreamNavbar(qw422016, ctx, s)
+//line templates/navbar.qtpl:48
qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
}
-//line templates/navbar.qtpl:42
-func Navbar(s Selection) string {
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+func Navbar(ctx context.Context, s Selection) string {
+//line templates/navbar.qtpl:48
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:42
- WriteNavbar(qb422016, s)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
+ WriteNavbar(qb422016, ctx, s)
+//line templates/navbar.qtpl:48
qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
return qs422016
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:48
}
-//line templates/navbar.qtpl:44
+//line templates/navbar.qtpl:50
func StreamGitItemNav(qw422016 *qt422016.Writer, name, ref string, s GitSelection) {
-//line templates/navbar.qtpl:44
+//line templates/navbar.qtpl:50
qw422016.N().S(`
<div class="row">
<h3 id="name">`)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.E().S(name)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.N().S(` `)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
if ref != "" && (s == Log || s == Tree) {
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.N().S(`@ `)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.E().S(ref)
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
}
-//line templates/navbar.qtpl:46
+//line templates/navbar.qtpl:52
qw422016.N().S(`</h3>
</div>
<div class="row">
<ul class="nav">
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
streaminsertIfEqual(qw422016, s, Readme)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
qw422016.E().S(name)
-//line templates/navbar.qtpl:51
+//line templates/navbar.qtpl:57
qw422016.N().S(`/about/">about</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
streaminsertIfEqual(qw422016, s, Summary)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
qw422016.E().S(name)
-//line templates/navbar.qtpl:54
+//line templates/navbar.qtpl:60
qw422016.N().S(`/">summary</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
streaminsertIfEqual(qw422016, s, Refs)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
qw422016.E().S(name)
-//line templates/navbar.qtpl:57
+//line templates/navbar.qtpl:63
qw422016.N().S(`/refs/">refs</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
streaminsertIfEqual(qw422016, s, Log)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.E().S(name)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.N().S(`/log/`)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.E().S(ref)
-//line templates/navbar.qtpl:60
+//line templates/navbar.qtpl:66
qw422016.N().S(`/">log</a>
</li>
<li class="nav-item">
<a class="nav-link`)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
streaminsertIfEqual(qw422016, s, Tree)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.E().S(name)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.N().S(`/tree/`)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.E().S(ref)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:69
qw422016.N().S(`/">tree</a>
</li>
</ul>
</div>
`)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
}
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
func WriteGitItemNav(qq422016 qtio422016.Writer, name, ref string, s GitSelection) {
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
StreamGitItemNav(qw422016, name, ref, s)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
}
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
func GitItemNav(name, ref string, s GitSelection) string {
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
WriteGitItemNav(qb422016, name, ref, s)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
return qs422016
-//line templates/navbar.qtpl:67
+//line templates/navbar.qtpl:73
}