Skip to content

Commit 6ed50c6

Browse files
committed
Prefetch metadata in parallel
1 parent a7d0617 commit 6ed50c6

File tree

1 file changed

+47
-22
lines changed

1 file changed

+47
-22
lines changed

api/queries_repo.go

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -469,41 +469,66 @@ type RepoMetadataInput struct {
469469
// RepoMetadata pre-fetches the metadata for attaching to issues and pull requests
470470
func RepoMetadata(client *Client, repo ghrepo.Interface, input RepoMetadataInput) (*RepoMetadataResult, error) {
471471
result := RepoMetadataResult{}
472+
errc := make(chan error)
473+
count := 0
472474

473475
if input.Assignees {
474-
users, err := RepoAssignableUsers(client, repo)
475-
if err != nil {
476-
return nil, fmt.Errorf("error fetching assignees: %w", err)
477-
}
478-
result.AssignableUsers = users
476+
count++
477+
go func() {
478+
users, err := RepoAssignableUsers(client, repo)
479+
if err != nil {
480+
err = fmt.Errorf("error fetching assignees: %w", err)
481+
}
482+
result.AssignableUsers = users
483+
errc <- err
484+
}()
479485
}
480486
if input.Reviewers {
481487
// TODO
482488
}
483489
if input.Labels {
484-
labels, err := RepoLabels(client, repo)
485-
if err != nil {
486-
return nil, fmt.Errorf("error fetching labels: %w", err)
487-
}
488-
result.Labels = labels
490+
count++
491+
go func() {
492+
labels, err := RepoLabels(client, repo)
493+
if err != nil {
494+
err = fmt.Errorf("error fetching labels: %w", err)
495+
}
496+
result.Labels = labels
497+
errc <- err
498+
}()
489499
}
490500
if input.Projects {
491-
// TODO: org-level projects
492-
projects, err := RepoProjects(client, repo)
493-
if err != nil {
494-
return nil, fmt.Errorf("error fetching projects: %w", err)
495-
}
496-
result.Projects = projects
501+
count++
502+
go func() {
503+
// TODO: org-level projects
504+
projects, err := RepoProjects(client, repo)
505+
if err != nil {
506+
err = fmt.Errorf("error fetching projects: %w", err)
507+
}
508+
result.Projects = projects
509+
errc <- err
510+
}()
511+
}
512+
if input.Milestones {
513+
count++
514+
go func() {
515+
milestones, err := RepoMilestones(client, repo)
516+
if err != nil {
517+
err = fmt.Errorf("error fetching milestones: %w", err)
518+
}
519+
result.Milestones = milestones
520+
errc <- err
521+
}()
497522
}
498-
if input.Assignees {
499-
milestones, err := RepoMilestones(client, repo)
500-
if err != nil {
501-
return nil, fmt.Errorf("error fetching milestones: %w", err)
523+
524+
var err error
525+
for i := 0; i < count; i++ {
526+
if e := <-errc; e != nil {
527+
err = e
502528
}
503-
result.Milestones = milestones
504529
}
505530

506-
return &result, nil
531+
return &result, err
507532
}
508533

509534
type RepoProject struct {

0 commit comments

Comments
 (0)