|
4 | 4 |
|
5 | 5 | package models
|
6 | 6 |
|
7 |
| -import ( |
8 |
| - "fmt" |
9 |
| - |
10 |
| - "code.gitea.io/gitea/modules/log" |
11 |
| -) |
| 7 | +import "fmt" |
12 | 8 |
|
13 | 9 | // AccessMode specifies the users access mode
|
14 | 10 | type AccessMode int
|
@@ -103,26 +99,39 @@ func HasAccess(user *User, repo *Repository, testMode AccessMode) (bool, error)
|
103 | 99 | // GetRepositoryAccesses finds all repositories with their access mode where a user has access but does not own.
|
104 | 100 | func (user *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) {
|
105 | 101 | accesses := make([]*Access, 0, 10)
|
106 |
| - if err := x.Find(&accesses, &Access{UserID: user.ID}); err != nil { |
| 102 | + type RepoAccess struct { |
| 103 | + Access `xorm:"extends"` |
| 104 | + Repository `xorm:"extends"` |
| 105 | + } |
| 106 | + |
| 107 | + rows, err := x. |
| 108 | + Join("INNER", "repository", "respository.id = access.repo_id"). |
| 109 | + Where("access.user_id = ?", user.ID). |
| 110 | + And("repository.owner_id <> ?", user.ID). |
| 111 | + Rows(new(RepoAccess)) |
| 112 | + if err != nil { |
107 | 113 | return nil, err
|
108 | 114 | }
|
| 115 | + defer rows.Close() |
109 | 116 |
|
110 |
| - repos := make(map[*Repository]AccessMode, len(accesses)) |
111 |
| - for _, access := range accesses { |
112 |
| - repo, err := GetRepositoryByID(access.RepoID) |
| 117 | + var repos = make(map[*Repository]AccessMode, len(accesses)) |
| 118 | + var ownerCache = make(map[int64]*User, len(accesses)) |
| 119 | + for rows.Next() { |
| 120 | + var repo RepoAccess |
| 121 | + err = rows.Scan(&repo) |
113 | 122 | if err != nil {
|
114 |
| - if IsErrRepoNotExist(err) { |
115 |
| - log.Error(4, "GetRepositoryByID: %v", err) |
116 |
| - continue |
117 |
| - } |
118 | 123 | return nil, err
|
119 | 124 | }
|
120 |
| - if err = repo.GetOwner(); err != nil { |
121 |
| - return nil, err |
122 |
| - } else if repo.OwnerID == user.ID { |
123 |
| - continue |
| 125 | + |
| 126 | + var ok bool |
| 127 | + if repo.Owner, ok = ownerCache[repo.OwnerID]; !ok { |
| 128 | + if err = repo.GetOwner(); err != nil { |
| 129 | + return nil, err |
| 130 | + } |
| 131 | + ownerCache[repo.OwnerID] = repo.Owner |
124 | 132 | }
|
125 |
| - repos[repo] = access.Mode |
| 133 | + |
| 134 | + repos[&repo.Repository] = repo.Access.Mode |
126 | 135 | }
|
127 | 136 | return repos, nil
|
128 | 137 | }
|
|
0 commit comments