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

restore.go 6.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package migrations
  5. import (
  6. "context"
  7. "fmt"
  8. "io/ioutil"
  9. "os"
  10. "path/filepath"
  11. "strconv"
  12. "code.gitea.io/gitea/modules/migrations/base"
  13. "gopkg.in/yaml.v2"
  14. )
  15. // RepositoryRestorer implements an Downloader from the local directory
  16. type RepositoryRestorer struct {
  17. base.NullDownloader
  18. ctx context.Context
  19. baseDir string
  20. repoOwner string
  21. repoName string
  22. }
  23. // NewRepositoryRestorer creates a repository restorer which could restore repository from a dumped folder
  24. func NewRepositoryRestorer(ctx context.Context, baseDir string, owner, repoName string) (*RepositoryRestorer, error) {
  25. baseDir, err := filepath.Abs(baseDir)
  26. if err != nil {
  27. return nil, err
  28. }
  29. return &RepositoryRestorer{
  30. ctx: ctx,
  31. baseDir: baseDir,
  32. repoOwner: owner,
  33. repoName: repoName,
  34. }, nil
  35. }
  36. func (r *RepositoryRestorer) commentDir() string {
  37. return filepath.Join(r.baseDir, "comments")
  38. }
  39. func (r *RepositoryRestorer) reviewDir() string {
  40. return filepath.Join(r.baseDir, "reviews")
  41. }
  42. // SetContext set context
  43. func (r *RepositoryRestorer) SetContext(ctx context.Context) {
  44. r.ctx = ctx
  45. }
  46. // GetRepoInfo returns a repository information
  47. func (r *RepositoryRestorer) GetRepoInfo() (*base.Repository, error) {
  48. p := filepath.Join(r.baseDir, "repo.yml")
  49. bs, err := ioutil.ReadFile(p)
  50. if err != nil {
  51. return nil, err
  52. }
  53. var opts = make(map[string]string)
  54. err = yaml.Unmarshal(bs, &opts)
  55. if err != nil {
  56. return nil, err
  57. }
  58. isPrivate, _ := strconv.ParseBool(opts["is_private"])
  59. return &base.Repository{
  60. Owner: r.repoOwner,
  61. Name: r.repoName,
  62. IsPrivate: isPrivate,
  63. Description: opts["description"],
  64. OriginalURL: opts["original_url"],
  65. CloneURL: opts["clone_addr"],
  66. DefaultBranch: opts["default_branch"],
  67. }, nil
  68. }
  69. // GetTopics return github topics
  70. func (r *RepositoryRestorer) GetTopics() ([]string, error) {
  71. p := filepath.Join(r.baseDir, "topic.yml")
  72. var topics = struct {
  73. Topics []string `yaml:"topics"`
  74. }{}
  75. bs, err := ioutil.ReadFile(p)
  76. if err != nil {
  77. return nil, err
  78. }
  79. err = yaml.Unmarshal(bs, &topics)
  80. if err != nil {
  81. return nil, err
  82. }
  83. return topics.Topics, nil
  84. }
  85. // GetMilestones returns milestones
  86. func (r *RepositoryRestorer) GetMilestones() ([]*base.Milestone, error) {
  87. var milestones = make([]*base.Milestone, 0, 10)
  88. p := filepath.Join(r.baseDir, "milestone.yml")
  89. _, err := os.Stat(p)
  90. if err != nil {
  91. if os.IsNotExist(err) {
  92. return nil, nil
  93. }
  94. return nil, err
  95. }
  96. bs, err := ioutil.ReadFile(p)
  97. if err != nil {
  98. return nil, err
  99. }
  100. err = yaml.Unmarshal(bs, &milestones)
  101. if err != nil {
  102. return nil, err
  103. }
  104. return milestones, nil
  105. }
  106. // GetReleases returns releases
  107. func (r *RepositoryRestorer) GetReleases() ([]*base.Release, error) {
  108. var releases = make([]*base.Release, 0, 10)
  109. p := filepath.Join(r.baseDir, "release.yml")
  110. _, err := os.Stat(p)
  111. if err != nil {
  112. if os.IsNotExist(err) {
  113. return nil, nil
  114. }
  115. return nil, err
  116. }
  117. bs, err := ioutil.ReadFile(p)
  118. if err != nil {
  119. return nil, err
  120. }
  121. err = yaml.Unmarshal(bs, &releases)
  122. if err != nil {
  123. return nil, err
  124. }
  125. for _, rel := range releases {
  126. for _, asset := range rel.Assets {
  127. *asset.DownloadURL = "file://" + filepath.Join(r.baseDir, *asset.DownloadURL)
  128. }
  129. }
  130. return releases, nil
  131. }
  132. // GetLabels returns labels
  133. func (r *RepositoryRestorer) GetLabels() ([]*base.Label, error) {
  134. var labels = make([]*base.Label, 0, 10)
  135. p := filepath.Join(r.baseDir, "label.yml")
  136. _, err := os.Stat(p)
  137. if err != nil {
  138. if os.IsNotExist(err) {
  139. return nil, nil
  140. }
  141. return nil, err
  142. }
  143. bs, err := ioutil.ReadFile(p)
  144. if err != nil {
  145. return nil, err
  146. }
  147. err = yaml.Unmarshal(bs, &labels)
  148. if err != nil {
  149. return nil, err
  150. }
  151. return labels, nil
  152. }
  153. // GetIssues returns issues according start and limit
  154. func (r *RepositoryRestorer) GetIssues(page, perPage int) ([]*base.Issue, bool, error) {
  155. var issues = make([]*base.Issue, 0, 10)
  156. p := filepath.Join(r.baseDir, "issue.yml")
  157. _, err := os.Stat(p)
  158. if err != nil {
  159. if os.IsNotExist(err) {
  160. return nil, true, nil
  161. }
  162. return nil, false, err
  163. }
  164. bs, err := ioutil.ReadFile(p)
  165. if err != nil {
  166. return nil, false, err
  167. }
  168. err = yaml.Unmarshal(bs, &issues)
  169. if err != nil {
  170. return nil, false, err
  171. }
  172. return issues, true, nil
  173. }
  174. // GetComments returns comments according issueNumber
  175. func (r *RepositoryRestorer) GetComments(issueNumber int64) ([]*base.Comment, error) {
  176. var comments = make([]*base.Comment, 0, 10)
  177. p := filepath.Join(r.commentDir(), fmt.Sprintf("%d.yml", issueNumber))
  178. _, err := os.Stat(p)
  179. if err != nil {
  180. if os.IsNotExist(err) {
  181. return nil, nil
  182. }
  183. return nil, err
  184. }
  185. bs, err := ioutil.ReadFile(p)
  186. if err != nil {
  187. return nil, err
  188. }
  189. err = yaml.Unmarshal(bs, &comments)
  190. if err != nil {
  191. return nil, err
  192. }
  193. return comments, nil
  194. }
  195. // GetPullRequests returns pull requests according page and perPage
  196. func (r *RepositoryRestorer) GetPullRequests(page, perPage int) ([]*base.PullRequest, bool, error) {
  197. var pulls = make([]*base.PullRequest, 0, 10)
  198. p := filepath.Join(r.baseDir, "pull_request.yml")
  199. _, err := os.Stat(p)
  200. if err != nil {
  201. if os.IsNotExist(err) {
  202. return nil, true, nil
  203. }
  204. return nil, false, err
  205. }
  206. bs, err := ioutil.ReadFile(p)
  207. if err != nil {
  208. return nil, false, err
  209. }
  210. err = yaml.Unmarshal(bs, &pulls)
  211. if err != nil {
  212. return nil, false, err
  213. }
  214. for _, pr := range pulls {
  215. pr.PatchURL = "file://" + filepath.Join(r.baseDir, pr.PatchURL)
  216. }
  217. return pulls, true, nil
  218. }
  219. // GetReviews returns pull requests review
  220. func (r *RepositoryRestorer) GetReviews(pullRequestNumber int64) ([]*base.Review, error) {
  221. var reviews = make([]*base.Review, 0, 10)
  222. p := filepath.Join(r.reviewDir(), fmt.Sprintf("%d.yml", pullRequestNumber))
  223. _, err := os.Stat(p)
  224. if err != nil {
  225. if os.IsNotExist(err) {
  226. return nil, nil
  227. }
  228. return nil, err
  229. }
  230. bs, err := ioutil.ReadFile(p)
  231. if err != nil {
  232. return nil, err
  233. }
  234. err = yaml.Unmarshal(bs, &reviews)
  235. if err != nil {
  236. return nil, err
  237. }
  238. return reviews, nil
  239. }