@@ -11,6 +11,7 @@ import (
11
11
"net/http"
12
12
"net/url"
13
13
"strings"
14
+ "time"
14
15
15
16
"code.gitea.io/gitea/modules/log"
16
17
"code.gitea.io/gitea/modules/migrations/base"
@@ -73,6 +74,7 @@ type GithubDownloaderV3 struct {
73
74
repoName string
74
75
userName string
75
76
password string
77
+ rate * github.Rate
76
78
}
77
79
78
80
// NewGithubDownloaderV3 creates a github Downloader via github v3 API
@@ -107,12 +109,39 @@ func NewGithubDownloaderV3(userName, password, repoOwner, repoName string) *Gith
107
109
return & downloader
108
110
}
109
111
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
+
110
136
// GetRepoInfo returns a repository information
111
137
func (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 )
113
140
if err != nil {
114
141
return nil , err
115
142
}
143
+ g .rate = & resp .Rate
144
+
116
145
// convert github repo to stand Repo
117
146
return & base.Repository {
118
147
Owner : g .repoOwner ,
@@ -126,16 +155,22 @@ func (g *GithubDownloaderV3) GetRepoInfo() (*base.Repository, error) {
126
155
127
156
// GetTopics return github topics
128
157
func (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
131
165
}
132
166
133
167
// GetMilestones returns milestones
134
168
func (g * GithubDownloaderV3 ) GetMilestones () ([]* base.Milestone , error ) {
135
169
var perPage = 100
136
170
var milestones = make ([]* base.Milestone , 0 , perPage )
137
171
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 ,
139
174
& github.MilestoneListOptions {
140
175
State : "all" ,
141
176
ListOptions : github.ListOptions {
@@ -145,6 +180,7 @@ func (g *GithubDownloaderV3) GetMilestones() ([]*base.Milestone, error) {
145
180
if err != nil {
146
181
return nil , err
147
182
}
183
+ g .rate = & resp .Rate
148
184
149
185
for _ , m := range ms {
150
186
var desc string
@@ -189,14 +225,16 @@ func (g *GithubDownloaderV3) GetLabels() ([]*base.Label, error) {
189
225
var perPage = 100
190
226
var labels = make ([]* base.Label , 0 , perPage )
191
227
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 ,
193
230
& github.ListOptions {
194
231
Page : i ,
195
232
PerPage : perPage ,
196
233
})
197
234
if err != nil {
198
235
return nil , err
199
236
}
237
+ g .rate = & resp .Rate
200
238
201
239
for _ , label := range ls {
202
240
labels = append (labels , convertGithubLabel (label ))
@@ -260,14 +298,16 @@ func (g *GithubDownloaderV3) GetReleases() ([]*base.Release, error) {
260
298
var perPage = 100
261
299
var releases = make ([]* base.Release , 0 , perPage )
262
300
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 ,
264
303
& github.ListOptions {
265
304
Page : i ,
266
305
PerPage : perPage ,
267
306
})
268
307
if err != nil {
269
308
return nil , err
270
309
}
310
+ g .rate = & resp .Rate
271
311
272
312
for _ , release := range ls {
273
313
releases = append (releases , g .convertGithubRelease (release ))
@@ -304,11 +344,12 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool,
304
344
}
305
345
306
346
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 )
309
349
if err != nil {
310
350
return nil , false , fmt .Errorf ("error while listing repos: %v" , err )
311
351
}
352
+ g .rate = & resp .Rate
312
353
for _ , issue := range issues {
313
354
if issue .IsPullRequest () {
314
355
continue
@@ -365,10 +406,12 @@ func (g *GithubDownloaderV3) GetComments(issueNumber int64) ([]*base.Comment, er
365
406
},
366
407
}
367
408
for {
409
+ g .sleep ()
368
410
comments , resp , err := g .client .Issues .ListComments (g .ctx , g .repoOwner , g .repoName , int (issueNumber ), opt )
369
411
if err != nil {
370
412
return nil , fmt .Errorf ("error while listing repos: %v" , err )
371
413
}
414
+ g .rate = & resp .Rate
372
415
for _ , comment := range comments {
373
416
var email string
374
417
if comment .User .Email != nil {
@@ -408,11 +451,12 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
408
451
},
409
452
}
410
453
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 )
413
456
if err != nil {
414
457
return nil , fmt .Errorf ("error while listing repos: %v" , err )
415
458
}
459
+ g .rate = & resp .Rate
416
460
for _ , pr := range prs {
417
461
var body string
418
462
if pr .Body != nil {
0 commit comments