@@ -1847,30 +1847,43 @@ func (issue *Issue) ResolveMentionsByVisibility(ctx DBContext, doer *User, menti
18471847if err = issue .loadRepo (ctx .e ); err != nil {
18481848return
18491849}
1850- resolved := make (map [string ]bool , 20 )
1851- names := make ([]string , 0 , 20 )
1850+
1851+ resolved := make (map [string ]bool , 10 )
1852+ var mentionTeams []string
1853+
1854+ if err := issue .Repo .getOwner (ctx .e ); err != nil {
1855+ return nil , err
1856+ }
1857+
1858+ repoOwnerIsOrg := issue .Repo .Owner .IsOrganization ()
1859+ if repoOwnerIsOrg {
1860+ mentionTeams = make ([]string , 0 , 5 )
1861+ }
1862+
18521863resolved [doer .LowerName ] = true
18531864for _ , name := range mentions {
18541865name := strings .ToLower (name )
18551866if _ , ok := resolved [name ]; ok {
18561867continue
18571868}
1858- resolved [name ] = false
1859- names = append (names , name )
1860- }
1861-
1862- if err := issue .Repo .getOwner (ctx .e ); err != nil {
1863- return nil , err
1869+ if repoOwnerIsOrg && strings .Contains (name , "/" ) {
1870+ names := strings .Split (name , "/" )
1871+ if len (names ) < 2 || names [0 ] != issue .Repo .Owner .LowerName {
1872+ continue
1873+ }
1874+ mentionTeams = append (mentionTeams , names [1 ])
1875+ resolved [name ] = true
1876+ } else {
1877+ resolved [name ] = false
1878+ }
18641879}
18651880
1866- if issue .Repo .Owner .IsOrganization () {
1867- // Since there can be users with names that match the name of a team,
1868- // if the team exists and can read the issue, the team takes precedence.
1869- teams := make ([]* Team , 0 , len (names ))
1881+ if issue .Repo .Owner .IsOrganization () && len (mentionTeams ) > 0 {
1882+ teams := make ([]* Team , 0 , len (mentionTeams ))
18701883if err := ctx .e .
18711884Join ("INNER" , "team_repo" , "team_repo.team_id = team.id" ).
18721885Where ("team_repo.repo_id=?" , issue .Repo .ID ).
1873- In ("team.lower_name" , names ).
1886+ In ("team.lower_name" , mentionTeams ).
18741887Find (& teams ); err != nil {
18751888return nil , fmt .Errorf ("find mentioned teams: %v" , err )
18761889}
@@ -1883,7 +1896,7 @@ func (issue *Issue) ResolveMentionsByVisibility(ctx DBContext, doer *User, menti
18831896for _ , team := range teams {
18841897if team .Authorize >= AccessModeOwner {
18851898checked = append (checked , team .ID )
1886- resolved [team .LowerName ] = true
1899+ resolved [issue . Repo . Owner . LowerName + "/" + team .LowerName ] = true
18871900continue
18881901}
18891902has , err := ctx .e .Get (& TeamUnit {OrgID : issue .Repo .Owner .ID , TeamID : team .ID , Type : unittype })
@@ -1892,7 +1905,7 @@ func (issue *Issue) ResolveMentionsByVisibility(ctx DBContext, doer *User, menti
18921905}
18931906if has {
18941907checked = append (checked , team .ID )
1895- resolved [team .LowerName ] = true
1908+ resolved [issue . Repo . Owner . LowerName + "/" + team .LowerName ] = true
18961909}
18971910}
18981911if len (checked ) != 0 {
@@ -1916,24 +1929,28 @@ func (issue *Issue) ResolveMentionsByVisibility(ctx DBContext, doer *User, menti
19161929}
19171930}
19181931}
1932+ }
19191933
1920- // Remove names already in the list to avoid querying the database if pending names remain
1921- names = make ([]string , 0 , len (resolved ))
1922- for name , already := range resolved {
1923- if ! already {
1924- names = append (names , name )
1925- }
1926- }
1927- if len (names ) == 0 {
1928- return
1934+ // Remove names already in the list to avoid querying the database if pending names remain
1935+ mentionUsers := make ([]string , 0 , len (resolved ))
1936+ for name , already := range resolved {
1937+ if ! already {
1938+ mentionUsers = append (mentionUsers , name )
19291939}
19301940}
1941+ if len (mentionUsers ) == 0 {
1942+ return
1943+ }
1944+
1945+ if users == nil {
1946+ users = make ([]* User , 0 , len (mentionUsers ))
1947+ }
19311948
1932- unchecked := make ([]* User , 0 , len (names ))
1949+ unchecked := make ([]* User , 0 , len (mentionUsers ))
19331950if err := ctx .e .
19341951Where ("`user`.is_active = ?" , true ).
19351952And ("`user`.prohibit_login = ?" , false ).
1936- In ("`user`.lower_name" , names ).
1953+ In ("`user`.lower_name" , mentionUsers ).
19371954Find (& unchecked ); err != nil {
19381955return nil , fmt .Errorf ("find mentioned users: %v" , err )
19391956}
0 commit comments