| 80 | } |
| 81 | |
| 82 | func (g *GitHubSource) FetchTasks(cfg sync.SourceConfig) ([]sync.ExternalTask, error) { |
| 83 | owner, repo, err := splitProject(cfg.Project) |
| 84 | if err != nil { |
| 85 | return nil, err |
| 86 | } |
| 87 | |
| 88 | token, err := resolveToken(cfg.TokenEnv) |
| 89 | if err != nil { |
| 90 | return nil, err |
| 91 | } |
| 92 | |
| 93 | baseURL := cfg.BaseURL |
| 94 | if baseURL == "" { |
| 95 | baseURL = defaultBaseURL |
| 96 | } |
| 97 | |
| 98 | apiURL := fmt.Sprintf("%s/repos/%s/%s/issues", baseURL, owner, repo) |
| 99 | params := buildQueryParams(cfg.Filters) |
| 100 | |
| 101 | client := g.HTTPClient |
| 102 | if client == nil { |
| 103 | client = http.DefaultClient |
| 104 | } |
| 105 | |
| 106 | var tasks []sync.ExternalTask |
| 107 | |
| 108 | for page := 1; page <= maxPages; page++ { |
| 109 | issues, hasMore, err := fetchPage(client, apiURL, params, token, page) |
| 110 | if err != nil { |
| 111 | return nil, err |
| 112 | } |
| 113 | |
| 114 | for _, issue := range issues { |
| 115 | if issue.PullRequest != nil { |
| 116 | continue |
| 117 | } |
| 118 | tasks = append(tasks, issueToExternalTask(issue)) |
| 119 | } |
| 120 | |
| 121 | if !hasMore { |
| 122 | break |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | return tasks, nil |
| 127 | } |
| 128 | |
| 129 | // JSON response types |
| 130 | |