2021-01-05 16:05:40 +03:00
|
|
|
// Copyright 2020 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 (
|
2022-08-28 12:43:25 +03:00
|
|
|
"fmt"
|
|
|
|
"io/fs"
|
2021-01-05 16:05:40 +03:00
|
|
|
"os"
|
2022-08-28 12:43:25 +03:00
|
|
|
"path/filepath"
|
2021-01-05 16:05:40 +03:00
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"code.gitea.io/gitea/modules/util"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Vars represents variables to be render in golang templates
|
|
|
|
type Vars map[string]interface{}
|
|
|
|
|
|
|
|
// Merge merges another vars to the current, another Vars will override the current
|
|
|
|
func (vars Vars) Merge(another map[string]interface{}) Vars {
|
|
|
|
for k, v := range another {
|
|
|
|
vars[k] = v
|
|
|
|
}
|
|
|
|
return vars
|
|
|
|
}
|
|
|
|
|
|
|
|
// BaseVars returns all basic vars
|
|
|
|
func BaseVars() Vars {
|
2022-01-20 20:46:10 +03:00
|
|
|
startTime := time.Now()
|
2021-01-05 16:05:40 +03:00
|
|
|
return map[string]interface{}{
|
|
|
|
"IsLandingPageHome": setting.LandingPageURL == setting.LandingPageHome,
|
|
|
|
"IsLandingPageExplore": setting.LandingPageURL == setting.LandingPageExplore,
|
|
|
|
"IsLandingPageOrganizations": setting.LandingPageURL == setting.LandingPageOrganizations,
|
|
|
|
|
2022-07-31 19:57:02 +03:00
|
|
|
"ShowRegistrationButton": setting.Service.ShowRegistrationButton,
|
|
|
|
"ShowMilestonesDashboardPage": setting.Service.ShowMilestonesDashboardPage,
|
|
|
|
"ShowFooterBranding": setting.ShowFooterBranding,
|
|
|
|
"ShowFooterVersion": setting.ShowFooterVersion,
|
|
|
|
"DisableDownloadSourceArchives": setting.Repository.DisableDownloadSourceArchives,
|
2021-01-05 16:05:40 +03:00
|
|
|
|
|
|
|
"EnableSwagger": setting.API.EnableSwagger,
|
|
|
|
"EnableOpenIDSignIn": setting.Service.EnableOpenIDSignIn,
|
|
|
|
"PageStartTime": startTime,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-28 12:43:25 +03:00
|
|
|
func getDirTemplateAssetNames(dir string) []string {
|
|
|
|
return getDirAssetNames(dir, false)
|
|
|
|
}
|
|
|
|
|
|
|
|
func getDirAssetNames(dir string, mailer bool) []string {
|
2021-01-05 16:05:40 +03:00
|
|
|
var tmpls []string
|
2022-08-28 12:43:25 +03:00
|
|
|
|
|
|
|
if mailer {
|
|
|
|
dir += filepath.Join(dir, "mail")
|
|
|
|
}
|
2021-01-05 16:05:40 +03:00
|
|
|
f, err := os.Stat(dir)
|
|
|
|
if err != nil {
|
|
|
|
if os.IsNotExist(err) {
|
|
|
|
return tmpls
|
|
|
|
}
|
|
|
|
log.Warn("Unable to check if templates dir %s is a directory. Error: %v", dir, err)
|
|
|
|
return tmpls
|
|
|
|
}
|
|
|
|
if !f.IsDir() {
|
|
|
|
log.Warn("Templates dir %s is a not directory.", dir)
|
|
|
|
return tmpls
|
|
|
|
}
|
|
|
|
|
|
|
|
files, err := util.StatDir(dir)
|
|
|
|
if err != nil {
|
|
|
|
log.Warn("Failed to read %s templates dir. %v", dir, err)
|
|
|
|
return tmpls
|
|
|
|
}
|
2022-08-28 12:43:25 +03:00
|
|
|
|
|
|
|
prefix := "templates/"
|
|
|
|
if mailer {
|
|
|
|
prefix += "mail/"
|
|
|
|
}
|
2021-01-05 16:05:40 +03:00
|
|
|
for _, filePath := range files {
|
2022-08-28 12:43:25 +03:00
|
|
|
if !mailer && strings.HasPrefix(filePath, "mail/") {
|
2021-01-05 16:05:40 +03:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if !strings.HasSuffix(filePath, ".tmpl") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2022-08-28 12:43:25 +03:00
|
|
|
tmpls = append(tmpls, prefix+filePath)
|
2021-01-05 16:05:40 +03:00
|
|
|
}
|
|
|
|
return tmpls
|
|
|
|
}
|
2021-01-26 18:36:53 +03:00
|
|
|
|
2022-08-28 12:43:25 +03:00
|
|
|
func walkAssetDir(root string, skipMail bool, callback func(path, name string, d fs.DirEntry, err error) error) error {
|
|
|
|
mailRoot := filepath.Join(root, "mail")
|
|
|
|
if err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {
|
|
|
|
name := path[len(root):]
|
|
|
|
if len(name) > 0 && name[0] == '/' {
|
|
|
|
name = name[1:]
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
if os.IsNotExist(err) {
|
|
|
|
return callback(path, name, d, err)
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if skipMail && path == mailRoot && d.IsDir() {
|
|
|
|
return fs.SkipDir
|
|
|
|
}
|
|
|
|
if util.CommonSkip(d.Name()) {
|
|
|
|
if d.IsDir() {
|
|
|
|
return fs.SkipDir
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if strings.HasSuffix(d.Name(), ".tmpl") || d.IsDir() {
|
|
|
|
return callback(path, name, d, err)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}); err != nil && !os.IsNotExist(err) {
|
|
|
|
return fmt.Errorf("unable to get files for template assets in %s: %w", root, err)
|
|
|
|
}
|
|
|
|
return nil
|
2021-01-26 18:36:53 +03:00
|
|
|
}
|