]> source.dussan.org Git - gitea.git/commitdiff
Fix team links in HTML rendering (#9127)
authorguillep2k <18600385+guillep2k@users.noreply.github.com>
Sun, 24 Nov 2019 16:34:44 +0000 (13:34 -0300)
committertechknowlogick <techknowlogick@gitea.io>
Sun, 24 Nov 2019 16:34:44 +0000 (11:34 -0500)
* Fix team links in HTML rendering

* Fix check and lint

models/repo.go
models/repo_test.go
modules/markup/html.go

index eecc36377b354652cc20e723197ff48827231a3e..1f544f1e8c7d9887cb2104f50862bcf1204389bf 100644 (file)
@@ -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.
index 72a2959eb7eee8baaf1792a72f10e78a52496fb3..7a2227c82023fe57c9da0216abfdf16d1fd73624 100644 (file)
@@ -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) {
index 924d0089a5545c9ebbf28d0d3dc01f9a28ca114a..e5a475aff80580dff8b491cbc901c5768b3d0e25 100644 (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
        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) {