mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Integrate templates into bindata optionally (#314)
Integrated optional bindata for the templates
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -29,6 +29,7 @@ _testmain.go | |||||||
| coverage.out | coverage.out | ||||||
|  |  | ||||||
| /modules/public/bindata.go | /modules/public/bindata.go | ||||||
|  | /modules/templates/bindata.go | ||||||
|  |  | ||||||
| *.db | *.db | ||||||
| *.log | *.log | ||||||
|   | |||||||
							
								
								
									
										58
									
								
								cmd/web.go
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								cmd/web.go
									
									
									
									
									
								
							| @@ -7,7 +7,6 @@ package cmd | |||||||
| import ( | import ( | ||||||
| 	"crypto/tls" | 	"crypto/tls" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io/ioutil" |  | ||||||
| 	"net" | 	"net" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/http/fcgi" | 	"net/http/fcgi" | ||||||
| @@ -15,7 +14,6 @@ import ( | |||||||
| 	"path" | 	"path" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"code.gitea.io/git" |  | ||||||
| 	"code.gitea.io/gitea/models" | 	"code.gitea.io/gitea/models" | ||||||
| 	"code.gitea.io/gitea/modules/auth" | 	"code.gitea.io/gitea/modules/auth" | ||||||
| 	"code.gitea.io/gitea/modules/bindata" | 	"code.gitea.io/gitea/modules/bindata" | ||||||
| @@ -23,7 +21,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/public" | 	"code.gitea.io/gitea/modules/public" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"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" | ||||||
| 	"code.gitea.io/gitea/routers/admin" | 	"code.gitea.io/gitea/routers/admin" | ||||||
| 	apiv1 "code.gitea.io/gitea/routers/api/v1" | 	apiv1 "code.gitea.io/gitea/routers/api/v1" | ||||||
| @@ -39,10 +37,7 @@ import ( | |||||||
| 	"github.com/go-macaron/i18n" | 	"github.com/go-macaron/i18n" | ||||||
| 	"github.com/go-macaron/session" | 	"github.com/go-macaron/session" | ||||||
| 	"github.com/go-macaron/toolbox" | 	"github.com/go-macaron/toolbox" | ||||||
| 	"github.com/go-xorm/xorm" |  | ||||||
| 	version "github.com/mcuadros/go-version" |  | ||||||
| 	"github.com/urfave/cli" | 	"github.com/urfave/cli" | ||||||
| 	ini "gopkg.in/ini.v1" |  | ||||||
| 	macaron "gopkg.in/macaron.v1" | 	macaron "gopkg.in/macaron.v1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -74,45 +69,6 @@ type VerChecker struct { | |||||||
| 	Expected   string | 	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. | // newMacaron initializes Macaron instance. | ||||||
| func newMacaron() *macaron.Macaron { | func newMacaron() *macaron.Macaron { | ||||||
| 	m := macaron.New() | 	m := macaron.New() | ||||||
| @@ -140,15 +96,8 @@ func newMacaron() *macaron.Macaron { | |||||||
| 		}, | 		}, | ||||||
| 	)) | 	)) | ||||||
|  |  | ||||||
| 	funcMap := template.NewFuncMap() | 	m.Use(templates.Renderer()) | ||||||
| 	m.Use(macaron.Renderer(macaron.RenderOptions{ | 	models.InitMailRender(templates.Mailer()) | ||||||
| 		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) |  | ||||||
|  |  | ||||||
| 	localeNames, err := bindata.AssetDir("conf/locale") | 	localeNames, err := bindata.AssetDir("conf/locale") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -200,7 +149,6 @@ func runWeb(ctx *cli.Context) error { | |||||||
| 		setting.CustomConf = ctx.String("config") | 		setting.CustomConf = ctx.String("config") | ||||||
| 	} | 	} | ||||||
| 	routers.GlobalInit() | 	routers.GlobalInit() | ||||||
| 	checkVersion() |  | ||||||
|  |  | ||||||
| 	m := newMacaron() | 	m := newMacaron() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,10 +18,10 @@ import ( | |||||||
|  |  | ||||||
| 	"code.gitea.io/git" | 	"code.gitea.io/git" | ||||||
| 	"code.gitea.io/gitea/modules/base" | 	"code.gitea.io/gitea/modules/base" | ||||||
|  | 	"code.gitea.io/gitea/modules/highlight" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/process" | 	"code.gitea.io/gitea/modules/process" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/template/highlight" |  | ||||||
| 	"github.com/Unknwon/com" | 	"github.com/Unknwon/com" | ||||||
| 	"github.com/sergi/go-diff/diffmatchpatch" | 	"github.com/sergi/go-diff/diffmatchpatch" | ||||||
| 	"golang.org/x/net/html/charset" | 	"golang.org/x/net/html/charset" | ||||||
|   | |||||||
| @@ -5,18 +5,18 @@ | |||||||
| package models | package models | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"bytes" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"html/template" | 	"html/template" | ||||||
| 	"path" | 	"path" | ||||||
|  |  | ||||||
| 	"gopkg.in/gomail.v2" |  | ||||||
| 	"gopkg.in/macaron.v1" |  | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/modules/base" | 	"code.gitea.io/gitea/modules/base" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/mailer" | 	"code.gitea.io/gitea/modules/mailer" | ||||||
| 	"code.gitea.io/gitea/modules/markdown" | 	"code.gitea.io/gitea/modules/markdown" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  | 	"gopkg.in/gomail.v2" | ||||||
|  | 	"gopkg.in/macaron.v1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @@ -31,27 +31,11 @@ const ( | |||||||
| 	mailNotifyCollaborator base.TplName = "notify/collaborator" | 	mailNotifyCollaborator base.TplName = "notify/collaborator" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type mailRenderInterface interface { | var templates *template.Template | ||||||
| 	HTMLString(string, interface{}, ...macaron.HTMLOptions) (string, error) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var mailRender mailRenderInterface |  | ||||||
|  |  | ||||||
| // InitMailRender initializes the macaron mail renderer | // InitMailRender initializes the macaron mail renderer | ||||||
| func InitMailRender(dir, appendDir string, funcMap []template.FuncMap) { | func InitMailRender(tmpls *template.Template) { | ||||||
| 	opt := &macaron.RenderOptions{ | 	templates = tmpls | ||||||
| 		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, |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // SendTestMail sends a test mail | // 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, | 		"ResetPwdCodeLives": setting.Service.ResetPwdCodeLives / 60, | ||||||
| 		"Code":              code, | 		"Code":              code, | ||||||
| 	} | 	} | ||||||
| 	body, err := mailRender.HTMLString(string(tpl), data) |  | ||||||
| 	if err != nil { | 	var content bytes.Buffer | ||||||
| 		log.Error(3, "HTMLString: %v", err) |  | ||||||
|  | 	if err := templates.ExecuteTemplate(&content, string(tpl), data); err != nil { | ||||||
|  | 		log.Error(3, "Template: %v", err) | ||||||
| 		return | 		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) | 	msg.Info = fmt.Sprintf("UID: %d, %s", u.ID, info) | ||||||
|  |  | ||||||
| 	mailer.SendAsync(msg) | 	mailer.SendAsync(msg) | ||||||
| @@ -97,13 +83,15 @@ func SendActivateEmailMail(c *macaron.Context, u *User, email *EmailAddress) { | |||||||
| 		"Code":            u.GenerateEmailActivateCode(email.Email), | 		"Code":            u.GenerateEmailActivateCode(email.Email), | ||||||
| 		"Email":           email.Email, | 		"Email":           email.Email, | ||||||
| 	} | 	} | ||||||
| 	body, err := mailRender.HTMLString(string(mailAuthActivateEmail), data) |  | ||||||
| 	if err != nil { | 	var content bytes.Buffer | ||||||
| 		log.Error(3, "HTMLString: %v", err) |  | ||||||
|  | 	if err := templates.ExecuteTemplate(&content, string(mailAuthActivateEmail), data); err != nil { | ||||||
|  | 		log.Error(3, "Template: %v", err) | ||||||
| 		return | 		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) | 	msg.Info = fmt.Sprintf("UID: %d, activate email", u.ID) | ||||||
|  |  | ||||||
| 	mailer.SendAsync(msg) | 	mailer.SendAsync(msg) | ||||||
| @@ -114,13 +102,15 @@ func SendRegisterNotifyMail(c *macaron.Context, u *User) { | |||||||
| 	data := map[string]interface{}{ | 	data := map[string]interface{}{ | ||||||
| 		"Username": u.DisplayName(), | 		"Username": u.DisplayName(), | ||||||
| 	} | 	} | ||||||
| 	body, err := mailRender.HTMLString(string(mailAuthRegisterNotify), data) |  | ||||||
| 	if err != nil { | 	var content bytes.Buffer | ||||||
| 		log.Error(3, "HTMLString: %v", err) |  | ||||||
|  | 	if err := templates.ExecuteTemplate(&content, string(mailAuthRegisterNotify), data); err != nil { | ||||||
|  | 		log.Error(3, "Template: %v", err) | ||||||
| 		return | 		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) | 	msg.Info = fmt.Sprintf("UID: %d, registration notify", u.ID) | ||||||
|  |  | ||||||
| 	mailer.SendAsync(msg) | 	mailer.SendAsync(msg) | ||||||
| @@ -136,13 +126,15 @@ func SendCollaboratorMail(u, doer *User, repo *Repository) { | |||||||
| 		"RepoName": repoName, | 		"RepoName": repoName, | ||||||
| 		"Link":     repo.HTMLURL(), | 		"Link":     repo.HTMLURL(), | ||||||
| 	} | 	} | ||||||
| 	body, err := mailRender.HTMLString(string(mailNotifyCollaborator), data) |  | ||||||
| 	if err != nil { | 	var content bytes.Buffer | ||||||
| 		log.Error(3, "HTMLString: %v", err) |  | ||||||
|  | 	if err := templates.ExecuteTemplate(&content, string(mailNotifyCollaborator), data); err != nil { | ||||||
|  | 		log.Error(3, "Template: %v", err) | ||||||
| 		return | 		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) | 	msg.Info = fmt.Sprintf("UID: %d, add collaborator", u.ID) | ||||||
|  |  | ||||||
| 	mailer.SendAsync(msg) | 	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())) | 	body := string(markdown.RenderSpecialLink([]byte(issue.Content), issue.Repo.HTMLURL(), issue.Repo.ComposeMetas())) | ||||||
| 	data := composeTplData(subject, body, issue.HTMLURL()) | 	data := composeTplData(subject, body, issue.HTMLURL()) | ||||||
| 	data["Doer"] = doer | 	data["Doer"] = doer | ||||||
| 	content, err := mailRender.HTMLString(string(tplName), data) |  | ||||||
| 	if err != nil { | 	var content bytes.Buffer | ||||||
| 		log.Error(3, "HTMLString (%s): %v", tplName, err) |  | ||||||
|  | 	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) | 	msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info) | ||||||
| 	return msg | 	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-bindata -tags "bindata" -ignore "\\.go|\\.less" -pkg "public" -o "bindata.go" ../../public/... | ||||||
| //go:generate go fmt bindata.go | //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. | // Options represents the available options to configure the macaron handler. | ||||||
| type Options struct { | type Options struct { | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ func Static(opts *Options) macaron.Handler { | |||||||
| 				AssetDir:   AssetDir, | 				AssetDir:   AssetDir, | ||||||
| 				AssetInfo:  AssetInfo, | 				AssetInfo:  AssetInfo, | ||||||
| 				AssetNames: AssetNames, | 				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 | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
| package template | package templates | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"container/list" | 	"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/git" | ||||||
| 	"code.gitea.io/gitea/models" | 	"code.gitea.io/gitea/models" | ||||||
| 	"code.gitea.io/gitea/modules/cron" | 	"code.gitea.io/gitea/modules/cron" | ||||||
|  | 	"code.gitea.io/gitea/modules/highlight" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/mailer" | 	"code.gitea.io/gitea/modules/mailer" | ||||||
| 	"code.gitea.io/gitea/modules/markdown" | 	"code.gitea.io/gitea/modules/markdown" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/ssh" | 	"code.gitea.io/gitea/modules/ssh" | ||||||
| 	"code.gitea.io/gitea/modules/template/highlight" |  | ||||||
| 	macaron "gopkg.in/macaron.v1" | 	macaron "gopkg.in/macaron.v1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/context" | 	"code.gitea.io/gitea/modules/context" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/template" | 	"code.gitea.io/gitea/modules/templates" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @@ -74,7 +74,7 @@ func editFile(ctx *context.Context, isNewFile bool) { | |||||||
|  |  | ||||||
| 		d, _ := ioutil.ReadAll(dataRc) | 		d, _ := ioutil.ReadAll(dataRc) | ||||||
| 		buf = append(buf, d...) | 		buf = append(buf, d...) | ||||||
| 		if content, err := template.ToUTF8WithErr(buf); err != nil { | 		if content, err := templates.ToUTF8WithErr(buf); err != nil { | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				log.Error(4, "ToUTF8WithErr: %v", err) | 				log.Error(4, "ToUTF8WithErr: %v", err) | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -16,11 +16,11 @@ import ( | |||||||
| 	"code.gitea.io/gitea/models" | 	"code.gitea.io/gitea/models" | ||||||
| 	"code.gitea.io/gitea/modules/base" | 	"code.gitea.io/gitea/modules/base" | ||||||
| 	"code.gitea.io/gitea/modules/context" | 	"code.gitea.io/gitea/modules/context" | ||||||
|  | 	"code.gitea.io/gitea/modules/highlight" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/markdown" | 	"code.gitea.io/gitea/modules/markdown" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/template" | 	"code.gitea.io/gitea/modules/templates" | ||||||
| 	"code.gitea.io/gitea/modules/template/highlight" |  | ||||||
| 	"github.com/Unknwon/paginater" | 	"github.com/Unknwon/paginater" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -164,7 +164,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st | |||||||
| 		} else { | 		} else { | ||||||
| 			// Building code view blocks with line number on server side. | 			// Building code view blocks with line number on server side. | ||||||
| 			var fileContent string | 			var fileContent string | ||||||
| 			if content, err := template.ToUTF8WithErr(buf); err != nil { | 			if content, err := templates.ToUTF8WithErr(buf); err != nil { | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					log.Error(4, "ToUTF8WithErr: %s", err) | 					log.Error(4, "ToUTF8WithErr: %s", err) | ||||||
| 				} | 				} | ||||||
|   | |||||||
| @@ -1 +0,0 @@ | |||||||
| 0.9.99.0915 |  | ||||||
		Reference in New Issue
	
	Block a user
	 Thomas Boerger
					Thomas Boerger