@@ -11,6 +11,7 @@ import (
1111 "net/http"
1212 "net/url"
1313 "strings"
14+ "time"
1415
1516 "code.gitea.io/gitea/modules/log"
1617 "code.gitea.io/gitea/modules/migrations/base"
@@ -73,6 +74,7 @@ type GithubDownloaderV3 struct {
7374 repoName string
7475 userName string
7576 password string
77+ rate * github.Rate
7678}
7779
7880// NewGithubDownloaderV3 creates a github Downloader via github v3 API
@@ -107,12 +109,39 @@ func NewGithubDownloaderV3(userName, password, repoOwner, repoName string) *Gith
107109 return & downloader
108110}
109111
112+ // SetContext set context
113+ func (g * GithubDownloaderV3 ) SetContext (ctx context.Context ) {
114+ g .ctx = ctx
115+ }
116+
117+ func (g * GithubDownloaderV3 ) sleep () {
118+ for g .rate != nil && g .rate .Remaining <= 0 {
119+ timer := time .NewTimer (time .Until (g .rate .Reset .Time ))
120+ select {
121+ case <- g .ctx .Done ():
122+ timer .Stop ()
123+ return
124+ case <- timer .C :
125+ }
126+
127+ rates , _ , err := g .client .RateLimits (g .ctx )
128+ if err != nil {
129+ log .Error ("g.client.RateLimits: %s" , err )
130+ }
131+
132+ g .rate = rates .GetCore ()
133+ }
134+ }
135+
110136// GetRepoInfo returns a repository information
111137func (g * GithubDownloaderV3 ) GetRepoInfo () (* base.Repository , error ) {
112- gr , _ , err := g .client .Repositories .Get (g .ctx , g .repoOwner , g .repoName )
138+ g .sleep ()
139+ gr , resp , err := g .client .Repositories .Get (g .ctx , g .repoOwner , g .repoName )
113140 if err != nil {
114141 return nil , err
115142 }
143+ g .rate = & resp .Rate
144+
116145 // convert github repo to stand Repo
117146 return & base.Repository {
118147 Owner : g .repoOwner ,
@@ -126,16 +155,22 @@ func (g *GithubDownloaderV3) GetRepoInfo() (*base.Repository, error) {
126155
127156// GetTopics return github topics
128157func (g * GithubDownloaderV3 ) GetTopics () ([]string , error ) {
129- r , _ , err := g .client .Repositories .Get (g .ctx , g .repoOwner , g .repoName )
130- return r .Topics , err
158+ g .sleep ()
159+ r , resp , err := g .client .Repositories .Get (g .ctx , g .repoOwner , g .repoName )
160+ if err != nil {
161+ return nil , err
162+ }
163+ g .rate = & resp .Rate
164+ return r .Topics , nil
131165}
132166
133167// GetMilestones returns milestones
134168func (g * GithubDownloaderV3 ) GetMilestones () ([]* base.Milestone , error ) {
135169 var perPage = 100
136170 var milestones = make ([]* base.Milestone , 0 , perPage )
137171 for i := 1 ; ; i ++ {
138- ms , _ , err := g .client .Issues .ListMilestones (g .ctx , g .repoOwner , g .repoName ,
172+ g .sleep ()
173+ ms , resp , err := g .client .Issues .ListMilestones (g .ctx , g .repoOwner , g .repoName ,
139174 & github.MilestoneListOptions {
140175 State : "all" ,
141176 ListOptions : github.ListOptions {
@@ -145,6 +180,7 @@ func (g *GithubDownloaderV3) GetMilestones() ([]*base.Milestone, error) {
145180 if err != nil {
146181 return nil , err
147182 }
183+ g .rate = & resp .Rate
148184
149185 for _ , m := range ms {
150186 var desc string
@@ -189,14 +225,16 @@ func (g *GithubDownloaderV3) GetLabels() ([]*base.Label, error) {
189225 var perPage = 100
190226 var labels = make ([]* base.Label , 0 , perPage )
191227 for i := 1 ; ; i ++ {
192- ls , _ , err := g .client .Issues .ListLabels (g .ctx , g .repoOwner , g .repoName ,
228+ g .sleep ()
229+ ls , resp , err := g .client .Issues .ListLabels (g .ctx , g .repoOwner , g .repoName ,
193230 & github.ListOptions {
194231 Page : i ,
195232 PerPage : perPage ,
196233 })
197234 if err != nil {
198235 return nil , err
199236 }
237+ g .rate = & resp .Rate
200238
201239 for _ , label := range ls {
202240 labels = append (labels , convertGithubLabel (label ))
@@ -260,14 +298,16 @@ func (g *GithubDownloaderV3) GetReleases() ([]*base.Release, error) {
260298 var perPage = 100
261299 var releases = make ([]* base.Release , 0 , perPage )
262300 for i := 1 ; ; i ++ {
263- ls , _ , err := g .client .Repositories .ListReleases (g .ctx , g .repoOwner , g .repoName ,
301+ g .sleep ()
302+ ls , resp , err := g .client .Repositories .ListReleases (g .ctx , g .repoOwner , g .repoName ,
264303 & github.ListOptions {
265304 Page : i ,
266305 PerPage : perPage ,
267306 })
268307 if err != nil {
269308 return nil , err
270309 }
310+ g .rate = & resp .Rate
271311
272312 for _ , release := range ls {
273313 releases = append (releases , g .convertGithubRelease (release ))
@@ -304,11 +344,12 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool,
304344 }
305345
306346 var allIssues = make ([]* base.Issue , 0 , perPage )
307-
308- issues , _ , err := g .client .Issues .ListByRepo (g .ctx , g .repoOwner , g .repoName , opt )
347+ g . sleep ()
348+ issues , resp , err := g .client .Issues .ListByRepo (g .ctx , g .repoOwner , g .repoName , opt )
309349 if err != nil {
310350 return nil , false , fmt .Errorf ("error while listing repos: %v" , err )
311351 }
352+ g .rate = & resp .Rate
312353 for _ , issue := range issues {
313354 if issue .IsPullRequest () {
314355 continue
@@ -365,10 +406,12 @@ func (g *GithubDownloaderV3) GetComments(issueNumber int64) ([]*base.Comment, er
365406 },
366407 }
367408 for {
409+ g .sleep ()
368410 comments , resp , err := g .client .Issues .ListComments (g .ctx , g .repoOwner , g .repoName , int (issueNumber ), opt )
369411 if err != nil {
370412 return nil , fmt .Errorf ("error while listing repos: %v" , err )
371413 }
414+ g .rate = & resp .Rate
372415 for _ , comment := range comments {
373416 var email string
374417 if comment .User .Email != nil {
@@ -408,11 +451,12 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
408451 },
409452 }
410453 var allPRs = make ([]* base.PullRequest , 0 , perPage )
411-
412- prs , _ , err := g .client .PullRequests .List (g .ctx , g .repoOwner , g .repoName , opt )
454+ g . sleep ()
455+ prs , resp , err := g .client .PullRequests .List (g .ctx , g .repoOwner , g .repoName , opt )
413456 if err != nil {
414457 return nil , fmt .Errorf ("error while listing repos: %v" , err )
415458 }
459+ g .rate = & resp .Rate
416460 for _ , pr := range prs {
417461 var body string
418462 if pr .Body != nil {
0 commit comments