Skip to content

Commit 5eebe1d

Browse files
authored
Fix and refactor markdown rendering (#32522)
1 parent e546480 commit 5eebe1d

27 files changed

+289
-278
lines changed

Diff for: models/repo/repo.go

+31-18
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"fmt"
99
"html/template"
10+
"maps"
1011
"net"
1112
"net/url"
1213
"path/filepath"
@@ -165,10 +166,10 @@ type Repository struct {
165166

166167
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
167168

168-
RenderingMetas map[string]string `xorm:"-"`
169-
DocumentRenderingMetas map[string]string `xorm:"-"`
170-
Units []*RepoUnit `xorm:"-"`
171-
PrimaryLanguage *LanguageStat `xorm:"-"`
169+
commonRenderingMetas map[string]string `xorm:"-"`
170+
171+
Units []*RepoUnit `xorm:"-"`
172+
PrimaryLanguage *LanguageStat `xorm:"-"`
172173

173174
IsFork bool `xorm:"INDEX NOT NULL DEFAULT false"`
174175
ForkID int64 `xorm:"INDEX"`
@@ -473,9 +474,8 @@ func (repo *Repository) MustOwner(ctx context.Context) *user_model.User {
473474
return repo.Owner
474475
}
475476

476-
// ComposeMetas composes a map of metas for properly rendering issue links and external issue trackers.
477-
func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string {
478-
if len(repo.RenderingMetas) == 0 {
477+
func (repo *Repository) composeCommonMetas(ctx context.Context) map[string]string {
478+
if len(repo.commonRenderingMetas) == 0 {
479479
metas := map[string]string{
480480
"user": repo.OwnerName,
481481
"repo": repo.Name,
@@ -508,21 +508,34 @@ func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string {
508508
metas["org"] = strings.ToLower(repo.OwnerName)
509509
}
510510

511-
repo.RenderingMetas = metas
511+
repo.commonRenderingMetas = metas
512512
}
513-
return repo.RenderingMetas
513+
return repo.commonRenderingMetas
514+
}
515+
516+
// ComposeMetas composes a map of metas for properly rendering comments or comment-like contents (commit message)
517+
func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string {
518+
metas := maps.Clone(repo.composeCommonMetas(ctx))
519+
metas["markdownLineBreakStyle"] = "comment"
520+
metas["markupAllowShortIssuePattern"] = "true"
521+
return metas
514522
}
515523

516-
// ComposeDocumentMetas composes a map of metas for properly rendering documents
524+
// ComposeWikiMetas composes a map of metas for properly rendering wikis
525+
func (repo *Repository) ComposeWikiMetas(ctx context.Context) map[string]string {
526+
// does wiki need the "teams" and "org" from common metas?
527+
metas := maps.Clone(repo.composeCommonMetas(ctx))
528+
metas["markdownLineBreakStyle"] = "document"
529+
metas["markupAllowShortIssuePattern"] = "true"
530+
return metas
531+
}
532+
533+
// ComposeDocumentMetas composes a map of metas for properly rendering documents (repo files)
517534
func (repo *Repository) ComposeDocumentMetas(ctx context.Context) map[string]string {
518-
if len(repo.DocumentRenderingMetas) == 0 {
519-
metas := map[string]string{}
520-
for k, v := range repo.ComposeMetas(ctx) {
521-
metas[k] = v
522-
}
523-
repo.DocumentRenderingMetas = metas
524-
}
525-
return repo.DocumentRenderingMetas
535+
// does document(file) need the "teams" and "org" from common metas?
536+
metas := maps.Clone(repo.composeCommonMetas(ctx))
537+
metas["markdownLineBreakStyle"] = "document"
538+
return metas
526539
}
527540

528541
// GetBaseRepo populates repo.BaseRepo for a fork repository and

Diff for: models/repo/repo_test.go

+33-34
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
// Copyright 2017 The Gitea Authors. All rights reserved.
22
// SPDX-License-Identifier: MIT
33

4-
package repo_test
4+
package repo
55

66
import (
77
"testing"
88

99
"code.gitea.io/gitea/models/db"
10-
repo_model "code.gitea.io/gitea/models/repo"
1110
"code.gitea.io/gitea/models/unit"
1211
"code.gitea.io/gitea/models/unittest"
1312
user_model "code.gitea.io/gitea/models/user"
@@ -20,18 +19,18 @@ import (
2019
)
2120

2221
var (
23-
countRepospts = repo_model.CountRepositoryOptions{OwnerID: 10}
24-
countReposptsPublic = repo_model.CountRepositoryOptions{OwnerID: 10, Private: optional.Some(false)}
25-
countReposptsPrivate = repo_model.CountRepositoryOptions{OwnerID: 10, Private: optional.Some(true)}
22+
countRepospts = CountRepositoryOptions{OwnerID: 10}
23+
countReposptsPublic = CountRepositoryOptions{OwnerID: 10, Private: optional.Some(false)}
24+
countReposptsPrivate = CountRepositoryOptions{OwnerID: 10, Private: optional.Some(true)}
2625
)
2726

2827
func TestGetRepositoryCount(t *testing.T) {
2928
assert.NoError(t, unittest.PrepareTestDatabase())
3029

3130
ctx := db.DefaultContext
32-
count, err1 := repo_model.CountRepositories(ctx, countRepospts)
33-
privateCount, err2 := repo_model.CountRepositories(ctx, countReposptsPrivate)
34-
publicCount, err3 := repo_model.CountRepositories(ctx, countReposptsPublic)
31+
count, err1 := CountRepositories(ctx, countRepospts)
32+
privateCount, err2 := CountRepositories(ctx, countReposptsPrivate)
33+
publicCount, err3 := CountRepositories(ctx, countReposptsPublic)
3534
assert.NoError(t, err1)
3635
assert.NoError(t, err2)
3736
assert.NoError(t, err3)
@@ -42,45 +41,45 @@ func TestGetRepositoryCount(t *testing.T) {
4241
func TestGetPublicRepositoryCount(t *testing.T) {
4342
assert.NoError(t, unittest.PrepareTestDatabase())
4443

45-
count, err := repo_model.CountRepositories(db.DefaultContext, countReposptsPublic)
44+
count, err := CountRepositories(db.DefaultContext, countReposptsPublic)
4645
assert.NoError(t, err)
4746
assert.Equal(t, int64(1), count)
4847
}
4948

5049
func TestGetPrivateRepositoryCount(t *testing.T) {
5150
assert.NoError(t, unittest.PrepareTestDatabase())
5251

53-
count, err := repo_model.CountRepositories(db.DefaultContext, countReposptsPrivate)
52+
count, err := CountRepositories(db.DefaultContext, countReposptsPrivate)
5453
assert.NoError(t, err)
5554
assert.Equal(t, int64(2), count)
5655
}
5756

5857
func TestRepoAPIURL(t *testing.T) {
5958
assert.NoError(t, unittest.PrepareTestDatabase())
60-
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
59+
repo := unittest.AssertExistsAndLoadBean(t, &Repository{ID: 10})
6160

6261
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user12/repo10", repo.APIURL())
6362
}
6463

6564
func TestWatchRepo(t *testing.T) {
6665
assert.NoError(t, unittest.PrepareTestDatabase())
6766

68-
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
67+
repo := unittest.AssertExistsAndLoadBean(t, &Repository{ID: 3})
6968
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
7069

71-
assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, user, repo, true))
72-
unittest.AssertExistsAndLoadBean(t, &repo_model.Watch{RepoID: repo.ID, UserID: user.ID})
73-
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID})
70+
assert.NoError(t, WatchRepo(db.DefaultContext, user, repo, true))
71+
unittest.AssertExistsAndLoadBean(t, &Watch{RepoID: repo.ID, UserID: user.ID})
72+
unittest.CheckConsistencyFor(t, &Repository{ID: repo.ID})
7473

75-
assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, user, repo, false))
76-
unittest.AssertNotExistsBean(t, &repo_model.Watch{RepoID: repo.ID, UserID: user.ID})
77-
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID})
74+
assert.NoError(t, WatchRepo(db.DefaultContext, user, repo, false))
75+
unittest.AssertNotExistsBean(t, &Watch{RepoID: repo.ID, UserID: user.ID})
76+
unittest.CheckConsistencyFor(t, &Repository{ID: repo.ID})
7877
}
7978

8079
func TestMetas(t *testing.T) {
8180
assert.NoError(t, unittest.PrepareTestDatabase())
8281

83-
repo := &repo_model.Repository{Name: "testRepo"}
82+
repo := &Repository{Name: "testRepo"}
8483
repo.Owner = &user_model.User{Name: "testOwner"}
8584
repo.OwnerName = repo.Owner.Name
8685

@@ -90,16 +89,16 @@ func TestMetas(t *testing.T) {
9089
assert.Equal(t, "testRepo", metas["repo"])
9190
assert.Equal(t, "testOwner", metas["user"])
9291

93-
externalTracker := repo_model.RepoUnit{
92+
externalTracker := RepoUnit{
9493
Type: unit.TypeExternalTracker,
95-
Config: &repo_model.ExternalTrackerConfig{
94+
Config: &ExternalTrackerConfig{
9695
ExternalTrackerFormat: "https://someurl.com/{user}/{repo}/{issue}",
9796
},
9897
}
9998

10099
testSuccess := func(expectedStyle string) {
101-
repo.Units = []*repo_model.RepoUnit{&externalTracker}
102-
repo.RenderingMetas = nil
100+
repo.Units = []*RepoUnit{&externalTracker}
101+
repo.commonRenderingMetas = nil
103102
metas := repo.ComposeMetas(db.DefaultContext)
104103
assert.Equal(t, expectedStyle, metas["style"])
105104
assert.Equal(t, "testRepo", metas["repo"])
@@ -118,7 +117,7 @@ func TestMetas(t *testing.T) {
118117
externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleRegexp
119118
testSuccess(markup.IssueNameStyleRegexp)
120119

121-
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 3)
120+
repo, err := GetRepositoryByID(db.DefaultContext, 3)
122121
assert.NoError(t, err)
123122

124123
metas = repo.ComposeMetas(db.DefaultContext)
@@ -132,15 +131,15 @@ func TestGetRepositoryByURL(t *testing.T) {
132131
assert.NoError(t, unittest.PrepareTestDatabase())
133132

134133
t.Run("InvalidPath", func(t *testing.T) {
135-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, "something")
134+
repo, err := GetRepositoryByURL(db.DefaultContext, "something")
136135

137136
assert.Nil(t, repo)
138137
assert.Error(t, err)
139138
})
140139

141140
t.Run("ValidHttpURL", func(t *testing.T) {
142141
test := func(t *testing.T, url string) {
143-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, url)
142+
repo, err := GetRepositoryByURL(db.DefaultContext, url)
144143

145144
assert.NotNil(t, repo)
146145
assert.NoError(t, err)
@@ -155,7 +154,7 @@ func TestGetRepositoryByURL(t *testing.T) {
155154

156155
t.Run("ValidGitSshURL", func(t *testing.T) {
157156
test := func(t *testing.T, url string) {
158-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, url)
157+
repo, err := GetRepositoryByURL(db.DefaultContext, url)
159158

160159
assert.NotNil(t, repo)
161160
assert.NoError(t, err)
@@ -173,7 +172,7 @@ func TestGetRepositoryByURL(t *testing.T) {
173172

174173
t.Run("ValidImplicitSshURL", func(t *testing.T) {
175174
test := func(t *testing.T, url string) {
176-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, url)
175+
repo, err := GetRepositoryByURL(db.DefaultContext, url)
177176

178177
assert.NotNil(t, repo)
179178
assert.NoError(t, err)
@@ -200,21 +199,21 @@ func TestComposeSSHCloneURL(t *testing.T) {
200199
setting.SSH.Domain = "domain"
201200
setting.SSH.Port = 22
202201
setting.Repository.UseCompatSSHURI = false
203-
assert.Equal(t, "git@domain:user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
202+
assert.Equal(t, "git@domain:user/repo.git", ComposeSSHCloneURL("user", "repo"))
204203
setting.Repository.UseCompatSSHURI = true
205-
assert.Equal(t, "ssh://git@domain/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
204+
assert.Equal(t, "ssh://git@domain/user/repo.git", ComposeSSHCloneURL("user", "repo"))
206205
// test SSH_DOMAIN while use non-standard SSH port
207206
setting.SSH.Port = 123
208207
setting.Repository.UseCompatSSHURI = false
209-
assert.Equal(t, "ssh://git@domain:123/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
208+
assert.Equal(t, "ssh://git@domain:123/user/repo.git", ComposeSSHCloneURL("user", "repo"))
210209
setting.Repository.UseCompatSSHURI = true
211-
assert.Equal(t, "ssh://git@domain:123/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
210+
assert.Equal(t, "ssh://git@domain:123/user/repo.git", ComposeSSHCloneURL("user", "repo"))
212211

213212
// test IPv6 SSH_DOMAIN
214213
setting.Repository.UseCompatSSHURI = false
215214
setting.SSH.Domain = "::1"
216215
setting.SSH.Port = 22
217-
assert.Equal(t, "git@[::1]:user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
216+
assert.Equal(t, "git@[::1]:user/repo.git", ComposeSSHCloneURL("user", "repo"))
218217
setting.SSH.Port = 123
219-
assert.Equal(t, "ssh://git@[::1]:123/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
218+
assert.Equal(t, "ssh://git@[::1]:123/user/repo.git", ComposeSSHCloneURL("user", "repo"))
220219
}

0 commit comments

Comments
 (0)