Integrated optional bindata for the templatestags/v1.21.12.1
| @@ -29,6 +29,7 @@ _testmain.go | |||
| coverage.out | |||
| /modules/public/bindata.go | |||
| /modules/templates/bindata.go | |||
| *.db | |||
| *.log | |||
| @@ -7,7 +7,6 @@ package cmd | |||
| import ( | |||
| "crypto/tls" | |||
| "fmt" | |||
| "io/ioutil" | |||
| "net" | |||
| "net/http" | |||
| "net/http/fcgi" | |||
| @@ -15,7 +14,6 @@ import ( | |||
| "path" | |||
| "strings" | |||
| "code.gitea.io/git" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/auth" | |||
| "code.gitea.io/gitea/modules/bindata" | |||
| @@ -23,7 +21,7 @@ import ( | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/public" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/template" | |||
| "code.gitea.io/gitea/modules/templates" | |||
| "code.gitea.io/gitea/routers" | |||
| "code.gitea.io/gitea/routers/admin" | |||
| apiv1 "code.gitea.io/gitea/routers/api/v1" | |||
| @@ -39,10 +37,7 @@ import ( | |||
| "github.com/go-macaron/i18n" | |||
| "github.com/go-macaron/session" | |||
| "github.com/go-macaron/toolbox" | |||
| "github.com/go-xorm/xorm" | |||
| version "github.com/mcuadros/go-version" | |||
| "github.com/urfave/cli" | |||
| ini "gopkg.in/ini.v1" | |||
| macaron "gopkg.in/macaron.v1" | |||
| ) | |||
| @@ -74,45 +69,6 @@ type VerChecker struct { | |||
| Expected string | |||
| } | |||
| // checkVersion checks if binary matches the version of templates files. | |||
| func checkVersion() { | |||
| // Templates. | |||
| data, err := ioutil.ReadFile(setting.StaticRootPath + "/templates/.VERSION") | |||
| if err != nil { | |||
| log.Fatal(4, "Fail to read 'templates/.VERSION': %v", err) | |||
| } | |||
| tplVer := string(data) | |||
| if tplVer != setting.AppVer { | |||
| if version.Compare(tplVer, setting.AppVer, ">") { | |||
| log.Fatal(4, "Binary version is lower than template file version, did you forget to recompile Gogs?") | |||
| } else { | |||
| log.Fatal(4, "Binary version is higher than template file version, did you forget to update template files?") | |||
| } | |||
| } | |||
| // Check dependency version. | |||
| checkers := []VerChecker{ | |||
| {"github.com/go-xorm/xorm", func() string { return xorm.Version }, "0.5.5"}, | |||
| {"github.com/go-macaron/binding", binding.Version, "0.3.2"}, | |||
| {"github.com/go-macaron/cache", cache.Version, "0.1.2"}, | |||
| {"github.com/go-macaron/csrf", csrf.Version, "0.1.0"}, | |||
| {"github.com/go-macaron/i18n", i18n.Version, "0.3.0"}, | |||
| {"github.com/go-macaron/session", session.Version, "0.1.6"}, | |||
| {"github.com/go-macaron/toolbox", toolbox.Version, "0.1.0"}, | |||
| {"gopkg.in/ini.v1", ini.Version, "1.8.4"}, | |||
| {"gopkg.in/macaron.v1", macaron.Version, "1.1.7"}, | |||
| {"code.gitea.io/git", git.Version, "0.4.1"}, | |||
| } | |||
| for _, c := range checkers { | |||
| if !version.Compare(c.Version(), c.Expected, ">=") { | |||
| log.Fatal(4, `Dependency outdated! | |||
| Package '%s' current version (%s) is below requirement (%s), | |||
| please use following command to update this package and recompile Gogs: | |||
| go get -u %[1]s`, c.ImportPath, c.Version(), c.Expected) | |||
| } | |||
| } | |||
| } | |||
| // newMacaron initializes Macaron instance. | |||
| func newMacaron() *macaron.Macaron { | |||
| m := macaron.New() | |||
| @@ -140,15 +96,8 @@ func newMacaron() *macaron.Macaron { | |||
| }, | |||
| )) | |||
| funcMap := template.NewFuncMap() | |||
| m.Use(macaron.Renderer(macaron.RenderOptions{ | |||
| Directory: path.Join(setting.StaticRootPath, "templates"), | |||
| AppendDirectories: []string{path.Join(setting.CustomPath, "templates")}, | |||
| Funcs: funcMap, | |||
| IndentJSON: macaron.Env != macaron.PROD, | |||
| })) | |||
| models.InitMailRender(path.Join(setting.StaticRootPath, "templates/mail"), | |||
| path.Join(setting.CustomPath, "templates/mail"), funcMap) | |||
| m.Use(templates.Renderer()) | |||
| models.InitMailRender(templates.Mailer()) | |||
| localeNames, err := bindata.AssetDir("conf/locale") | |||
| if err != nil { | |||
| @@ -200,7 +149,6 @@ func runWeb(ctx *cli.Context) error { | |||
| setting.CustomConf = ctx.String("config") | |||
| } | |||
| routers.GlobalInit() | |||
| checkVersion() | |||
| m := newMacaron() | |||
| @@ -18,10 +18,10 @@ import ( | |||
| "code.gitea.io/git" | |||
| "code.gitea.io/gitea/modules/base" | |||
| "code.gitea.io/gitea/modules/highlight" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/process" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/template/highlight" | |||
| "github.com/Unknwon/com" | |||
| "github.com/sergi/go-diff/diffmatchpatch" | |||
| "golang.org/x/net/html/charset" | |||
| @@ -5,18 +5,18 @@ | |||
| package models | |||
| import ( | |||
| "bytes" | |||
| "fmt" | |||
| "html/template" | |||
| "path" | |||
| "gopkg.in/gomail.v2" | |||
| "gopkg.in/macaron.v1" | |||
| "code.gitea.io/gitea/modules/base" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/mailer" | |||
| "code.gitea.io/gitea/modules/markdown" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "gopkg.in/gomail.v2" | |||
| "gopkg.in/macaron.v1" | |||
| ) | |||
| const ( | |||
| @@ -31,27 +31,11 @@ const ( | |||
| mailNotifyCollaborator base.TplName = "notify/collaborator" | |||
| ) | |||
| type mailRenderInterface interface { | |||
| HTMLString(string, interface{}, ...macaron.HTMLOptions) (string, error) | |||
| } | |||
| var mailRender mailRenderInterface | |||
| var templates *template.Template | |||
| // InitMailRender initializes the macaron mail renderer | |||
| func InitMailRender(dir, appendDir string, funcMap []template.FuncMap) { | |||
| opt := &macaron.RenderOptions{ | |||
| Directory: dir, | |||
| AppendDirectories: []string{appendDir}, | |||
| Funcs: funcMap, | |||
| Extensions: []string{".tmpl", ".html"}, | |||
| } | |||
| ts := macaron.NewTemplateSet() | |||
| ts.Set(macaron.DEFAULT_TPL_SET_NAME, opt) | |||
| mailRender = &macaron.TplRender{ | |||
| TemplateSet: ts, | |||
| Opt: opt, | |||
| } | |||
| func InitMailRender(tmpls *template.Template) { | |||
| templates = tmpls | |||
| } | |||
| // SendTestMail sends a test mail | |||
| @@ -67,13 +51,15 @@ func SendUserMail(c *macaron.Context, u *User, tpl base.TplName, code, subject, | |||
| "ResetPwdCodeLives": setting.Service.ResetPwdCodeLives / 60, | |||
| "Code": code, | |||
| } | |||
| body, err := mailRender.HTMLString(string(tpl), data) | |||
| if err != nil { | |||
| log.Error(3, "HTMLString: %v", err) | |||
| var content bytes.Buffer | |||
| if err := templates.ExecuteTemplate(&content, string(tpl), data); err != nil { | |||
| log.Error(3, "Template: %v", err) | |||
| return | |||
| } | |||
| msg := mailer.NewMessage([]string{u.Email}, subject, body) | |||
| msg := mailer.NewMessage([]string{u.Email}, subject, content.String()) | |||
| msg.Info = fmt.Sprintf("UID: %d, %s", u.ID, info) | |||
| mailer.SendAsync(msg) | |||
| @@ -97,13 +83,15 @@ func SendActivateEmailMail(c *macaron.Context, u *User, email *EmailAddress) { | |||
| "Code": u.GenerateEmailActivateCode(email.Email), | |||
| "Email": email.Email, | |||
| } | |||
| body, err := mailRender.HTMLString(string(mailAuthActivateEmail), data) | |||
| if err != nil { | |||
| log.Error(3, "HTMLString: %v", err) | |||
| var content bytes.Buffer | |||
| if err := templates.ExecuteTemplate(&content, string(mailAuthActivateEmail), data); err != nil { | |||
| log.Error(3, "Template: %v", err) | |||
| return | |||
| } | |||
| msg := mailer.NewMessage([]string{email.Email}, c.Tr("mail.activate_email"), body) | |||
| msg := mailer.NewMessage([]string{email.Email}, c.Tr("mail.activate_email"), content.String()) | |||
| msg.Info = fmt.Sprintf("UID: %d, activate email", u.ID) | |||
| mailer.SendAsync(msg) | |||
| @@ -114,13 +102,15 @@ func SendRegisterNotifyMail(c *macaron.Context, u *User) { | |||
| data := map[string]interface{}{ | |||
| "Username": u.DisplayName(), | |||
| } | |||
| body, err := mailRender.HTMLString(string(mailAuthRegisterNotify), data) | |||
| if err != nil { | |||
| log.Error(3, "HTMLString: %v", err) | |||
| var content bytes.Buffer | |||
| if err := templates.ExecuteTemplate(&content, string(mailAuthRegisterNotify), data); err != nil { | |||
| log.Error(3, "Template: %v", err) | |||
| return | |||
| } | |||
| msg := mailer.NewMessage([]string{u.Email}, c.Tr("mail.register_notify"), body) | |||
| msg := mailer.NewMessage([]string{u.Email}, c.Tr("mail.register_notify"), content.String()) | |||
| msg.Info = fmt.Sprintf("UID: %d, registration notify", u.ID) | |||
| mailer.SendAsync(msg) | |||
| @@ -136,13 +126,15 @@ func SendCollaboratorMail(u, doer *User, repo *Repository) { | |||
| "RepoName": repoName, | |||
| "Link": repo.HTMLURL(), | |||
| } | |||
| body, err := mailRender.HTMLString(string(mailNotifyCollaborator), data) | |||
| if err != nil { | |||
| log.Error(3, "HTMLString: %v", err) | |||
| var content bytes.Buffer | |||
| if err := templates.ExecuteTemplate(&content, string(mailNotifyCollaborator), data); err != nil { | |||
| log.Error(3, "Template: %v", err) | |||
| return | |||
| } | |||
| msg := mailer.NewMessage([]string{u.Email}, subject, body) | |||
| msg := mailer.NewMessage([]string{u.Email}, subject, content.String()) | |||
| msg.Info = fmt.Sprintf("UID: %d, add collaborator", u.ID) | |||
| mailer.SendAsync(msg) | |||
| @@ -161,11 +153,14 @@ func composeIssueMessage(issue *Issue, doer *User, tplName base.TplName, tos []s | |||
| body := string(markdown.RenderSpecialLink([]byte(issue.Content), issue.Repo.HTMLURL(), issue.Repo.ComposeMetas())) | |||
| data := composeTplData(subject, body, issue.HTMLURL()) | |||
| data["Doer"] = doer | |||
| content, err := mailRender.HTMLString(string(tplName), data) | |||
| if err != nil { | |||
| log.Error(3, "HTMLString (%s): %v", tplName, err) | |||
| var content bytes.Buffer | |||
| if err := templates.ExecuteTemplate(&content, string(tplName), data); err != nil { | |||
| log.Error(3, "Template: %v", err) | |||
| } | |||
| msg := mailer.NewMessageFrom(tos, fmt.Sprintf(`"%s" <%s>`, doer.DisplayName(), setting.MailService.FromEmail), subject, content) | |||
| msg := mailer.NewMessageFrom(tos, fmt.Sprintf(`"%s" <%s>`, doer.DisplayName(), setting.MailService.FromEmail), subject, content.String()) | |||
| msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info) | |||
| return msg | |||
| } | |||
| @@ -6,6 +6,8 @@ package public | |||
| //go:generate go-bindata -tags "bindata" -ignore "\\.go|\\.less" -pkg "public" -o "bindata.go" ../../public/... | |||
| //go:generate go fmt bindata.go | |||
| //go:generate sed -i.bak s/..\/..\/public\/// bindata.go | |||
| //go:generate rm -f bindata.go.bak | |||
| // Options represents the available options to configure the macaron handler. | |||
| type Options struct { | |||
| @@ -22,7 +22,7 @@ func Static(opts *Options) macaron.Handler { | |||
| AssetDir: AssetDir, | |||
| AssetInfo: AssetInfo, | |||
| AssetNames: AssetNames, | |||
| Prefix: "../../public", | |||
| Prefix: "", | |||
| }), | |||
| }, | |||
| ) | |||
| @@ -0,0 +1,103 @@ | |||
| // +build !bindata | |||
| // Copyright 2016 The Gitea Authors. All rights reserved. | |||
| // Use of this source code is governed by a MIT-style | |||
| // license that can be found in the LICENSE file. | |||
| package templates | |||
| import ( | |||
| "html/template" | |||
| "io/ioutil" | |||
| "path" | |||
| "strings" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "github.com/Unknwon/com" | |||
| "gopkg.in/macaron.v1" | |||
| ) | |||
| var ( | |||
| templates = template.New("") | |||
| ) | |||
| // Renderer implements the macaron handler for serving the templates. | |||
| func Renderer() macaron.Handler { | |||
| return macaron.Renderer(macaron.RenderOptions{ | |||
| Funcs: NewFuncMap(), | |||
| Directory: path.Join(setting.StaticRootPath, "templates"), | |||
| AppendDirectories: []string{ | |||
| path.Join(setting.CustomPath, "templates"), | |||
| }, | |||
| }) | |||
| } | |||
| // Mailer provides the templates required for sending notification mails. | |||
| func Mailer() *template.Template { | |||
| for _, funcs := range NewFuncMap() { | |||
| templates.Funcs(funcs) | |||
| } | |||
| staticDir := path.Join(setting.StaticRootPath, "templates", "mail") | |||
| if com.IsDir(staticDir) { | |||
| files, err := com.StatDir(staticDir) | |||
| if err != nil { | |||
| log.Warn("Failed to read %s templates dir. %v", staticDir, err) | |||
| } else { | |||
| for _, filePath := range files { | |||
| if !strings.HasSuffix(filePath, ".tmpl") { | |||
| continue | |||
| } | |||
| content, err := ioutil.ReadFile(path.Join(staticDir, filePath)) | |||
| if err != nil { | |||
| log.Warn("Failed to read static %s template. %v", filePath, err) | |||
| continue | |||
| } | |||
| templates.New( | |||
| strings.TrimSuffix( | |||
| filePath, | |||
| ".tmpl", | |||
| ), | |||
| ).Parse(string(content)) | |||
| } | |||
| } | |||
| } | |||
| customDir := path.Join(setting.CustomPath, "templates", "mail") | |||
| if com.IsDir(customDir) { | |||
| files, err := com.StatDir(customDir) | |||
| if err != nil { | |||
| log.Warn("Failed to read %s templates dir. %v", customDir, err) | |||
| } else { | |||
| for _, filePath := range files { | |||
| if !strings.HasSuffix(filePath, ".tmpl") { | |||
| continue | |||
| } | |||
| content, err := ioutil.ReadFile(path.Join(customDir, filePath)) | |||
| if err != nil { | |||
| log.Warn("Failed to read custom %s template. %v", filePath, err) | |||
| continue | |||
| } | |||
| templates.New( | |||
| strings.TrimSuffix( | |||
| filePath, | |||
| ".tmpl", | |||
| ), | |||
| ).Parse(string(content)) | |||
| } | |||
| } | |||
| } | |||
| return templates | |||
| } | |||
| @@ -2,7 +2,7 @@ | |||
| // Use of this source code is governed by a MIT-style | |||
| // license that can be found in the LICENSE file. | |||
| package template | |||
| package templates | |||
| import ( | |||
| "container/list" | |||
| @@ -0,0 +1,109 @@ | |||
| // +build bindata | |||
| // Copyright 2016 The Gitea Authors. All rights reserved. | |||
| // Use of this source code is governed by a MIT-style | |||
| // license that can be found in the LICENSE file. | |||
| package templates | |||
| import ( | |||
| "html/template" | |||
| "io/ioutil" | |||
| "path" | |||
| "strings" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "github.com/Unknwon/com" | |||
| "github.com/go-macaron/bindata" | |||
| "gopkg.in/macaron.v1" | |||
| ) | |||
| var ( | |||
| templates = template.New("") | |||
| ) | |||
| // Renderer implements the macaron handler for serving the templates. | |||
| func Renderer() macaron.Handler { | |||
| return macaron.Renderer(macaron.RenderOptions{ | |||
| Funcs: NewFuncMap(), | |||
| AppendDirectories: []string{ | |||
| path.Join(setting.CustomPath, "templates"), | |||
| }, | |||
| TemplateFileSystem: bindata.Templates( | |||
| bindata.Options{ | |||
| Asset: Asset, | |||
| AssetDir: AssetDir, | |||
| AssetInfo: AssetInfo, | |||
| AssetNames: AssetNames, | |||
| Prefix: "", | |||
| }, | |||
| ), | |||
| }) | |||
| } | |||
| // Mailer provides the templates required for sending notification mails. | |||
| func Mailer() *template.Template { | |||
| for _, funcs := range NewFuncMap() { | |||
| templates.Funcs(funcs) | |||
| } | |||
| for _, assetPath := range AssetNames() { | |||
| if !strings.HasPrefix(assetPath, "mail/") { | |||
| continue | |||
| } | |||
| if !strings.HasSuffix(assetPath, ".tmpl") { | |||
| continue | |||
| } | |||
| content, err := Asset(assetPath) | |||
| if err != nil { | |||
| log.Warn("Failed to read embedded %s template. %v", assetPath, err) | |||
| continue | |||
| } | |||
| templates.New( | |||
| strings.TrimPrefix( | |||
| strings.TrimSuffix( | |||
| assetPath, | |||
| ".tmpl", | |||
| ), | |||
| "mail/", | |||
| ), | |||
| ).Parse(string(content)) | |||
| } | |||
| customDir := path.Join(setting.CustomPath, "templates", "mail") | |||
| if com.IsDir(customDir) { | |||
| files, err := com.StatDir(customDir) | |||
| if err != nil { | |||
| log.Warn("Failed to read %s templates dir. %v", customDir, err) | |||
| } else { | |||
| for _, filePath := range files { | |||
| if !strings.HasSuffix(filePath, ".tmpl") { | |||
| continue | |||
| } | |||
| content, err := ioutil.ReadFile(path.Join(customDir, filePath)) | |||
| if err != nil { | |||
| log.Warn("Failed to read custom %s template. %v", filePath, err) | |||
| continue | |||
| } | |||
| templates.New( | |||
| strings.TrimSuffix( | |||
| filePath, | |||
| ".tmpl", | |||
| ), | |||
| ).Parse(string(content)) | |||
| } | |||
| } | |||
| } | |||
| return templates | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| // Copyright 2016 The Gitea Authors. All rights reserved. | |||
| // Use of this source code is governed by a MIT-style | |||
| // license that can be found in the LICENSE file. | |||
| package templates | |||
| //go:generate go-bindata -tags "bindata" -ignore "\\.go" -pkg "templates" -o "bindata.go" ../../templates/... | |||
| //go:generate go fmt bindata.go | |||
| //go:generate sed -i.bak s/..\/..\/templates\/// bindata.go | |||
| //go:generate rm -f bindata.go.bak | |||
| @@ -11,12 +11,12 @@ import ( | |||
| "code.gitea.io/git" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/cron" | |||
| "code.gitea.io/gitea/modules/highlight" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/mailer" | |||
| "code.gitea.io/gitea/modules/markdown" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/ssh" | |||
| "code.gitea.io/gitea/modules/template/highlight" | |||
| macaron "gopkg.in/macaron.v1" | |||
| ) | |||
| @@ -18,7 +18,7 @@ import ( | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/template" | |||
| "code.gitea.io/gitea/modules/templates" | |||
| ) | |||
| const ( | |||
| @@ -74,7 +74,7 @@ func editFile(ctx *context.Context, isNewFile bool) { | |||
| d, _ := ioutil.ReadAll(dataRc) | |||
| buf = append(buf, d...) | |||
| if content, err := template.ToUTF8WithErr(buf); err != nil { | |||
| if content, err := templates.ToUTF8WithErr(buf); err != nil { | |||
| if err != nil { | |||
| log.Error(4, "ToUTF8WithErr: %v", err) | |||
| } | |||
| @@ -16,11 +16,11 @@ import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/base" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/highlight" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/markdown" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/template" | |||
| "code.gitea.io/gitea/modules/template/highlight" | |||
| "code.gitea.io/gitea/modules/templates" | |||
| "github.com/Unknwon/paginater" | |||
| ) | |||
| @@ -164,7 +164,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st | |||
| } else { | |||
| // Building code view blocks with line number on server side. | |||
| var fileContent string | |||
| if content, err := template.ToUTF8WithErr(buf); err != nil { | |||
| if content, err := templates.ToUTF8WithErr(buf); err != nil { | |||
| if err != nil { | |||
| log.Error(4, "ToUTF8WithErr: %s", err) | |||
| } | |||
| @@ -1 +0,0 @@ | |||
| 0.9.99.0915 | |||