Skip to content

Commit 4de8039

Browse files
jtrankdumontnu
andauthored
Add context when rendering labels or emojis (#23281)
This branch continues the work of #23092 and attempts to rid the codebase of any `nil` contexts when using a `RenderContext`. Anything that renders markdown or does post processing may call `markup.sha1CurrentPatternProcessor()`, and this runs `git.OpenRepository()`, which needs a context. It will panic if the context is `nil`. This branch attempts to _always_ include a context when creating a `RenderContext` to prevent future crashes. Co-authored-by: Kyle D <[email protected]>
1 parent ea7f0d6 commit 4de8039

23 files changed

+136
-76
lines changed

modules/csv/csv_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212
"testing"
1313

14+
"code.gitea.io/gitea/modules/git"
1415
"code.gitea.io/gitea/modules/markup"
1516

1617
"github.com/stretchr/testify/assert"
@@ -229,7 +230,10 @@ John Doe [email protected] This,note,had,a,lot,of,commas,to,test,delimiters`,
229230
}
230231

231232
for n, c := range cases {
232-
delimiter := determineDelimiter(&markup.RenderContext{RelativePath: c.filename}, []byte(decodeSlashes(t, c.csv)))
233+
delimiter := determineDelimiter(&markup.RenderContext{
234+
Ctx: git.DefaultContext,
235+
RelativePath: c.filename,
236+
}, []byte(decodeSlashes(t, c.csv)))
233237
assert.EqualValues(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter)
234238
}
235239
}

modules/markup/console/console_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88
"testing"
99

10+
"code.gitea.io/gitea/modules/git"
1011
"code.gitea.io/gitea/modules/markup"
1112

1213
"github.com/stretchr/testify/assert"
@@ -23,7 +24,8 @@ func TestRenderConsole(t *testing.T) {
2324
canRender := render.CanRender("test", strings.NewReader(k))
2425
assert.True(t, canRender)
2526

26-
err := render.Render(&markup.RenderContext{}, strings.NewReader(k), &buf)
27+
err := render.Render(&markup.RenderContext{Ctx: git.DefaultContext},
28+
strings.NewReader(k), &buf)
2729
assert.NoError(t, err)
2830
assert.EqualValues(t, v, buf.String())
2931
}

modules/markup/csv/csv_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88
"testing"
99

10+
"code.gitea.io/gitea/modules/git"
1011
"code.gitea.io/gitea/modules/markup"
1112

1213
"github.com/stretchr/testify/assert"
@@ -23,7 +24,8 @@ func TestRenderCSV(t *testing.T) {
2324

2425
for k, v := range kases {
2526
var buf strings.Builder
26-
err := render.Render(&markup.RenderContext{}, strings.NewReader(k), &buf)
27+
err := render.Render(&markup.RenderContext{Ctx: git.DefaultContext},
28+
strings.NewReader(k), &buf)
2729
assert.NoError(t, err)
2830
assert.EqualValues(t, v, buf.String())
2931
}

modules/markup/html.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,10 @@ func RenderDescriptionHTML(
291291
// RenderEmoji for when we want to just process emoji and shortcodes
292292
// in various places it isn't already run through the normal markdown processor
293293
func RenderEmoji(
294+
ctx *RenderContext,
294295
content string,
295296
) (string, error) {
296-
return renderProcessString(&RenderContext{}, emojiProcessors, content)
297+
return renderProcessString(ctx, emojiProcessors, content)
297298
}
298299

299300
var (

modules/markup/html_internal_test.go

+35-8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010
"testing"
1111

12+
"code.gitea.io/gitea/modules/git"
1213
"code.gitea.io/gitea/modules/setting"
1314
"code.gitea.io/gitea/modules/util"
1415

@@ -70,8 +71,13 @@ var localMetas = map[string]string{
7071
func TestRender_IssueIndexPattern(t *testing.T) {
7172
// numeric: render inputs without valid mentions
7273
test := func(s string) {
73-
testRenderIssueIndexPattern(t, s, s, &RenderContext{})
74-
testRenderIssueIndexPattern(t, s, s, &RenderContext{Metas: numericMetas})
74+
testRenderIssueIndexPattern(t, s, s, &RenderContext{
75+
Ctx: git.DefaultContext,
76+
})
77+
testRenderIssueIndexPattern(t, s, s, &RenderContext{
78+
Ctx: git.DefaultContext,
79+
Metas: numericMetas,
80+
})
7581
}
7682

7783
// should not render anything when there are no mentions
@@ -119,7 +125,10 @@ func TestRender_IssueIndexPattern2(t *testing.T) {
119125
links[i] = numericIssueLink(util.URLJoin(TestRepoURL, path), "ref-issue", index, marker)
120126
}
121127
expectedNil := fmt.Sprintf(expectedFmt, links...)
122-
testRenderIssueIndexPattern(t, s, expectedNil, &RenderContext{Metas: localMetas})
128+
testRenderIssueIndexPattern(t, s, expectedNil, &RenderContext{
129+
Ctx: git.DefaultContext,
130+
Metas: localMetas,
131+
})
123132

124133
class := "ref-issue"
125134
if isExternal {
@@ -130,7 +139,10 @@ func TestRender_IssueIndexPattern2(t *testing.T) {
130139
links[i] = numericIssueLink(prefix, class, index, marker)
131140
}
132141
expectedNum := fmt.Sprintf(expectedFmt, links...)
133-
testRenderIssueIndexPattern(t, s, expectedNum, &RenderContext{Metas: numericMetas})
142+
testRenderIssueIndexPattern(t, s, expectedNum, &RenderContext{
143+
Ctx: git.DefaultContext,
144+
Metas: numericMetas,
145+
})
134146
}
135147

136148
// should render freestanding mentions
@@ -164,7 +176,10 @@ func TestRender_IssueIndexPattern3(t *testing.T) {
164176

165177
// alphanumeric: render inputs without valid mentions
166178
test := func(s string) {
167-
testRenderIssueIndexPattern(t, s, s, &RenderContext{Metas: alphanumericMetas})
179+
testRenderIssueIndexPattern(t, s, s, &RenderContext{
180+
Ctx: git.DefaultContext,
181+
Metas: alphanumericMetas,
182+
})
168183
}
169184
test("")
170185
test("this is a test")
@@ -194,7 +209,10 @@ func TestRender_IssueIndexPattern4(t *testing.T) {
194209
links[i] = externalIssueLink("https://someurl.com/someUser/someRepo/", "ref-issue ref-external-issue", name)
195210
}
196211
expected := fmt.Sprintf(expectedFmt, links...)
197-
testRenderIssueIndexPattern(t, s, expected, &RenderContext{Metas: alphanumericMetas})
212+
testRenderIssueIndexPattern(t, s, expected, &RenderContext{
213+
Ctx: git.DefaultContext,
214+
Metas: alphanumericMetas,
215+
})
198216
}
199217
test("OTT-1234 test", "%s test", "OTT-1234")
200218
test("test T-12 issue", "test %s issue", "T-12")
@@ -214,7 +232,10 @@ func TestRender_IssueIndexPattern5(t *testing.T) {
214232
}
215233

216234
expected := fmt.Sprintf(expectedFmt, links...)
217-
testRenderIssueIndexPattern(t, s, expected, &RenderContext{Metas: metas})
235+
testRenderIssueIndexPattern(t, s, expected, &RenderContext{
236+
Ctx: git.DefaultContext,
237+
Metas: metas,
238+
})
218239
}
219240

220241
test("abc ISSUE-123 def", "abc %s def",
@@ -235,7 +256,10 @@ func TestRender_IssueIndexPattern5(t *testing.T) {
235256
[]string{"ISSUE-123"},
236257
)
237258

238-
testRenderIssueIndexPattern(t, "will not match", "will not match", &RenderContext{Metas: regexpMetas})
259+
testRenderIssueIndexPattern(t, "will not match", "will not match", &RenderContext{
260+
Ctx: git.DefaultContext,
261+
Metas: regexpMetas,
262+
})
239263
}
240264

241265
func testRenderIssueIndexPattern(t *testing.T, input, expected string, ctx *RenderContext) {
@@ -255,6 +279,7 @@ func TestRender_AutoLink(t *testing.T) {
255279
test := func(input, expected string) {
256280
var buffer strings.Builder
257281
err := PostProcess(&RenderContext{
282+
Ctx: git.DefaultContext,
258283
URLPrefix: TestRepoURL,
259284
Metas: localMetas,
260285
}, strings.NewReader(input), &buffer)
@@ -263,6 +288,7 @@ func TestRender_AutoLink(t *testing.T) {
263288

264289
buffer.Reset()
265290
err = PostProcess(&RenderContext{
291+
Ctx: git.DefaultContext,
266292
URLPrefix: TestRepoURL,
267293
Metas: localMetas,
268294
IsWiki: true,
@@ -292,6 +318,7 @@ func TestRender_FullIssueURLs(t *testing.T) {
292318
test := func(input, expected string) {
293319
var result strings.Builder
294320
err := postProcess(&RenderContext{
321+
Ctx: git.DefaultContext,
295322
URLPrefix: TestRepoURL,
296323
Metas: localMetas,
297324
}, []processor{fullIssuePatternProcessor}, strings.NewReader(input), &result)

modules/markup/html_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ func TestRender_CrossReferences(t *testing.T) {
9191

9292
test := func(input, expected string) {
9393
buffer, err := RenderString(&RenderContext{
94+
Ctx: git.DefaultContext,
9495
RelativePath: "a.md",
9596
URLPrefix: setting.AppSubURL,
9697
Metas: localMetas,
@@ -135,6 +136,7 @@ func TestRender_links(t *testing.T) {
135136

136137
test := func(input, expected string) {
137138
buffer, err := RenderString(&RenderContext{
139+
Ctx: git.DefaultContext,
138140
RelativePath: "a.md",
139141
URLPrefix: TestRepoURL,
140142
}, input)
@@ -234,6 +236,7 @@ func TestRender_email(t *testing.T) {
234236

235237
test := func(input, expected string) {
236238
res, err := RenderString(&RenderContext{
239+
Ctx: git.DefaultContext,
237240
RelativePath: "a.md",
238241
URLPrefix: TestRepoURL,
239242
}, input)
@@ -292,6 +295,7 @@ func TestRender_emoji(t *testing.T) {
292295
test := func(input, expected string) {
293296
expected = strings.ReplaceAll(expected, "&", "&amp;")
294297
buffer, err := RenderString(&RenderContext{
298+
Ctx: git.DefaultContext,
295299
RelativePath: "a.md",
296300
URLPrefix: TestRepoURL,
297301
}, input)
@@ -355,11 +359,13 @@ func TestRender_ShortLinks(t *testing.T) {
355359

356360
test := func(input, expected, expectedWiki string) {
357361
buffer, err := markdown.RenderString(&RenderContext{
362+
Ctx: git.DefaultContext,
358363
URLPrefix: tree,
359364
}, input)
360365
assert.NoError(t, err)
361366
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
362367
buffer, err = markdown.RenderString(&RenderContext{
368+
Ctx: git.DefaultContext,
363369
URLPrefix: TestRepoURL,
364370
Metas: localMetas,
365371
IsWiki: true,
@@ -461,12 +467,14 @@ func TestRender_RelativeImages(t *testing.T) {
461467

462468
test := func(input, expected, expectedWiki string) {
463469
buffer, err := markdown.RenderString(&RenderContext{
470+
Ctx: git.DefaultContext,
464471
URLPrefix: tree,
465472
Metas: localMetas,
466473
}, input)
467474
assert.NoError(t, err)
468475
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
469476
buffer, err = markdown.RenderString(&RenderContext{
477+
Ctx: git.DefaultContext,
470478
URLPrefix: TestRepoURL,
471479
Metas: localMetas,
472480
IsWiki: true,
@@ -501,6 +509,7 @@ func Test_ParseClusterFuzz(t *testing.T) {
501509

502510
var res strings.Builder
503511
err := PostProcess(&RenderContext{
512+
Ctx: git.DefaultContext,
504513
URLPrefix: "https://example.com",
505514
Metas: localMetas,
506515
}, strings.NewReader(data), &res)
@@ -511,6 +520,7 @@ func Test_ParseClusterFuzz(t *testing.T) {
511520

512521
res.Reset()
513522
err = PostProcess(&RenderContext{
523+
Ctx: git.DefaultContext,
514524
URLPrefix: "https://example.com",
515525
Metas: localMetas,
516526
}, strings.NewReader(data), &res)
@@ -531,6 +541,7 @@ func TestIssue16020(t *testing.T) {
531541

532542
var res strings.Builder
533543
err := PostProcess(&RenderContext{
544+
Ctx: git.DefaultContext,
534545
URLPrefix: "https://example.com",
535546
Metas: localMetas,
536547
}, strings.NewReader(data), &res)
@@ -547,6 +558,7 @@ func BenchmarkEmojiPostprocess(b *testing.B) {
547558
for i := 0; i < b.N; i++ {
548559
var res strings.Builder
549560
err := PostProcess(&RenderContext{
561+
Ctx: git.DefaultContext,
550562
URLPrefix: "https://example.com",
551563
Metas: localMetas,
552564
}, strings.NewReader(data), &res)
@@ -557,6 +569,7 @@ func BenchmarkEmojiPostprocess(b *testing.B) {
557569
func TestFuzz(t *testing.T) {
558570
s := "t/l/issues/8#/../../a"
559571
renderContext := RenderContext{
572+
Ctx: git.DefaultContext,
560573
URLPrefix: "https://example.com/go-gitea/gitea",
561574
Metas: map[string]string{
562575
"user": "go-gitea",
@@ -574,6 +587,7 @@ func TestIssue18471(t *testing.T) {
574587

575588
var res strings.Builder
576589
err := PostProcess(&RenderContext{
590+
Ctx: git.DefaultContext,
577591
URLPrefix: "https://example.com",
578592
Metas: localMetas,
579593
}, strings.NewReader(data), &res)

0 commit comments

Comments
 (0)