|
9 | 9 | "fmt"
|
10 | 10 |
|
11 | 11 | "code.gitea.io/gitea/models/db"
|
| 12 | + project_model "code.gitea.io/gitea/models/project" |
12 | 13 | repo_model "code.gitea.io/gitea/models/repo"
|
13 | 14 | user_model "code.gitea.io/gitea/models/user"
|
14 | 15 | "code.gitea.io/gitea/modules/container"
|
@@ -222,6 +223,46 @@ func (issues IssueList) loadMilestones(ctx context.Context) error {
|
222 | 223 | return nil
|
223 | 224 | }
|
224 | 225 |
|
| 226 | +func (issues IssueList) getProjectIDs() []int64 { |
| 227 | + ids := make(map[int64]struct{}, len(issues)) |
| 228 | + for _, issue := range issues { |
| 229 | + projectID := issue.ProjectID() |
| 230 | + if _, ok := ids[projectID]; !ok { |
| 231 | + ids[projectID] = struct{}{} |
| 232 | + } |
| 233 | + } |
| 234 | + return container.KeysInt64(ids) |
| 235 | +} |
| 236 | + |
| 237 | +func (issues IssueList) loadProjects(ctx context.Context) error { |
| 238 | + projectIDs := issues.getProjectIDs() |
| 239 | + if len(projectIDs) == 0 { |
| 240 | + return nil |
| 241 | + } |
| 242 | + |
| 243 | + projectMaps := make(map[int64]*project_model.Project, len(projectIDs)) |
| 244 | + left := len(projectIDs) |
| 245 | + for left > 0 { |
| 246 | + limit := db.DefaultMaxInSize |
| 247 | + if left < limit { |
| 248 | + limit = left |
| 249 | + } |
| 250 | + err := db.GetEngine(ctx). |
| 251 | + In("id", projectIDs[:limit]). |
| 252 | + Find(&projectMaps) |
| 253 | + if err != nil { |
| 254 | + return err |
| 255 | + } |
| 256 | + left -= limit |
| 257 | + projectIDs = projectIDs[limit:] |
| 258 | + } |
| 259 | + |
| 260 | + for _, issue := range issues { |
| 261 | + issue.Project = projectMaps[issue.ProjectID()] |
| 262 | + } |
| 263 | + return nil |
| 264 | +} |
| 265 | + |
225 | 266 | func (issues IssueList) loadAssignees(ctx context.Context) error {
|
226 | 267 | if len(issues) == 0 {
|
227 | 268 | return nil
|
@@ -495,6 +536,10 @@ func (issues IssueList) loadAttributes(ctx context.Context) error {
|
495 | 536 | return fmt.Errorf("issue.loadAttributes: loadMilestones: %v", err)
|
496 | 537 | }
|
497 | 538 |
|
| 539 | + if err := issues.loadProjects(ctx); err != nil { |
| 540 | + return fmt.Errorf("issue.loadAttributes: loadProjects: %v", err) |
| 541 | + } |
| 542 | + |
498 | 543 | if err := issues.loadAssignees(ctx); err != nil {
|
499 | 544 | return fmt.Errorf("issue.loadAttributes: loadAssignees: %v", err)
|
500 | 545 | }
|
|
0 commit comments