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
					
				
					 3 changed files with 46 additions and 17 deletions
				
			
		|  | @ -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.
 | ||||||
|  |  | ||||||
|  | @ -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] | ||||||
| 	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) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue