Fix team links in HTML rendering (#9127)
* Fix team links in HTML rendering * Fix check and lint
This commit is contained in:
parent
7523314ef8
commit
f25fd5c8eb
|
@ -173,7 +173,7 @@ type Repository struct {
|
||||||
*Mirror `xorm:"-"`
|
*Mirror `xorm:"-"`
|
||||||
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
|
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
|
||||||
|
|
||||||
ExternalMetas map[string]string `xorm:"-"`
|
RenderingMetas map[string]string `xorm:"-"`
|
||||||
Units []*RepoUnit `xorm:"-"`
|
Units []*RepoUnit `xorm:"-"`
|
||||||
|
|
||||||
IsFork bool `xorm:"INDEX NOT NULL DEFAULT false"`
|
IsFork bool `xorm:"INDEX NOT NULL DEFAULT false"`
|
||||||
|
@ -559,27 +559,39 @@ func (repo *Repository) mustOwnerName(e Engine) string {
|
||||||
|
|
||||||
// ComposeMetas composes a map of metas for properly rendering issue links and external issue trackers.
|
// ComposeMetas composes a map of metas for properly rendering issue links and external issue trackers.
|
||||||
func (repo *Repository) ComposeMetas() map[string]string {
|
func (repo *Repository) ComposeMetas() map[string]string {
|
||||||
if repo.ExternalMetas == nil {
|
if repo.RenderingMetas == nil {
|
||||||
repo.ExternalMetas = map[string]string{
|
metas := map[string]string{
|
||||||
"user": repo.MustOwner().Name,
|
"user": repo.MustOwner().Name,
|
||||||
"repo": repo.Name,
|
"repo": repo.Name,
|
||||||
"repoPath": repo.RepoPath(),
|
"repoPath": repo.RepoPath(),
|
||||||
}
|
}
|
||||||
unit, err := repo.GetUnit(UnitTypeExternalTracker)
|
|
||||||
if err != nil {
|
|
||||||
return repo.ExternalMetas
|
|
||||||
}
|
|
||||||
|
|
||||||
repo.ExternalMetas["format"] = unit.ExternalTrackerConfig().ExternalTrackerFormat
|
unit, err := repo.GetUnit(UnitTypeExternalTracker)
|
||||||
|
if err == nil {
|
||||||
|
metas["format"] = unit.ExternalTrackerConfig().ExternalTrackerFormat
|
||||||
switch unit.ExternalTrackerConfig().ExternalTrackerStyle {
|
switch unit.ExternalTrackerConfig().ExternalTrackerStyle {
|
||||||
case markup.IssueNameStyleAlphanumeric:
|
case markup.IssueNameStyleAlphanumeric:
|
||||||
repo.ExternalMetas["style"] = markup.IssueNameStyleAlphanumeric
|
metas["style"] = markup.IssueNameStyleAlphanumeric
|
||||||
default:
|
default:
|
||||||
repo.ExternalMetas["style"] = markup.IssueNameStyleNumeric
|
metas["style"] = markup.IssueNameStyleNumeric
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if repo.Owner.IsOrganization() {
|
||||||
|
teams := make([]string, 0, 5)
|
||||||
|
_ = x.Table("team_repo").
|
||||||
|
Join("INNER", "team", "team.id = team_repo.team_id").
|
||||||
|
Where("team_repo.repo_id = ?", repo.ID).
|
||||||
|
Select("team.lower_name").
|
||||||
|
OrderBy("team.lower_name").
|
||||||
|
Find(&teams)
|
||||||
|
metas["teams"] = "," + strings.Join(teams, ",") + ","
|
||||||
|
metas["org"] = repo.Owner.LowerName
|
||||||
}
|
}
|
||||||
return repo.ExternalMetas
|
|
||||||
|
repo.RenderingMetas = metas
|
||||||
|
}
|
||||||
|
return repo.RenderingMetas
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteWiki removes the actual and local copy of repository wiki.
|
// DeleteWiki removes the actual and local copy of repository wiki.
|
||||||
|
|
|
@ -17,7 +17,9 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRepo(t *testing.T) {
|
func TestMetas(t *testing.T) {
|
||||||
|
assert.NoError(t, PrepareTestDatabase())
|
||||||
|
|
||||||
repo := &Repository{Name: "testRepo"}
|
repo := &Repository{Name: "testRepo"}
|
||||||
repo.Owner = &User{Name: "testOwner"}
|
repo.Owner = &User{Name: "testOwner"}
|
||||||
|
|
||||||
|
@ -36,7 +38,7 @@ func TestRepo(t *testing.T) {
|
||||||
|
|
||||||
testSuccess := func(expectedStyle string) {
|
testSuccess := func(expectedStyle string) {
|
||||||
repo.Units = []*RepoUnit{&externalTracker}
|
repo.Units = []*RepoUnit{&externalTracker}
|
||||||
repo.ExternalMetas = nil
|
repo.RenderingMetas = nil
|
||||||
metas := repo.ComposeMetas()
|
metas := repo.ComposeMetas()
|
||||||
assert.Equal(t, expectedStyle, metas["style"])
|
assert.Equal(t, expectedStyle, metas["style"])
|
||||||
assert.Equal(t, "testRepo", metas["repo"])
|
assert.Equal(t, "testRepo", metas["repo"])
|
||||||
|
@ -51,6 +53,15 @@ func TestRepo(t *testing.T) {
|
||||||
|
|
||||||
externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleNumeric
|
externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleNumeric
|
||||||
testSuccess(markup.IssueNameStyleNumeric)
|
testSuccess(markup.IssueNameStyleNumeric)
|
||||||
|
|
||||||
|
repo, err := GetRepositoryByID(3)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
metas = repo.ComposeMetas()
|
||||||
|
assert.Contains(t, metas, "org")
|
||||||
|
assert.Contains(t, metas, "teams")
|
||||||
|
assert.Equal(t, metas["org"], "user3")
|
||||||
|
assert.Equal(t, metas["teams"], ",owners,team1,")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetRepositoryCount(t *testing.T) {
|
func TestGetRepositoryCount(t *testing.T) {
|
||||||
|
|
|
@ -432,14 +432,20 @@ func replaceContentList(node *html.Node, i, j int, newNodes []*html.Node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mentionProcessor(_ *postProcessCtx, node *html.Node) {
|
func mentionProcessor(ctx *postProcessCtx, node *html.Node) {
|
||||||
// We replace only the first mention; other mentions will be addressed later
|
// We replace only the first mention; other mentions will be addressed later
|
||||||
found, loc := references.FindFirstMentionBytes([]byte(node.Data))
|
found, loc := references.FindFirstMentionBytes([]byte(node.Data))
|
||||||
if !found {
|
if !found {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mention := node.Data[loc.Start:loc.End]
|
mention := node.Data[loc.Start:loc.End]
|
||||||
|
var teams string
|
||||||
|
teams, ok := ctx.metas["teams"]
|
||||||
|
if ok && strings.Contains(teams, ","+strings.ToLower(mention[1:])+",") {
|
||||||
|
replaceContent(node, loc.Start, loc.End, createLink(util.URLJoin(setting.AppURL, "org", ctx.metas["org"], "teams", mention[1:]), mention, "mention"))
|
||||||
|
} else {
|
||||||
replaceContent(node, loc.Start, loc.End, createLink(util.URLJoin(setting.AppURL, mention[1:]), mention, "mention"))
|
replaceContent(node, loc.Start, loc.End, createLink(util.URLJoin(setting.AppURL, mention[1:]), mention, "mention"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func shortLinkProcessor(ctx *postProcessCtx, node *html.Node) {
|
func shortLinkProcessor(ctx *postProcessCtx, node *html.Node) {
|
||||||
|
|
Loading…
Reference in a new issue