Fix team links in HTML rendering (#9127)

* Fix team links in HTML rendering

* Fix check and lint
This commit is contained in:
guillep2k 2019-11-24 13:34:44 -03:00 committed by techknowlogick
parent 7523314ef8
commit f25fd5c8eb
3 changed files with 46 additions and 17 deletions

View file

@ -173,8 +173,8 @@ 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"`
ForkID int64 `xorm:"INDEX"` ForkID int64 `xorm:"INDEX"`
@ -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) unit, err := repo.GetUnit(UnitTypeExternalTracker)
if err != nil { if err == nil {
return repo.ExternalMetas metas["format"] = unit.ExternalTrackerConfig().ExternalTrackerFormat
switch unit.ExternalTrackerConfig().ExternalTrackerStyle {
case markup.IssueNameStyleAlphanumeric:
metas["style"] = markup.IssueNameStyleAlphanumeric
default:
metas["style"] = markup.IssueNameStyleNumeric
}
} }
repo.ExternalMetas["format"] = unit.ExternalTrackerConfig().ExternalTrackerFormat if repo.Owner.IsOrganization() {
switch unit.ExternalTrackerConfig().ExternalTrackerStyle { teams := make([]string, 0, 5)
case markup.IssueNameStyleAlphanumeric: _ = x.Table("team_repo").
repo.ExternalMetas["style"] = markup.IssueNameStyleAlphanumeric Join("INNER", "team", "team.id = team_repo.team_id").
default: Where("team_repo.repo_id = ?", repo.ID).
repo.ExternalMetas["style"] = markup.IssueNameStyleNumeric Select("team.lower_name").
OrderBy("team.lower_name").
Find(&teams)
metas["teams"] = "," + strings.Join(teams, ",") + ","
metas["org"] = repo.Owner.LowerName
} }
repo.RenderingMetas = metas
} }
return repo.ExternalMetas return repo.RenderingMetas
} }
// DeleteWiki removes the actual and local copy of repository wiki. // DeleteWiki removes the actual and local copy of repository wiki.

View file

@ -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) {

View file

@ -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]
replaceContent(node, loc.Start, loc.End, createLink(util.URLJoin(setting.AppURL, mention[1:]), mention, "mention")) 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"))
}
} }
func shortLinkProcessor(ctx *postProcessCtx, node *html.Node) { func shortLinkProcessor(ctx *postProcessCtx, node *html.Node) {