* Fix team links in HTML rendering * Fix check and linttags/v1.21.12.1
| @@ -173,8 +173,8 @@ type Repository struct { | |||
| *Mirror `xorm:"-"` | |||
| Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"` | |||
| ExternalMetas map[string]string `xorm:"-"` | |||
| Units []*RepoUnit `xorm:"-"` | |||
| RenderingMetas map[string]string `xorm:"-"` | |||
| Units []*RepoUnit `xorm:"-"` | |||
| IsFork bool `xorm:"INDEX NOT NULL DEFAULT false"` | |||
| 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. | |||
| func (repo *Repository) ComposeMetas() map[string]string { | |||
| if repo.ExternalMetas == nil { | |||
| repo.ExternalMetas = map[string]string{ | |||
| if repo.RenderingMetas == nil { | |||
| metas := map[string]string{ | |||
| "user": repo.MustOwner().Name, | |||
| "repo": repo.Name, | |||
| "repoPath": repo.RepoPath(), | |||
| } | |||
| unit, err := repo.GetUnit(UnitTypeExternalTracker) | |||
| if err != nil { | |||
| return repo.ExternalMetas | |||
| if err == nil { | |||
| 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 | |||
| switch unit.ExternalTrackerConfig().ExternalTrackerStyle { | |||
| case markup.IssueNameStyleAlphanumeric: | |||
| repo.ExternalMetas["style"] = markup.IssueNameStyleAlphanumeric | |||
| default: | |||
| repo.ExternalMetas["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 | |||
| } | |||
| repo.RenderingMetas = metas | |||
| } | |||
| return repo.ExternalMetas | |||
| return repo.RenderingMetas | |||
| } | |||
| // DeleteWiki removes the actual and local copy of repository wiki. | |||
| @@ -17,7 +17,9 @@ import ( | |||
| "github.com/stretchr/testify/assert" | |||
| ) | |||
| func TestRepo(t *testing.T) { | |||
| func TestMetas(t *testing.T) { | |||
| assert.NoError(t, PrepareTestDatabase()) | |||
| repo := &Repository{Name: "testRepo"} | |||
| repo.Owner = &User{Name: "testOwner"} | |||
| @@ -36,7 +38,7 @@ func TestRepo(t *testing.T) { | |||
| testSuccess := func(expectedStyle string) { | |||
| repo.Units = []*RepoUnit{&externalTracker} | |||
| repo.ExternalMetas = nil | |||
| repo.RenderingMetas = nil | |||
| metas := repo.ComposeMetas() | |||
| assert.Equal(t, expectedStyle, metas["style"]) | |||
| assert.Equal(t, "testRepo", metas["repo"]) | |||
| @@ -51,6 +53,15 @@ func TestRepo(t *testing.T) { | |||
| externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = 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) { | |||
| @@ -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 | |||
| found, loc := references.FindFirstMentionBytes([]byte(node.Data)) | |||
| if !found { | |||
| return | |||
| } | |||
| 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) { | |||