You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

downloader.go 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Copyright 2018 Jonas Franz. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package base
  6. import (
  7. "time"
  8. "code.gitea.io/gitea/modules/structs"
  9. )
  10. // Downloader downloads the site repo informations
  11. type Downloader interface {
  12. GetRepoInfo() (*Repository, error)
  13. GetTopics() ([]string, error)
  14. GetMilestones() ([]*Milestone, error)
  15. GetReleases() ([]*Release, error)
  16. GetLabels() ([]*Label, error)
  17. GetIssues(page, perPage int) ([]*Issue, bool, error)
  18. GetComments(issueNumber int64) ([]*Comment, error)
  19. GetPullRequests(page, perPage int) ([]*PullRequest, error)
  20. }
  21. // DownloaderFactory defines an interface to match a downloader implementation and create a downloader
  22. type DownloaderFactory interface {
  23. Match(opts MigrateOptions) (bool, error)
  24. New(opts MigrateOptions) (Downloader, error)
  25. GitServiceType() structs.GitServiceType
  26. }
  27. // RetryDownloader retry the downloads
  28. type RetryDownloader struct {
  29. Downloader
  30. RetryTimes int // the total execute times
  31. RetryDelay int // time to delay seconds
  32. }
  33. // NewRetryDownloader creates a retry downloader
  34. func NewRetryDownloader(downloader Downloader, retryTimes, retryDelay int) *RetryDownloader {
  35. return &RetryDownloader{
  36. Downloader: downloader,
  37. RetryTimes: retryTimes,
  38. RetryDelay: retryDelay,
  39. }
  40. }
  41. // GetRepoInfo returns a repository information with retry
  42. func (d *RetryDownloader) GetRepoInfo() (*Repository, error) {
  43. var (
  44. times = d.RetryTimes
  45. repo *Repository
  46. err error
  47. )
  48. for ; times > 0; times-- {
  49. if repo, err = d.Downloader.GetRepoInfo(); err == nil {
  50. return repo, nil
  51. }
  52. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  53. }
  54. return nil, err
  55. }
  56. // GetTopics returns a repository's topics with retry
  57. func (d *RetryDownloader) GetTopics() ([]string, error) {
  58. var (
  59. times = d.RetryTimes
  60. topics []string
  61. err error
  62. )
  63. for ; times > 0; times-- {
  64. if topics, err = d.Downloader.GetTopics(); err == nil {
  65. return topics, nil
  66. }
  67. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  68. }
  69. return nil, err
  70. }
  71. // GetMilestones returns a repository's milestones with retry
  72. func (d *RetryDownloader) GetMilestones() ([]*Milestone, error) {
  73. var (
  74. times = d.RetryTimes
  75. milestones []*Milestone
  76. err error
  77. )
  78. for ; times > 0; times-- {
  79. if milestones, err = d.Downloader.GetMilestones(); err == nil {
  80. return milestones, nil
  81. }
  82. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  83. }
  84. return nil, err
  85. }
  86. // GetReleases returns a repository's releases with retry
  87. func (d *RetryDownloader) GetReleases() ([]*Release, error) {
  88. var (
  89. times = d.RetryTimes
  90. releases []*Release
  91. err error
  92. )
  93. for ; times > 0; times-- {
  94. if releases, err = d.Downloader.GetReleases(); err == nil {
  95. return releases, nil
  96. }
  97. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  98. }
  99. return nil, err
  100. }
  101. // GetLabels returns a repository's labels with retry
  102. func (d *RetryDownloader) GetLabels() ([]*Label, error) {
  103. var (
  104. times = d.RetryTimes
  105. labels []*Label
  106. err error
  107. )
  108. for ; times > 0; times-- {
  109. if labels, err = d.Downloader.GetLabels(); err == nil {
  110. return labels, nil
  111. }
  112. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  113. }
  114. return nil, err
  115. }
  116. // GetIssues returns a repository's issues with retry
  117. func (d *RetryDownloader) GetIssues(page, perPage int) ([]*Issue, bool, error) {
  118. var (
  119. times = d.RetryTimes
  120. issues []*Issue
  121. isEnd bool
  122. err error
  123. )
  124. for ; times > 0; times-- {
  125. if issues, isEnd, err = d.Downloader.GetIssues(page, perPage); err == nil {
  126. return issues, isEnd, nil
  127. }
  128. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  129. }
  130. return nil, false, err
  131. }
  132. // GetComments returns a repository's comments with retry
  133. func (d *RetryDownloader) GetComments(issueNumber int64) ([]*Comment, error) {
  134. var (
  135. times = d.RetryTimes
  136. comments []*Comment
  137. err error
  138. )
  139. for ; times > 0; times-- {
  140. if comments, err = d.Downloader.GetComments(issueNumber); err == nil {
  141. return comments, nil
  142. }
  143. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  144. }
  145. return nil, err
  146. }
  147. // GetPullRequests returns a repository's pull requests with retry
  148. func (d *RetryDownloader) GetPullRequests(page, perPage int) ([]*PullRequest, error) {
  149. var (
  150. times = d.RetryTimes
  151. prs []*PullRequest
  152. err error
  153. )
  154. for ; times > 0; times-- {
  155. if prs, err = d.Downloader.GetPullRequests(page, perPage); err == nil {
  156. return prs, nil
  157. }
  158. time.Sleep(time.Second * time.Duration(d.RetryDelay))
  159. }
  160. return nil, err
  161. }