Integrate templates into bindata optionally (#314)
Integrated optional bindata for the templates
This commit is contained in:
		
							parent
							
								
									1b5b297c39
								
							
						
					
					
						commit
						83ed234472
					
				
					 15 changed files with 274 additions and 107 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -29,6 +29,7 @@ _testmain.go | |||
| coverage.out | ||||
| 
 | ||||
| /modules/public/bindata.go | ||||
| /modules/templates/bindata.go | ||||
| 
 | ||||
| *.db | ||||
| *.log | ||||
|  |  | |||
							
								
								
									
										58
									
								
								cmd/web.go
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								cmd/web.go
									
									
									
									
									
								
							|  | @ -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:     "", | ||||
| 			}), | ||||
| 		}, | ||||
| 	) | ||||
|  |  | |||
							
								
								
									
										103
									
								
								modules/templates/dynamic.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								modules/templates/dynamic.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -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" | ||||
							
								
								
									
										109
									
								
								modules/templates/static.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								modules/templates/static.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
| } | ||||
							
								
								
									
										10
									
								
								modules/templates/templates.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								modules/templates/templates.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
		Loading…
	
		Reference in a new issue