Use a general approach to access custom/static/builtin assets (#24022)
The idea is to use a Layered Asset File-system (modules/assetfs/layered.go) For example: when there are 2 layers: "custom", "builtin", when access to asset "my/page.tmpl", the Layered Asset File-system will first try to use "custom" assets, if not found, then use "builtin" assets. This approach will hugely simplify a lot of code, make them testable. Other changes: * Simplify the AssetsHandlerFunc code * Simplify the `gitea embedded` sub-command code --------- Co-authored-by: Jason Song <i@wolfogre.com> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
42919ccb7c
commit
50a72e7a83
36 changed files with 689 additions and 1055 deletions
|
@ -71,13 +71,6 @@ func mustInitCtx(ctx context.Context, fn func(ctx context.Context) error) {
|
|||
}
|
||||
}
|
||||
|
||||
// InitGitServices init new services for git, this is also called in `contrib/pr/checkout.go`
|
||||
func InitGitServices() {
|
||||
setting.LoadSettings()
|
||||
mustInit(storage.Init)
|
||||
mustInit(repo_service.Init)
|
||||
}
|
||||
|
||||
func syncAppConfForGit(ctx context.Context) error {
|
||||
runtimeState := new(system.RuntimeState)
|
||||
if err := system.AppState.Get(runtimeState); err != nil {
|
||||
|
@ -172,7 +165,7 @@ func GlobalInitInstalled(ctx context.Context) {
|
|||
mustInit(ssh.Init)
|
||||
|
||||
auth.Init()
|
||||
svg.Init()
|
||||
mustInit(svg.Init)
|
||||
|
||||
actions_service.Init()
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@ import (
|
|||
"fmt"
|
||||
"html"
|
||||
"net/http"
|
||||
"path"
|
||||
|
||||
"code.gitea.io/gitea/modules/httpcache"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
|
@ -89,10 +88,7 @@ func Routes(ctx goctx.Context) *web.Route {
|
|||
r.Use(middle)
|
||||
}
|
||||
|
||||
r.Use(web.WrapWithPrefix(public.AssetsURLPathPrefix, public.AssetsHandlerFunc(&public.Options{
|
||||
Directory: path.Join(setting.StaticRootPath, "public"),
|
||||
Prefix: public.AssetsURLPathPrefix,
|
||||
}), "InstallAssetsHandler"))
|
||||
r.Use(web.WrapWithPrefix("/assets/", public.AssetsHandlerFunc("/assets/"), "AssetsHandler"))
|
||||
|
||||
r.Use(session.Sessioner(session.Options{
|
||||
Provider: setting.SessionConfig.Provider,
|
||||
|
|
|
@ -30,7 +30,7 @@ func PreloadSettings(ctx context.Context) bool {
|
|||
}
|
||||
|
||||
setting.LoadSettingsForInstall()
|
||||
svg.Init()
|
||||
_ = svg.Init()
|
||||
}
|
||||
|
||||
return !setting.InstallLock
|
||||
|
@ -47,6 +47,5 @@ func reloadSettings(ctx context.Context) {
|
|||
} else {
|
||||
log.Fatal("ORM engine initialization failed: %v", err)
|
||||
}
|
||||
svg.Init()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,15 +15,16 @@ import (
|
|||
|
||||
// List all devtest templates, they will be used for e2e tests for the UI components
|
||||
func List(ctx *context.Context) {
|
||||
templateNames := templates.GetTemplateAssetNames()
|
||||
templateNames, err := templates.AssetFS().ListFiles("devtest", true)
|
||||
if err != nil {
|
||||
ctx.ServerError("AssetFS().ListFiles", err)
|
||||
return
|
||||
}
|
||||
var subNames []string
|
||||
const prefix = "templates/devtest/"
|
||||
for _, tmplName := range templateNames {
|
||||
if strings.HasPrefix(tmplName, prefix) {
|
||||
subName := strings.TrimSuffix(strings.TrimPrefix(tmplName, prefix), ".tmpl")
|
||||
if subName != "list" {
|
||||
subNames = append(subNames, subName)
|
||||
}
|
||||
subName := strings.TrimSuffix(tmplName, ".tmpl")
|
||||
if subName != "list" {
|
||||
subNames = append(subNames, subName)
|
||||
}
|
||||
}
|
||||
ctx.Data["SubNames"] = subNames
|
||||
|
|
|
@ -103,11 +103,7 @@ func buildAuthGroup() *auth_service.Group {
|
|||
func Routes(ctx gocontext.Context) *web.Route {
|
||||
routes := web.NewRoute()
|
||||
|
||||
routes.Use(web.WrapWithPrefix(public.AssetsURLPathPrefix, public.AssetsHandlerFunc(&public.Options{
|
||||
Directory: path.Join(setting.StaticRootPath, "public"),
|
||||
Prefix: public.AssetsURLPathPrefix,
|
||||
CorsHandler: CorsHandler(),
|
||||
}), "AssetsHandler"))
|
||||
routes.Use(web.WrapWithPrefix("/assets/", web.Wrap(CorsHandler(), public.AssetsHandlerFunc("/assets/")), "AssetsHandler"))
|
||||
|
||||
sessioner := session.Sessioner(session.Options{
|
||||
Provider: setting.SessionConfig.Provider,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue