Skip to content

Commit 33f450d

Browse files
committed
improve
1 parent ed7245f commit 33f450d

File tree

9 files changed

+77
-73
lines changed

9 files changed

+77
-73
lines changed

assets/go-licenses.json

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/generate-go-licenses.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ package main
77

88
import (
99
"encoding/json"
10+
"fmt"
1011
"io/fs"
1112
"os"
12-
goPath "path"
13+
"path"
1314
"path/filepath"
1415
"regexp"
1516
"sort"
@@ -27,9 +28,14 @@ type LicenseEntry struct {
2728
}
2829

2930
func main() {
31+
if len(os.Args) != 3 {
32+
fmt.Println("usage: go run generate-go-licenses.go <base-dir> <out-json-file>")
33+
os.Exit(1)
34+
}
35+
3036
base, out := os.Args[1], os.Args[2]
3137

32-
paths := []string{}
38+
var paths []string
3339
err := filepath.WalkDir(base, func(path string, entry fs.DirEntry, err error) error {
3440
if err != nil {
3541
return err
@@ -46,28 +52,27 @@ func main() {
4652

4753
sort.Strings(paths)
4854

49-
entries := []LicenseEntry{}
50-
for _, path := range paths {
51-
path := filepath.ToSlash(path)
52-
53-
licenseText, err := os.ReadFile(path)
55+
var entries []LicenseEntry
56+
for _, filePath := range paths {
57+
licenseText, err := os.ReadFile(filePath)
5458
if err != nil {
5559
panic(err)
5660
}
5761

58-
path = strings.Replace(path, base+"/", "", 1)
59-
name := goPath.Dir(path)
62+
pkgPath := filepath.ToSlash(filePath)
63+
pkgPath = strings.TrimPrefix(pkgPath, base+"/")
64+
pkgName := path.Dir(pkgPath)
6065

6166
// There might be a bug somewhere in go-licenses that sometimes interprets the
6267
// root package as "." and sometimes as "code.gitea.io/gitea". Workaround by
6368
// removing both of them for the sake of stable output.
64-
if name == "." || name == "code.gitea.io/gitea" {
69+
if pkgName == "." || pkgName == "code.gitea.io/gitea" {
6570
continue
6671
}
6772

6873
entries = append(entries, LicenseEntry{
69-
Name: name,
70-
Path: path,
74+
Name: pkgName,
75+
Path: pkgPath,
7176
LicenseText: string(licenseText),
7277
})
7378
}

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ require (
9696
github.com/stretchr/testify v1.8.1
9797
github.com/syndtr/goleveldb v1.0.0
9898
github.com/tstranex/u2f v1.0.0
99-
github.com/unrolled/render v1.5.0
10099
github.com/urfave/cli v1.22.12
101100
github.com/xanzy/go-gitlab v0.80.2
102101
github.com/xeipuuv/gojsonschema v1.2.0

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,8 +1182,6 @@ github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0o
11821182
github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
11831183
github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
11841184
github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
1185-
github.com/unrolled/render v1.5.0 h1:uNTHMvVoI9pyyXfgoDHHycIqFONNY2p4eQR9ty+NsxM=
1186-
github.com/unrolled/render v1.5.0/go.mod h1:eLTosBkQqEPEk7pRfkCRApXd++lm++nCsVlFOHpeedw=
11871185
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
11881186
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
11891187
github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8=

modules/context/context.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,13 @@ import (
4242
"gitea.com/go-chi/session"
4343
chi "github.com/go-chi/chi/v5"
4444
"github.com/minio/sha256-simd"
45-
"github.com/unrolled/render"
4645
"golang.org/x/crypto/pbkdf2"
4746
)
4847

4948
// Render represents a template render
5049
type Render interface {
5150
TemplateLookup(tmpl string) *template.Template
52-
HTML(w io.Writer, status int, name string, binding interface{}, htmlOpt ...render.HTMLOptions) error
51+
HTML(w io.Writer, status int, name string, data interface{}) error
5352
}
5453

5554
// Context represents context of a request.

modules/templates/htmlrenderer.go

Lines changed: 56 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,18 @@ import (
77
"bytes"
88
"context"
99
"fmt"
10+
"html/template"
11+
"io"
12+
"net/http"
13+
"path/filepath"
1014
"regexp"
1115
"strconv"
1216
"strings"
17+
"sync/atomic"
1318

1419
"code.gitea.io/gitea/modules/log"
1520
"code.gitea.io/gitea/modules/setting"
1621
"code.gitea.io/gitea/modules/watcher"
17-
18-
"github.com/unrolled/render"
1922
)
2023

2124
var (
@@ -27,14 +30,50 @@ var (
2730
expectedEndError = regexp.MustCompile(`^template: (.*):([0-9]+): expected end; found (.*)`)
2831
)
2932

30-
// HTMLRenderer returns the current html renderer for the context or creates and stores one within the context for future use
31-
func HTMLRenderer(ctx context.Context) (context.Context, *render.Render) {
32-
rendererInterface := ctx.Value(rendererKey)
33-
if rendererInterface != nil {
34-
renderer, ok := rendererInterface.(*render.Render)
35-
if ok {
36-
return ctx, renderer
33+
type HTMLRender struct {
34+
templates atomic.Pointer[template.Template]
35+
}
36+
37+
func (h *HTMLRender) HTML(w io.Writer, status int, name string, data interface{}) error {
38+
if respWriter, ok := w.(http.ResponseWriter); ok {
39+
if respWriter.Header().Get("Content-Type") == "" {
40+
respWriter.Header().Set("Content-Type", "text/html; charset=utf-8")
41+
}
42+
respWriter.WriteHeader(status)
43+
}
44+
return h.templates.Load().ExecuteTemplate(w, name, data)
45+
}
46+
47+
func (h *HTMLRender) TemplateLookup(t string) *template.Template {
48+
return h.templates.Load().Lookup(t)
49+
}
50+
51+
func (h *HTMLRender) CompileTemplates() error {
52+
dirPrefix := "templates/"
53+
tmpls := template.New("")
54+
for _, path := range GetTemplateAssetNames() {
55+
name := path[len(dirPrefix):]
56+
name = strings.TrimSuffix(name, ".tmpl")
57+
tmpl := tmpls.New(filepath.ToSlash(name))
58+
for _, fm := range NewFuncMap() {
59+
tmpl.Funcs(fm)
60+
}
61+
buf, err := GetAsset(path)
62+
if err != nil {
63+
return err
3764
}
65+
if _, err = tmpl.Parse(string(buf)); err != nil {
66+
return err
67+
}
68+
}
69+
h.templates.Store(tmpls)
70+
return nil
71+
}
72+
73+
// HTMLRenderer returns the current html renderer for the context or creates and stores one within the context for future use
74+
func HTMLRenderer(ctx context.Context) (context.Context, *HTMLRender) {
75+
if renderer, ok := ctx.Value(rendererKey).(*HTMLRender); ok {
76+
return ctx, renderer
3877
}
3978

4079
rendererType := "static"
@@ -43,53 +82,24 @@ func HTMLRenderer(ctx context.Context) (context.Context, *render.Render) {
4382
}
4483
log.Log(1, log.DEBUG, "Creating "+rendererType+" HTML Renderer")
4584

46-
compilingTemplates := true
47-
defer func() {
48-
if !compilingTemplates {
49-
return
50-
}
51-
52-
panicked := recover()
53-
if panicked == nil {
54-
return
55-
}
56-
57-
// OK try to handle the panic...
58-
err, ok := panicked.(error)
59-
if ok {
60-
handlePanicError(err)
61-
}
62-
log.Fatal("PANIC: Unable to compile templates!\n%v\n\nStacktrace:\n%s", panicked, log.Stack(2))
63-
}()
64-
65-
renderer := render.New(render.Options{
66-
Extensions: []string{".tmpl"},
67-
Directory: "templates",
68-
Funcs: NewFuncMap(),
69-
Asset: GetAsset,
70-
AssetNames: GetTemplateAssetNames,
71-
UseMutexLock: !setting.IsProd,
72-
IsDevelopment: false,
73-
DisableHTTPErrorRendering: true,
74-
})
75-
compilingTemplates = false
85+
renderer := &HTMLRender{}
86+
if err := renderer.CompileTemplates(); err != nil {
87+
handleFatalError(err)
88+
}
7689
if !setting.IsProd {
7790
watcher.CreateWatcher(ctx, "HTML Templates", &watcher.CreateWatcherOpts{
7891
PathsCallback: walkTemplateFiles,
7992
BetweenCallback: func() {
80-
defer func() {
81-
if err := recover(); err != nil {
82-
log.Error("PANIC: %v\n%s", err, log.Stack(2))
83-
}
84-
}()
85-
renderer.CompileTemplates()
93+
if err := renderer.CompileTemplates(); err != nil {
94+
log.Error("Template error: %v\n%s", err, log.Stack(2))
95+
}
8696
},
8797
})
8898
}
8999
return context.WithValue(ctx, rendererKey, renderer), renderer
90100
}
91101

92-
func handlePanicError(err error) {
102+
func handleFatalError(err error) {
93103
wrapFatal(handleNotDefinedPanicError(err))
94104
wrapFatal(handleUnexpected(err))
95105
wrapFatal(handleExpectedEnd(err))

modules/test/context_tests.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
chi "github.com/go-chi/chi/v5"
2424
"github.com/stretchr/testify/assert"
25-
"github.com/unrolled/render"
2625
)
2726

2827
// MockContext mock context for unit tests
@@ -138,7 +137,7 @@ func (tr *mockRender) TemplateLookup(tmpl string) *template.Template {
138137
return nil
139138
}
140139

141-
func (tr *mockRender) HTML(w io.Writer, status int, _ string, _ interface{}, _ ...render.HTMLOptions) error {
140+
func (tr *mockRender) HTML(w io.Writer, status int, _ string, _ interface{}) error {
142141
if resp, ok := w.(http.ResponseWriter); ok {
143142
resp.WriteHeader(status)
144143
}

services/auth/sspi_windows.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323

2424
gouuid "github.com/google/uuid"
2525
"github.com/quasoft/websspi"
26-
"github.com/unrolled/render"
2726
)
2827

2928
const (
@@ -48,7 +47,7 @@ var (
4847
// On successful authentication returns a valid user object.
4948
// Returns nil if authentication fails.
5049
type SSPI struct {
51-
rnd *render.Render
50+
rnd *templates.HTMLRender
5251
}
5352

5453
// Init creates a new global websspi.Authenticator object

0 commit comments

Comments
 (0)