2021-01-21 22:33:58 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2021-11-16 18:25:33 +03:00
package migration
2021-01-21 22:33:58 +03:00
import (
"context"
"time"
)
var (
_ Downloader = & RetryDownloader { }
)
// RetryDownloader retry the downloads
type RetryDownloader struct {
Downloader
ctx context . Context
RetryTimes int // the total execute times
RetryDelay int // time to delay seconds
}
// NewRetryDownloader creates a retry downloader
func NewRetryDownloader ( ctx context . Context , downloader Downloader , retryTimes , retryDelay int ) * RetryDownloader {
return & RetryDownloader {
Downloader : downloader ,
ctx : ctx ,
RetryTimes : retryTimes ,
RetryDelay : retryDelay ,
}
}
2021-06-13 17:59:19 +03:00
func ( d * RetryDownloader ) retry ( work func ( ) error ) error {
2021-01-21 22:33:58 +03:00
var (
times = d . RetryTimes
err error
)
for ; times > 0 ; times -- {
2021-06-13 17:59:19 +03:00
if err = work ( ) ; err == nil {
return nil
2021-01-21 22:33:58 +03:00
}
if IsErrNotSupported ( err ) {
2021-06-13 17:59:19 +03:00
return err
2021-01-21 22:33:58 +03:00
}
select {
case <- d . ctx . Done ( ) :
2021-06-13 17:59:19 +03:00
return d . ctx . Err ( )
2021-01-21 22:33:58 +03:00
case <- time . After ( time . Second * time . Duration ( d . RetryDelay ) ) :
}
}
2021-06-13 17:59:19 +03:00
return err
}
// SetContext set context
func ( d * RetryDownloader ) SetContext ( ctx context . Context ) {
d . ctx = ctx
d . Downloader . SetContext ( ctx )
}
// GetRepoInfo returns a repository information with retry
func ( d * RetryDownloader ) GetRepoInfo ( ) ( * Repository , error ) {
var (
repo * Repository
err error
)
err = d . retry ( func ( ) error {
repo , err = d . Downloader . GetRepoInfo ( )
return err
} )
return repo , err
2021-01-21 22:33:58 +03:00
}
// GetTopics returns a repository's topics with retry
func ( d * RetryDownloader ) GetTopics ( ) ( [ ] string , error ) {
var (
topics [ ] string
err error
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
topics , err = d . Downloader . GetTopics ( )
return err
} )
return topics , err
2021-01-21 22:33:58 +03:00
}
// GetMilestones returns a repository's milestones with retry
func ( d * RetryDownloader ) GetMilestones ( ) ( [ ] * Milestone , error ) {
var (
milestones [ ] * Milestone
err error
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
milestones , err = d . Downloader . GetMilestones ( )
return err
} )
return milestones , err
2021-01-21 22:33:58 +03:00
}
// GetReleases returns a repository's releases with retry
func ( d * RetryDownloader ) GetReleases ( ) ( [ ] * Release , error ) {
var (
releases [ ] * Release
err error
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
releases , err = d . Downloader . GetReleases ( )
return err
} )
return releases , err
2021-01-21 22:33:58 +03:00
}
// GetLabels returns a repository's labels with retry
func ( d * RetryDownloader ) GetLabels ( ) ( [ ] * Label , error ) {
var (
labels [ ] * Label
err error
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
labels , err = d . Downloader . GetLabels ( )
return err
} )
return labels , err
2021-01-21 22:33:58 +03:00
}
// GetIssues returns a repository's issues with retry
func ( d * RetryDownloader ) GetIssues ( page , perPage int ) ( [ ] * Issue , bool , error ) {
var (
issues [ ] * Issue
isEnd bool
err error
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
issues , isEnd , err = d . Downloader . GetIssues ( page , perPage )
return err
} )
return issues , isEnd , err
2021-01-21 22:33:58 +03:00
}
// GetComments returns a repository's comments with retry
2021-06-30 10:23:49 +03:00
func ( d * RetryDownloader ) GetComments ( opts GetCommentOptions ) ( [ ] * Comment , bool , error ) {
2021-01-21 22:33:58 +03:00
var (
comments [ ] * Comment
2021-06-30 10:23:49 +03:00
isEnd bool
2021-01-21 22:33:58 +03:00
err error
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
2021-06-30 10:23:49 +03:00
comments , isEnd , err = d . Downloader . GetComments ( opts )
2021-06-13 17:59:19 +03:00
return err
} )
2021-06-30 10:23:49 +03:00
return comments , isEnd , err
2021-01-21 22:33:58 +03:00
}
// GetPullRequests returns a repository's pull requests with retry
func ( d * RetryDownloader ) GetPullRequests ( page , perPage int ) ( [ ] * PullRequest , bool , error ) {
var (
prs [ ] * PullRequest
err error
isEnd bool
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
prs , isEnd , err = d . Downloader . GetPullRequests ( page , perPage )
return err
} )
return prs , isEnd , err
2021-01-21 22:33:58 +03:00
}
// GetReviews returns pull requests reviews
2021-08-22 01:47:45 +03:00
func ( d * RetryDownloader ) GetReviews ( pullRequestContext IssueContext ) ( [ ] * Review , error ) {
2021-01-21 22:33:58 +03:00
var (
reviews [ ] * Review
err error
)
2021-06-13 17:59:19 +03:00
err = d . retry ( func ( ) error {
2021-08-22 01:47:45 +03:00
reviews , err = d . Downloader . GetReviews ( pullRequestContext )
2021-06-13 17:59:19 +03:00
return err
} )
return reviews , err
2021-01-21 22:33:58 +03:00
}