mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix team links in HTML rendering (#9127)
* Fix team links in HTML rendering * Fix check and lint
This commit is contained in:
		
				
					committed by
					
						
						techknowlogick
					
				
			
			
				
	
			
			
			
						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) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user